diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3418a8b2..d0a6a2e5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -76,6 +76,7 @@ dependencies { implementation(Dependencies.UI.webkitX) implementation(Dependencies.UI.exoPlayer) implementation(Dependencies.UI.modernAndroidPreferences) + implementation(Dependencies.UI.material) // Network implementation(Dependencies.Network.okHttp) diff --git a/app/src/main/java/org/jellyfin/mobile/MainActivity.kt b/app/src/main/java/org/jellyfin/mobile/MainActivity.kt index d397471c..96cc458e 100644 --- a/app/src/main/java/org/jellyfin/mobile/MainActivity.kt +++ b/app/src/main/java/org/jellyfin/mobile/MainActivity.kt @@ -11,12 +11,10 @@ import android.os.Bundle import android.os.IBinder import android.view.OrientationEventListener import android.webkit.* -import android.widget.FrameLayout import androidx.appcompat.app.AppCompatActivity +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat -import androidx.core.view.ViewCompat -import androidx.core.view.doOnNextLayout -import androidx.core.view.updatePadding +import androidx.core.view.* import androidx.lifecycle.lifecycleScope import androidx.webkit.WebResourceErrorCompat import androidx.webkit.WebViewClientCompat @@ -50,7 +48,7 @@ class MainActivity : AppCompatActivity(), WebViewController { private val connectionHelper = ConnectionHelper(this) private val webappFunctionChannel: Channel by inject(named(WEBAPP_FUNCTION_CHANNEL)) - val rootView: FrameLayout by lazyView(R.id.root_view) + val rootView: CoordinatorLayout by lazyView(R.id.root_view) val webView: WebView by lazyView(R.id.web_view) var serviceBinder: RemotePlayerService.ServiceBinder? = null @@ -70,7 +68,7 @@ class MainActivity : AppCompatActivity(), WebViewController { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_webapp) + setContentView(R.layout.activity_main) // Bind player service bindService(Intent(this, RemotePlayerService::class.java), serviceConnection, Service.BIND_AUTO_CREATE) @@ -78,7 +76,9 @@ class MainActivity : AppCompatActivity(), WebViewController { // Handle window insets setStableLayoutFlags() ViewCompat.setOnApplyWindowInsetsListener(rootView) { v, insets -> - v.updatePadding(top = insets.systemWindowInsetTop, bottom = insets.systemWindowInsetBottom) + val layoutParams = webView.layoutParams as CoordinatorLayout.LayoutParams + layoutParams.updateMargins(top = insets.systemWindowInsetTop, bottom = insets.systemWindowInsetBottom) + insets } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { diff --git a/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt b/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt index e1a365b3..56677a47 100644 --- a/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt +++ b/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt @@ -13,11 +13,13 @@ import android.provider.Settings import android.provider.Settings.System.ACCELEROMETER_ROTATION import androidx.appcompat.app.AppCompatActivity import androidx.core.content.getSystemService +import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeout import org.jellyfin.mobile.BuildConfig import org.jellyfin.mobile.MainActivity import org.jellyfin.mobile.R +import timber.log.Timber import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -25,21 +27,22 @@ fun MainActivity.requestNoBatteryOptimizations() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val powerManager: PowerManager = getSystemService(AppCompatActivity.POWER_SERVICE) as PowerManager if (!appPreferences.ignoreBatteryOptimizations && !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)) { - val builder: AlertDialog.Builder = AlertDialog.Builder(this) - builder.setTitle(getString(R.string.battery_optimizations_title)) - builder.setMessage(getString(R.string.battery_optimizations_message)) - builder.setNegativeButton(android.R.string.cancel) { _, _ -> - appPreferences.ignoreBatteryOptimizations = true - } - builder.setPositiveButton(android.R.string.ok) { _, _ -> - try { - val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) - startActivity(intent) - } catch (e: Exception) { - e.printStackTrace() + Snackbar.make(rootView, R.string.battery_optimizations_message, Snackbar.LENGTH_INDEFINITE).apply { + // Add action + setAction(android.R.string.ok) { + try { + val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) + startActivity(intent) + } catch (e: Exception) { + Timber.e(e) + } + + // Ignore after the user interacted with the snackbar at least once + appPreferences.ignoreBatteryOptimizations = true } + + show() } - builder.show() } } } diff --git a/app/src/main/java/org/jellyfin/mobile/webapp/ConnectionHelper.kt b/app/src/main/java/org/jellyfin/mobile/webapp/ConnectionHelper.kt index e8aa1768..378294c8 100644 --- a/app/src/main/java/org/jellyfin/mobile/webapp/ConnectionHelper.kt +++ b/app/src/main/java/org/jellyfin/mobile/webapp/ConnectionHelper.kt @@ -7,9 +7,9 @@ import android.view.inputmethod.InputMethodManager import android.webkit.WebView import android.widget.Button import android.widget.EditText -import android.widget.FrameLayout import android.widget.TextView import androidx.annotation.StringRes +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.getSystemService import androidx.core.view.doOnNextLayout import androidx.core.view.isVisible @@ -42,7 +42,7 @@ class ConnectionHelper(private val activity: MainActivity) : KoinComponent { private val appPreferences: AppPreferences get() = activity.appPreferences private val jellyfin: Jellyfin by inject() private val apiClient: ApiClient get() = activity.apiClient - private val rootView: FrameLayout get() = activity.rootView + private val rootView: CoordinatorLayout get() = activity.rootView private val webView: WebView get() = activity.webView private var cachedInstanceUrl: HttpUrl? = null diff --git a/app/src/main/res/layout/activity_webapp.xml b/app/src/main/res/layout/activity_main.xml similarity index 72% rename from app/src/main/res/layout/activity_webapp.xml rename to app/src/main/res/layout/activity_main.xml index 96914a43..0a02d404 100644 --- a/app/src/main/res/layout/activity_webapp.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - - + diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 60544398..b522378a 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -28,6 +28,7 @@ object Dependencies { const val webkitX = "1.2.0" const val coil = "0.11.0" const val modernAndroidPreferences = "1.0-RC2" + const val material = "1.2.1" // Cast const val mediaRouter = "1.1.0" @@ -79,6 +80,7 @@ object Dependencies { val webkitX = androidx("webkit", Versions.webkitX) val exoPlayer = exoPlayer("ui") const val modernAndroidPreferences = "de.Maxr1998.android:modernpreferences:${Versions.modernAndroidPreferences}" + const val material = "com.google.android.material:material:${Versions.material}" } object Network {