diff --git a/app/src/main/java/com/battlelancer/seriesguide/backend/CloudSetupFragment.kt b/app/src/main/java/com/battlelancer/seriesguide/backend/CloudSetupFragment.kt index e2a9c75a0f..4f4f17c37a 100644 --- a/app/src/main/java/com/battlelancer/seriesguide/backend/CloudSetupFragment.kt +++ b/app/src/main/java/com/battlelancer/seriesguide/backend/CloudSetupFragment.kt @@ -1,5 +1,5 @@ // SPDX-License-Identifier: Apache-2.0 -// Copyright 2019-2025 Uwe Trottmann +// SPDX-FileCopyrightText: Copyright © 2019 Uwe Trottmann package com.battlelancer.seriesguide.backend @@ -21,6 +21,7 @@ import com.battlelancer.seriesguide.databinding.FragmentCloudSetupBinding import com.battlelancer.seriesguide.sync.SgSyncAdapter import com.battlelancer.seriesguide.sync.SyncProgress import com.battlelancer.seriesguide.traktapi.ConnectTraktActivity +import com.battlelancer.seriesguide.ui.SeriesGuidePreferences import com.battlelancer.seriesguide.util.Errors import com.battlelancer.seriesguide.util.ThemeUtils import com.battlelancer.seriesguide.util.safeShow @@ -253,11 +254,8 @@ class CloudSetupFragment : Fragment() { val intent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(hexagonTools.firebaseSignInProviders) - .setIsSmartLockEnabled(hexagonTools.isGoogleSignInAvailable) - // AuthUI is not compatible with edge-to-edge on Android 15 (target SDK 35), - // so opt out its activities. - // https://github.com/firebase/FirebaseUI-Android/issues/2177 - .setTheme(R.style.Theme_SeriesGuide_DayNight_OptOutEdgeToEdge) + .setCredentialManagerEnabled(hexagonTools.isGoogleSignInAvailable) + .setTheme(SeriesGuidePreferences.THEME) .setAuthMethodPickerLayout(authPickerLayout) .build() diff --git a/app/src/main/java/com/battlelancer/seriesguide/backend/HexagonTools.kt b/app/src/main/java/com/battlelancer/seriesguide/backend/HexagonTools.kt index 02ad4a5406..342c661755 100644 --- a/app/src/main/java/com/battlelancer/seriesguide/backend/HexagonTools.kt +++ b/app/src/main/java/com/battlelancer/seriesguide/backend/HexagonTools.kt @@ -1,5 +1,5 @@ // SPDX-License-Identifier: Apache-2.0 -// Copyright 2014-2025 Uwe Trottmann +// SPDX-FileCopyrightText: Copyright © 2014 Uwe Trottmann package com.battlelancer.seriesguide.backend @@ -10,7 +10,6 @@ import com.battlelancer.seriesguide.backend.CloudEndpointUtils.updateBuilder import com.battlelancer.seriesguide.backend.settings.HexagonSettings import com.battlelancer.seriesguide.jobs.NetworkJobProcessor import com.battlelancer.seriesguide.modules.ApplicationContext -import com.battlelancer.seriesguide.util.Errors import com.battlelancer.seriesguide.util.Errors.Companion.logAndReportHexagon import com.battlelancer.seriesguide.util.isRetryError import com.firebase.ui.auth.AuthUI @@ -21,7 +20,6 @@ import com.github.michaelbull.result.runCatching import com.github.michaelbull.result.throwUnless import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.tasks.Tasks import com.google.api.client.http.HttpRequestInitializer import com.google.api.client.http.HttpTransport import com.google.api.client.http.javanet.NetHttpTransport @@ -35,9 +33,7 @@ import com.uwetrottmann.seriesguide.backend.lists.Lists import com.uwetrottmann.seriesguide.backend.movies.Movies import com.uwetrottmann.seriesguide.backend.shows.Shows import com.uwetrottmann.seriesguide.backend.shows.model.SgCloudShow -import timber.log.Timber import java.io.IOException -import java.util.concurrent.ExecutionException import javax.inject.Inject import javax.inject.Singleton @@ -190,8 +186,10 @@ class HexagonTools @Inject constructor( * Make sure to check [FirebaseHttpRequestInitializer.firebaseUser] is not null (the * account might have gotten signed out). * - * @param checkSignInState If enabled, tries to silently sign in with Google. If it fails, sets - * the [HexagonSettings.setShouldValidateAccount] flag. If successful, clears the flag. + * @param checkSignInState If set, tries to retrieve the signed in user from [FirebaseAuth] (if + * [FirebaseHttpRequestInitializer.firebaseUser] is null and [isTimeForSignInStateCheck]). + * If it fails, sets the [HexagonSettings.setShouldValidateAccount] flag. + * If successful, clears the flag. */ @Synchronized private fun getHttpRequestInitializer(checkSignInState: Boolean): FirebaseHttpRequestInitializer { @@ -216,45 +214,10 @@ class HexagonTools @Inject constructor( } lastSignInCheck = SystemClock.elapsedRealtime() - var account = FirebaseAuth.getInstance().currentUser + val account = FirebaseAuth.getInstance().currentUser if (account != null) { // still signed in httpRequestInitializer.firebaseUser = account - } else { - // Try to silently sign in. This is fine as Cloud was enabled by the user - // and they reasonably expect to stay signed in. - val signInTask = AuthUI.getInstance().silentSignIn(context, firebaseSignInProviders) - try { - val authResult = Tasks.await(signInTask) - if (authResult?.user != null) { - Timber.i("%s: successful", ACTION_SILENT_SIGN_IN) - authResult.user.let { - account = it - httpRequestInitializer.firebaseUser = it - } - } else { - Errors.logAndReportHexagonAuthError( - HexagonAuthError(ACTION_SILENT_SIGN_IN, "FirebaseUser is null") - ) - } - } catch (e: Exception) { - // https://developers.google.com/android/reference/com/google/android/gms/tasks/Tasks#public-static-tresult-await-tasktresult-task - if (e is InterruptedException) { - // Do not report thread interruptions, it's expected. - Timber.w(e, ACTION_SILENT_SIGN_IN) - } else { - val cause = if (e is ExecutionException) { - e.cause ?: e // The Task failed, getCause returns the original exception. - } else { - e // Unexpected exception. - } - // Do not report sign in required errors, this is expected and handled below. - val authEx = HexagonAuthError.build(ACTION_SILENT_SIGN_IN, cause) - if (!authEx.isSignInRequiredError()) { - Errors.logAndReportHexagonAuthError(authEx) - } - } - } } val shouldFixAccount = account == null @@ -309,7 +272,6 @@ class HexagonTools @Inject constructor( } companion object { - private const val ACTION_SILENT_SIGN_IN = "silent sign-in" private val JSON_FACTORY: JsonFactory = GsonFactory() private val HTTP_TRANSPORT: HttpTransport = NetHttpTransport() private const val SIGN_IN_CHECK_INTERVAL_MS = 5 * DateUtils.MINUTE_IN_MILLIS diff --git a/app/src/main/res/values-v35/themes.xml b/app/src/main/res/values-v35/themes.xml deleted file mode 100644 index ba290d2fe4..0000000000 --- a/app/src/main/res/values-v35/themes.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f2e6b23170..76bd7313e5 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -11,16 +11,6 @@ -