Skip to content

Commit

Permalink
Merge pull request #249 from hotwired/target_sdk_33
Browse files Browse the repository at this point in the history
Update Android SDK to v33
  • Loading branch information
jayohms authored Nov 15, 2022
2 parents 4de82a2 + 8582661 commit 9ab46c6
Show file tree
Hide file tree
Showing 13 changed files with 81 additions and 71 deletions.
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:4.1.3'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21'
classpath 'com.android.tools.build:gradle:7.3.1'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20'
}
}

Expand Down
16 changes: 8 additions & 8 deletions demo/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {
compileSdkVersion 30
buildToolsVersion '30.0.3'
compileSdkVersion 33

defaultConfig {
applicationId "dev.hotwire.turbo.demo"
minSdkVersion 24
targetSdkVersion 30
targetSdkVersion 33
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
Expand Down Expand Up @@ -40,15 +39,16 @@ android {
test.java.srcDirs += 'src/test/kotlin'
debug.java.srcDirs += 'src/debug/kotlin'
}
namespace 'dev.hotwire.turbo.demo'
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.browser:browser:1.3.0'
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.browser:browser:1.4.0'
implementation 'com.github.bumptech.glide:glide:4.14.2'

implementation project(':turbo')
}
Expand Down
5 changes: 2 additions & 3 deletions demo/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
package="dev.hotwire.turbo.demo"
xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.INTERNET"/>
Expand All @@ -17,10 +16,10 @@

<activity
android:name="dev.hotwire.turbo.demo.main.MainActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@style/MyTheme.DayNight"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="adjustResize"
android:exported="true">

<intent-filter>
<action android:name="android.intent.action.MAIN"/>
Expand Down
18 changes: 11 additions & 7 deletions demo/src/main/kotlin/dev/hotwire/turbo/demo/util/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dev.hotwire.turbo.demo.util

import android.content.Context
import android.content.res.Configuration
import android.os.Build
import android.webkit.WebView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
Expand All @@ -17,15 +18,18 @@ fun Toolbar.displayBackButtonAsCloseIcon() {
navigationIcon = ContextCompat.getDrawable(context, R.drawable.ic_close)
}

@Suppress("DEPRECATION")
fun WebView.initDayNightTheme() {
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
WebSettingsCompat.setForceDarkStrategy(settings, WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY)
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
WebSettingsCompat.setForceDarkStrategy(settings, WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY)
}

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
when (isNightModeEnabled(context)) {
true -> WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_ON)
else -> WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_AUTO)
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
when (isNightModeEnabled(context)) {
true -> WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_ON)
else -> WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_AUTO)
}
}
}
}
Expand Down
1 change: 0 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,4 @@
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.enableJetifier=true
android.useAndroidX=true
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
50 changes: 25 additions & 25 deletions turbo/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,12 @@ repositories {
}

android {
compileSdkVersion 30
buildToolsVersion '30.0.3'
compileSdkVersion 33
testOptions.unitTests.includeAndroidResources = true

defaultConfig {
minSdkVersion 24
targetSdkVersion 30
targetSdkVersion 33

// Define ProGuard rules for this android library project. These rules will be applied when
// a consumer of this library sets 'minifyEnabled true'.
Expand Down Expand Up @@ -64,47 +63,48 @@ android {
test.java.srcDirs += 'src/test/kotlin'
debug.java.srcDirs += 'src/debug/kotlin'
}
namespace 'dev.hotwire.turbo'
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.4.21'
implementation 'com.google.android.material:material:1.3.0'
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.7.20'
implementation 'com.google.android.material:material:1.7.0'

// AndroidX
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

// JSON
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.google.code.gson:gson:2.10'

// Networking/API
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'

// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'

// Exported AndroidX dependencies
api 'androidx.appcompat:appcompat:1.2.0'
api 'androidx.core:core-ktx:1.3.2'
api 'androidx.webkit:webkit:1.4.0'
api 'androidx.fragment:fragment-ktx:1.3.2'
api 'androidx.navigation:navigation-fragment-ktx:2.3.5'
api 'androidx.navigation:navigation-ui-ktx:2.3.5'
api 'androidx.appcompat:appcompat:1.5.1'
api 'androidx.core:core-ktx:1.9.0'
api 'androidx.webkit:webkit:1.5.0'
api 'androidx.fragment:fragment-ktx:1.5.4'
api 'androidx.navigation:navigation-fragment-ktx:2.5.3'
api 'androidx.navigation:navigation-ui-ktx:2.5.3'

// Tests
testImplementation 'androidx.test:core:1.3.0' // Robolectric
testImplementation 'androidx.navigation:navigation-testing:2.3.5'
testImplementation 'android.arch.core:core-testing:1.1.1'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'
testImplementation 'org.assertj:assertj-core:3.19.0'
testImplementation 'org.robolectric:robolectric:4.5.1'
testImplementation 'org.mockito:mockito-core:3.8.0'
testImplementation 'androidx.test:core:1.4.0' // Robolectric
testImplementation 'androidx.navigation:navigation-testing:2.5.3'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
testImplementation 'org.assertj:assertj-core:3.23.1'
testImplementation 'org.robolectric:robolectric:4.8.1'
testImplementation 'org.mockito:mockito-core:4.8.1'
testImplementation 'com.nhaarman:mockito-kotlin:1.6.0'
testImplementation 'com.squareup.okhttp3:mockwebserver:4.9.1'
testImplementation 'com.squareup.okhttp3:mockwebserver:4.10.0'
testImplementation 'junit:junit:4.13.2'
}

Expand Down
3 changes: 1 addition & 2 deletions turbo/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="dev.hotwire.turbo">
xmlns:android="http://schemas.android.com/apk/res/android">

<application>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ class TurboPathConfiguration(context: Context) {
val properties = TurboPathConfigurationProperties()
val path = path(location)

for (rule in rules) when (rule.matches(path)) {
true -> properties.putAll(rule.properties)
for (rule in rules) {
if (rule.matches(path)) properties.putAll(rule.properties)
}

cachedProperties[location] = properties
Expand All @@ -106,23 +106,23 @@ typealias TurboPathConfigurationSettings = HashMap<String, String>
val TurboPathConfigurationProperties.presentation: TurboNavPresentation
@SuppressLint("DefaultLocale") get() = try {
val value = get("presentation") ?: "default"
TurboNavPresentation.valueOf(value.toUpperCase())
TurboNavPresentation.valueOf(value.uppercase())
} catch (e: IllegalArgumentException) {
TurboNavPresentation.DEFAULT
}

val TurboPathConfigurationProperties.queryStringPresentation: TurboNavQueryStringPresentation
@SuppressLint("DefaultLocale") get() = try {
val value = get("query_string_presentation") ?: "default"
TurboNavQueryStringPresentation.valueOf(value.toUpperCase())
TurboNavQueryStringPresentation.valueOf(value.uppercase())
} catch (e: IllegalArgumentException) {
TurboNavQueryStringPresentation.DEFAULT
}

val TurboPathConfigurationProperties.context: TurboNavPresentationContext
@SuppressLint("DefaultLocale") get() = try {
val value = get("context") ?: "default"
TurboNavPresentationContext.valueOf(value.toUpperCase())
TurboNavPresentationContext.valueOf(value.uppercase())
} catch (e: IllegalArgumentException) {
TurboNavPresentationContext.DEFAULT
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavOptions
import androidx.navigation.fragment.FragmentNavigator
import androidx.navigation.fragment.findNavController
Expand Down Expand Up @@ -90,7 +91,7 @@ internal class TurboNavigator(private val navDestination: TurboNavDestination) {

onNavigationVisit {
val controller = currentController()
controller.popBackStack(controller.graph.startDestination, false)
controller.popBackStack(controller.graph.startDestinationId, false)
onCleared()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package dev.hotwire.turbo.observers

import android.webkit.CookieManager
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.*

internal class TurboActivityObserver : LifecycleObserver {
internal class TurboActivityObserver : DefaultLifecycleObserver {
/**
* Cookies may not be persisted to storage yet, since WebView
* maintains its own internal timing to flush in-memory cookies
* to persistent storage. Ensure that cookies are maintained
* across app restarts.
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun persistWebViewCookies() {
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
persistWebViewCookies()
}

private fun persistWebViewCookies() {
CookieManager.getInstance().flush()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,33 @@ import android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
import android.view.Window
import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
import androidx.annotation.RequiresApi
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.*
import dev.hotwire.turbo.nav.TurboNavDestination
import dev.hotwire.turbo.util.animateColorTo

internal class TurboWindowThemeObserver(val destination: TurboNavDestination) : LifecycleObserver {
internal class TurboWindowThemeObserver(val destination: TurboNavDestination) : DefaultLifecycleObserver {
private val window: Window?
get() = destination.fragment.activity?.window

@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun updateSystemBarColors() {
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
updateSystemBarColors()
}

private fun updateSystemBarColors() {
val view = destination.fragment.view ?: return
val theme = view.context.theme

updateStatusBar(theme)
updateNavigationBar(theme)
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun restoreSystemBarColors() {
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
restoreSystemBarColors()
}

private fun restoreSystemBarColors() {
val activity = destination.fragment.activity ?: return
val theme = activity.theme

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ import com.google.gson.stream.JsonWriter
internal class TurboVisitActionAdapter : TypeAdapter<TurboVisitAction>() {
override fun read(reader: JsonReader): TurboVisitAction {
return try {
TurboVisitAction.valueOf(reader.nextString().toUpperCase())
TurboVisitAction.valueOf(reader.nextString().uppercase())
} catch (e: IllegalArgumentException) {
TurboVisitAction.ADVANCE
}
}

override fun write(writer: JsonWriter, action: TurboVisitAction) {
writer.value(action.name.toLowerCase())
writer.value(action.name.lowercase())
}
}

0 comments on commit 9ab46c6

Please sign in to comment.