From e8197808d40b7db6380b7d45b1c2f733a93a61c5 Mon Sep 17 00:00:00 2001 From: Kieron Quinn Date: Wed, 28 Aug 2024 00:04:06 +0100 Subject: [PATCH] 1.8 - The Date & filler date Targets are now fully handled by Smartspacer. This is required to fix an issue in Android 15 QPR1 where it is no longer possible to allow the Launcher or Lock Screen to handle the date while showing two complications below it. This also means that when the open behaviour for Expanded Smartspace is set to "always", tapping the date will now open Expanded Smartspace, where it was previously not possible. (#241) - Fixed an issue where tapping the weather on devices using the At a Glance Complication with Pixel Weather installed would not open the weather, it now opens in Pixel Weather - Tapping the weather when using the Google Weather Complication and will now open Pixel Weather when it is installed - All built in Targets & Complications that can support being added more than once are now able to be. This is useful if you want to add different requirements for specific screens (eg. lock screen). - Added an in-app option to change the app language (this is synced with the system setting on Android 13+) - Added a link to the Crowdin page in the about card --- app/build.gradle | 18 +- app/release/baselineProfiles/0/app-release.dm | Bin 12767 -> 12746 bytes app/release/baselineProfiles/1/app-release.dm | Bin 12688 -> 12682 bytes app/release/output-metadata.json | 4 +- app/src/main/AndroidManifest.xml | 9 + .../app/smartspacer/Smartspacer.kt | 5 +- .../smartspace/compat/TargetMerger.kt | 83 +++++++- .../smartspace/compat/TargetMergerRegular.kt | 6 + .../smartspace/compat/TargetMergerSplit.kt | 2 - .../compat/TargetMergerUndefined.kt | 13 -- .../smartspace/compat/TargetMergerWeather.kt | 9 - .../complications/AlarmComplication.kt | 3 +- .../complications/DefaultComplication.kt | 3 +- .../DigitalWellbeingComplication.kt | 3 +- .../GoogleWeatherComplication.kt | 8 +- .../complications/MissedCallsComplication.kt | 3 +- .../complications/SmsComplication.kt | 3 +- .../smartspace/targets/AmmNowPlayingTarget.kt | 3 +- .../smartspace/targets/AsNowPlayingTarget.kt | 3 +- .../smartspace/targets/AtAGlanceTarget.kt | 3 +- .../smartspace/targets/DateTarget.kt | 67 ++++--- .../smartspace/targets/DefaultTarget.kt | 9 +- .../targets/DigitalWellbeingTarget.kt | 3 +- .../smartspace/targets/FlashlightTarget.kt | 3 +- .../targets/GoogleWeatherForecastTarget.kt | 12 +- .../smartspace/targets/MusicTarget.kt | 3 +- .../widgets/GoogleWeatherForecastWidget.kt | 6 +- .../model/settings/SettingsItem.kt | 7 +- .../receivers/DailyUpdateAlarmReceiver.kt | 5 + .../repositories/GoogleWeatherRepository.kt | 4 +- .../repositories/SmartspaceRepository.kt | 15 +- .../service/SmartspacerSmartspaceService.kt | 6 +- ...portedSmartspaceTrampolineProxyActivity.kt | 3 + .../ui/base/settings/BaseSettingsAdapter.kt | 1 + .../request/EnhancedModeRequestFragment.kt | 8 + .../ExpandedHomeOpenModeSettingsFragment.kt | 12 -- .../ExpandedLockOpenModeSettingsFragment.kt | 12 -- .../ui/screens/settings/SettingsAdapter.kt | 1 + .../ui/screens/settings/SettingsFragment.kt | 9 + .../ui/screens/settings/SettingsViewModel.kt | 53 +++++- .../language/SettingsLanguageFragment.kt | 102 ++++++++++ .../language/SettingsLanguageViewModel.kt | 48 +++++ .../utils/extensions/Extensions+Context.kt | 29 +++ .../utils/extensions/Extensions+Intent.kt | 8 + .../utils/extensions/Extensions+Text.kt | 7 + app/src/main/res/drawable/ic_language.xml | 9 + .../main/res/layout/item_settings_about.xml | 180 +++++++++--------- .../res/layout/item_settings_radio_card.xml | 43 +++-- .../res/navigation/nav_graph_settings.xml | 8 + app/src/main/res/values-af-rZA/strings.xml | 1 - app/src/main/res/values-ar-rSA/strings.xml | 1 - app/src/main/res/values-ca-rES/strings.xml | 1 - app/src/main/res/values-cs-rCZ/strings.xml | 1 - app/src/main/res/values-da-rDK/strings.xml | 1 - app/src/main/res/values-de-rDE/strings.xml | 1 - app/src/main/res/values-el-rGR/strings.xml | 1 - app/src/main/res/values-en-rGB/strings.xml | 1 - app/src/main/res/values-en-rUS/strings.xml | 1 - app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-fi-rFI/strings.xml | 1 - app/src/main/res/values-fr-rFR/strings.xml | 7 +- app/src/main/res/values-hu-rHU/strings.xml | 1 - app/src/main/res/values-it-rIT/strings.xml | 9 +- app/src/main/res/values-iw-rIL/strings.xml | 1 - app/src/main/res/values-ja-rJP/strings.xml | 1 - app/src/main/res/values-ko-rKR/strings.xml | 1 - app/src/main/res/values-nl-rNL/strings.xml | 1 - app/src/main/res/values-no-rNO/strings.xml | 1 - app/src/main/res/values-pl-rPL/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro-rRO/strings.xml | 1 - app/src/main/res/values-ru-rRU/strings.xml | 1 - app/src/main/res/values-sr-rSP/strings.xml | 1 - app/src/main/res/values-sv-rSE/strings.xml | 1 - app/src/main/res/values-tr-rTR/strings.xml | 1 - app/src/main/res/values-uk-rUA/strings.xml | 1 - app/src/main/res/values-vi-rVN/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 6 +- build.gradle | 10 +- gradle/wrapper/gradle-wrapper.properties | 4 +- sdk-client/build.gradle | 6 +- sdk-sample/build.gradle | 6 +- systemstubs/build.gradle | 2 +- 86 files changed, 629 insertions(+), 304 deletions(-) create mode 100644 app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerRegular.kt delete mode 100644 app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerUndefined.kt delete mode 100644 app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerWeather.kt create mode 100644 app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageFragment.kt create mode 100644 app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageViewModel.kt create mode 100644 app/src/main/res/drawable/ic_language.xml diff --git a/app/build.gradle b/app/build.gradle index 70706149..a0b50356 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ plugins { apply plugin: 'com.google.android.gms.oss-licenses-plugin' -def tagName = '1.7.7' -def tagCode = 177 +def tagName = '1.8' +def tagCode = 180 android { compileSdk 34 @@ -72,16 +72,16 @@ android { dependencies { implementation 'androidx.core:core-ktx:1.13.1' implementation 'androidx.appcompat:appcompat:1.7.0' - implementation 'com.google.android.material:material:1.13.0-alpha03' + implementation 'com.google.android.material:material:1.13.0-alpha05' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation "androidx.lifecycle:lifecycle-service:2.8.3" + implementation "androidx.lifecycle:lifecycle-service:2.8.4" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation 'androidx.core:core-splashscreen:1.0.1' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - implementation "androidx.fragment:fragment-ktx:1.8.1" - implementation "androidx.activity:activity-ktx:1.9.0" - implementation "androidx.work:work-runtime-ktx:2.9.0" + implementation "androidx.fragment:fragment-ktx:1.8.2" + implementation "androidx.activity:activity-ktx:1.9.1" + implementation "androidx.work:work-runtime-ktx:2.9.1" implementation "androidx.core:core-remoteviews:1.1.0" implementation "androidx.security:security-crypto:1.1.0-alpha06" implementation project(path: ':proto') @@ -159,7 +159,7 @@ dependencies { implementation 'com.google.android.gms:play-services-oss-licenses:17.1.0' //Firebase Analytics + Crashlytics - implementation(platform("com.google.firebase:firebase-bom:33.1.1")) + implementation(platform("com.google.firebase:firebase-bom:33.2.0")) implementation("com.google.firebase:firebase-crashlytics-ktx") implementation("com.google.firebase:firebase-analytics-ktx") @@ -175,7 +175,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' androidTestImplementation 'com.google.truth:truth:1.1.3' - androidTestImplementation 'androidx.test:runner:1.6.1' + androidTestImplementation 'androidx.test:runner:1.6.2' androidTestUtil 'androidx.test:orchestrator:1.5.0' androidTestCompileOnly project(path: ':systemstubs') } \ No newline at end of file diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm index 25802d975e7c3f4f0ccc7e68890fd5d0cc0a1c5c..c516e0dbb099aab5bdcf9756b49f0cab0bffbab1 100644 GIT binary patch literal 12746 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 literal 12767 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 DE%Fz= diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm index 2bba72d24b7c17b516657d6780b1e7b753f57a01..c0909ebaa83d84323353d82757cb9de1509edba3 100644 GIT binary patch literal 12682 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 aHsN1Kf|O(tk^bpM_$$tTudl5CX#WerpVzAZ literal 12688 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 + + + + diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/Smartspacer.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/Smartspacer.kt index 6178cbca..b3529552 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/Smartspacer.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/Smartspacer.kt @@ -246,6 +246,8 @@ import com.kieronquinn.app.smartspacer.ui.screens.settings.batteryoptimisation.S import com.kieronquinn.app.smartspacer.ui.screens.settings.batteryoptimisation.SettingsBatteryOptimisationViewModelImpl import com.kieronquinn.app.smartspacer.ui.screens.settings.dump.DumpSmartspacerViewModel import com.kieronquinn.app.smartspacer.ui.screens.settings.dump.DumpSmartspacerViewModelImpl +import com.kieronquinn.app.smartspacer.ui.screens.settings.language.SettingsLanguageViewModel +import com.kieronquinn.app.smartspacer.ui.screens.settings.language.SettingsLanguageViewModelImpl import com.kieronquinn.app.smartspacer.ui.screens.settings.sensitive.SettingsHideSensitiveViewModel import com.kieronquinn.app.smartspacer.ui.screens.setup.analytics.SetupAnalyticsViewModel import com.kieronquinn.app.smartspacer.ui.screens.setup.analytics.SetupAnalyticsViewModelImpl @@ -417,7 +419,7 @@ class Smartspacer: Application(), Configuration.Provider { viewModel { GeofenceRequirementConfigurationViewModelImpl(get(), get(), get(), get()) } viewModel { GeofenceRequirementConfigurationNameViewModelImpl() } viewModel { AppPredictionRequirementConfigurationViewModelImpl(get(), get()) } - viewModel { SettingsViewModelImpl(get(), get(), get()) } + viewModel { SettingsViewModelImpl(get(), get(), get(), get()) } viewModel { SettingsHideSensitiveViewModel(get()) } viewModel { SetupLandingViewModelImpl(get()) } viewModel { SetupAnalyticsViewModelImpl(get(), get()) } @@ -523,6 +525,7 @@ class Smartspacer: Application(), Configuration.Provider { viewModel { BluetoothRequirementConfigurationViewModelImpl(get(), get(), get(), get()) } viewModel { FlashlightTargetConfigurationViewModelImpl(get(), get()) } viewModel { WidgetConfigurationViewModelImpl(get(), get(), get(), get(), get()) } + viewModel { SettingsLanguageViewModelImpl(get()) } } override fun attachBaseContext(base: Context) { diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMerger.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMerger.kt index eb50d02b..c5158367 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMerger.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMerger.kt @@ -1,7 +1,13 @@ package com.kieronquinn.app.smartspacer.components.smartspace.compat import android.content.ComponentName +import android.content.ContentUris +import android.content.Intent +import android.icu.text.DateFormat +import android.icu.text.DisplayContext import android.os.Bundle +import android.provider.CalendarContract +import com.kieronquinn.app.smartspacer.BuildConfig import com.kieronquinn.app.smartspacer.model.smartspace.Action import com.kieronquinn.app.smartspacer.model.smartspace.ActionHolder import com.kieronquinn.app.smartspacer.model.smartspace.Target @@ -18,11 +24,15 @@ import com.kieronquinn.app.smartspacer.sdk.model.SmartspaceAction.Companion.KEY_ import com.kieronquinn.app.smartspacer.sdk.model.SmartspaceAction.Companion.KEY_EXTRA_SHOW_ON_LOCKSCREEN import com.kieronquinn.app.smartspacer.sdk.model.SmartspaceTarget import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.BaseTemplateData +import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.BaseTemplateData.SubItemInfo import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.BasicTemplateData +import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.TapAction +import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.Text import com.kieronquinn.app.smartspacer.sdk.model.weather.WeatherData import com.kieronquinn.app.smartspacer.utils.extensions.cloneWithUniqneness import com.kieronquinn.app.smartspacer.utils.extensions.popOrNull import com.kieronquinn.app.smartspacer.utils.extensions.reformatBullet +import java.util.Calendar import java.util.LinkedList import java.util.UUID @@ -221,7 +231,11 @@ abstract class TargetMerger { val action = actionQueue.popOrNull() ?: break val secondAction = actionQueue.popOrNull() val page = SmartspacePageHolder( - createBlankTarget(action.action, secondAction?.action), + createBlankTarget( + action.action, + secondAction?.action, + useExpandedIntent = openMode == ExpandedOpenMode.ALWAYS + ), null, listOfNotNull(action.parent, secondAction?.parent) ) @@ -264,8 +278,6 @@ abstract class TargetMerger { return this } - protected open val blankFeatureType = SmartspaceTarget.FEATURE_WEATHER - /** * Creates a blank target, with one or two [SmartspaceAction]s. If [base] is not specified, * a blank base will be used. The launcher will surround these actions with the default @@ -274,20 +286,19 @@ abstract class TargetMerger { protected fun createBlankTarget( header: SmartspaceAction, base: SmartspaceAction?, - templateData: BasicTemplateData? = null + templateData: BasicTemplateData? = null, + useExpandedIntent: Boolean = false ): SmartspaceTarget { //Strip undocumented extras from the complication so it can't inject them into the target base?.extras?.stripUndocumentedExtras() return SmartspaceTarget( smartspaceTargetId = "${BLANK_TARGET_PREFIX}_${UUID.randomUUID()}", headerAction = header.reformatBullet(base == null), - baseAction = base ?: SmartspaceAction( - id = "", - title = "" - ), - featureType = blankFeatureType, + baseAction = base ?: createBlankHeader(useExpandedIntent), + featureType = SmartspaceTarget.FEATURE_UNDEFINED, componentName = ComponentName("package_name", "class_name"), templateData = BasicTemplateData( + primaryItem = createBlankTitle(useExpandedIntent), subtitleItem = header.subItemInfo ?: templateData?.subtitleItem ?: header.generateSubItemInfo().reformatBullet(base == null), subtitleSupplementalItem = base?.subItemInfo @@ -298,4 +309,58 @@ abstract class TargetMerger { ) } + private fun createBlankHeader(useExpandedIntent: Boolean): SmartspaceAction { + val date = DateFormat.getInstanceForSkeleton("EEEMMMd").apply { + setContext(DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) + }.format(Calendar.getInstance().time) + return SmartspaceAction( + id = "", + icon = null, + title = date, + intent = if(useExpandedIntent) { + getExpandedIntent() + }else{ + getCalendarIntent() + } + ).apply { + launchDisplayOnLockScreen = useExpandedIntent + } + } + + private fun createBlankTitle(useExpandedIntent: Boolean): SubItemInfo? { + val date = DateFormat.getInstanceForSkeleton("EEEMMMd").apply { + setContext(DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) + }.format(Calendar.getInstance().time) + val intent = if(useExpandedIntent) { + getExpandedIntent() + }else{ + getCalendarIntent() + } + return SubItemInfo( + text = Text(date), + tapAction = TapAction(intent = intent, shouldShowOnLockScreen = useExpandedIntent) + ) + } + + private fun getCalendarIntent(): Intent { + return Intent(Intent.ACTION_VIEW).apply { + data = ContentUris.appendId( + CalendarContract.CONTENT_URI.buildUpon().appendPath("time"), + System.currentTimeMillis() + ).build() + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) + } + } + + private fun getExpandedIntent(): Intent { + return Intent("com.kieronquinn.app.smartspacer.SMARTSPACE").apply { + component = ComponentName( + BuildConfig.APPLICATION_ID, + "com.kieronquinn.app.smartspacer.ui.activities.ExportedExpandedActivity" + ) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerRegular.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerRegular.kt new file mode 100644 index 00000000..ba696688 --- /dev/null +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerRegular.kt @@ -0,0 +1,6 @@ +package com.kieronquinn.app.smartspacer.components.smartspace.compat + +/** + * Regular Target merger, as [TargetMerger] + */ +object TargetMergerRegular: TargetMerger() \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerSplit.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerSplit.kt index f06d58b2..c54d78b4 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerSplit.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerSplit.kt @@ -17,8 +17,6 @@ import java.util.LinkedList */ object TargetMergerSplit: TargetMerger() { - override val blankFeatureType = SmartspaceTarget.FEATURE_UNDEFINED - override fun getSplitTargets( actions: LinkedList ): List { diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerUndefined.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerUndefined.kt deleted file mode 100644 index 74c0c543..00000000 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerUndefined.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.kieronquinn.app.smartspacer.components.smartspace.compat - -import com.kieronquinn.app.smartspacer.sdk.model.SmartspaceTarget - -/** - * Undefined merger: As [TargetMerger], using [SmartspaceTarget.FEATURE_UNDEFINED] as the empty - * target feature type, and with no split targets - */ -object TargetMergerUndefined: TargetMerger() { - - override val blankFeatureType: Int = SmartspaceTarget.FEATURE_UNDEFINED - -} \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerWeather.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerWeather.kt deleted file mode 100644 index c6ba3ce4..00000000 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/compat/TargetMergerWeather.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.kieronquinn.app.smartspacer.components.smartspace.compat - -import com.kieronquinn.app.smartspacer.sdk.model.SmartspaceTarget - -/** - * Weather merger: As [TargetMerger], using [SmartspaceTarget.FEATURE_WEATHER] as the empty target - * feature type, and with no split targets - */ -object TargetMergerWeather: TargetMerger() \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/AlarmComplication.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/AlarmComplication.kt index c025654b..dc1fe7de 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/AlarmComplication.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/AlarmComplication.kt @@ -63,7 +63,8 @@ class AlarmComplication: SmartspacerComplicationProvider() { return Config( resources.getString(R.string.complication_alarm_label), resources.getString(R.string.complication_alarm_description), - AndroidIcon.createWithResource(provideContext(), R.drawable.ic_alarm) + AndroidIcon.createWithResource(provideContext(), R.drawable.ic_alarm), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DefaultComplication.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DefaultComplication.kt index a518aa9d..6240ed03 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DefaultComplication.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DefaultComplication.kt @@ -74,7 +74,8 @@ class DefaultComplication: SmartspacerComplicationProvider() { description = resources.getText(description), icon = Icon.createWithResource(provideContext(), R.drawable.ic_target_default), compatibilityState = getCompatibilityState(), - configActivity = TrampolineActivity.createAsiTrampolineIntent(provideContext()) + configActivity = TrampolineActivity.createAsiTrampolineIntent(provideContext()), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DigitalWellbeingComplication.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DigitalWellbeingComplication.kt index 43da2f8e..866cc1ae 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DigitalWellbeingComplication.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/DigitalWellbeingComplication.kt @@ -52,7 +52,8 @@ class DigitalWellbeingComplication: SmartspacerComplicationProvider() { ), compatibilityState = getCompatibility(), widgetProvider = "${BuildConfig.APPLICATION_ID}.widget.digitalwellbeing", - refreshPeriodMinutes = 1 + refreshPeriodMinutes = 1, + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/GoogleWeatherComplication.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/GoogleWeatherComplication.kt index 6b7139b8..f966db53 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/GoogleWeatherComplication.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/GoogleWeatherComplication.kt @@ -1,6 +1,5 @@ package com.kieronquinn.app.smartspacer.components.smartspace.complications -import android.content.ComponentName import android.content.Intent import com.kieronquinn.app.smartspacer.BuildConfig import com.kieronquinn.app.smartspacer.R @@ -14,6 +13,7 @@ import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.TapAction import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.Text import com.kieronquinn.app.smartspacer.sdk.provider.SmartspacerComplicationProvider import com.kieronquinn.app.smartspacer.sdk.utils.ComplicationTemplate +import com.kieronquinn.app.smartspacer.utils.extensions.getGoogleWeatherIntent import org.koin.android.ext.android.inject import android.graphics.drawable.Icon as AndroidIcon @@ -33,11 +33,7 @@ class GoogleWeatherComplication: SmartspacerComplicationProvider() { icon = Icon(AndroidIcon.createWithBitmap(state.icon), shouldTint = false), content = Text(state.temperature), onClick = TapAction( - intent = Intent().apply { - component = ComponentName( - "com.google.android.googlequicksearchbox", - "com.google.android.apps.search.weather.WeatherExportedActivity" - ) + intent = provideContext().getGoogleWeatherIntent().apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/MissedCallsComplication.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/MissedCallsComplication.kt index b08e03bf..1da092b9 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/MissedCallsComplication.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/MissedCallsComplication.kt @@ -41,7 +41,8 @@ class MissedCallsComplication: SmartspacerComplicationProvider() { resources.getString(R.string.complication_missed_calls_label), resources.getString(R.string.complication_missed_calls_description), AndroidIcon.createWithResource(provideContext(), R.drawable.ic_complication_missed_calls), - setupActivity = Intent(provideContext(), CallLogPermissionActivity::class.java) + setupActivity = Intent(provideContext(), CallLogPermissionActivity::class.java), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/SmsComplication.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/SmsComplication.kt index a9bc8aec..5405ede8 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/SmsComplication.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/complications/SmsComplication.kt @@ -41,7 +41,8 @@ class SmsComplication: SmartspacerComplicationProvider() { label = resources.getString(R.string.complication_sms_label), description = resources.getString(R.string.complication_sms_description), icon = AndroidIcon.createWithResource(provideContext(), R.drawable.ic_complication_sms), - setupActivity = Intent(provideContext(), SmsPermissionActivity::class.java) + setupActivity = Intent(provideContext(), SmsPermissionActivity::class.java), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AmmNowPlayingTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AmmNowPlayingTarget.kt index b74516d7..45208a7f 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AmmNowPlayingTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AmmNowPlayingTarget.kt @@ -36,7 +36,8 @@ class AmmNowPlayingTarget: NowPlayingTarget() { icon = Icon.createWithResource(provideContext(), R.drawable.ic_target_now_playing), setupActivity = Intent(provideContext(), NotificationPermissionActivity::class.java), compatibilityState = getCompatibilityState(), - notificationProvider = AmmNowPlayingTargetNotification.AUTHORITY + notificationProvider = AmmNowPlayingTargetNotification.AUTHORITY, + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AsNowPlayingTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AsNowPlayingTarget.kt index 9c8b8fc5..0a677c16 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AsNowPlayingTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AsNowPlayingTarget.kt @@ -30,7 +30,8 @@ class AsNowPlayingTarget: NowPlayingTarget() { icon = Icon.createWithResource(provideContext(), R.drawable.ic_target_now_playing), setupActivity = Intent(provideContext(), NotificationPermissionActivity::class.java), compatibilityState = getCompatibilityState(), - notificationProvider = AsNowPlayingTargetNotification.AUTHORITY + notificationProvider = AsNowPlayingTargetNotification.AUTHORITY, + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AtAGlanceTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AtAGlanceTarget.kt index 6302c901..e85c8663 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AtAGlanceTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/AtAGlanceTarget.kt @@ -75,7 +75,8 @@ class AtAGlanceTarget: SmartspacerTargetProvider() { AndroidIcon.createWithResource(provideContext(), R.drawable.ic_target_at_a_glance), compatibilityState = getCompatibility(), widgetProvider = AtAGlanceWidget.AUTHORITY, - configActivity = TrampolineActivity.createGlanceTrampolineIntent(provideContext()) + configActivity = TrampolineActivity.createGlanceTrampolineIntent(provideContext()), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DateTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DateTarget.kt index b4ce79f7..117cb2fc 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DateTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DateTarget.kt @@ -5,6 +5,8 @@ import android.content.ContentUris import android.content.Context import android.content.Intent import android.graphics.drawable.Icon +import android.icu.text.DateFormat +import android.icu.text.DisplayContext import android.provider.CalendarContract import com.google.gson.Gson import com.google.gson.annotations.SerializedName @@ -25,35 +27,29 @@ import com.kieronquinn.app.smartspacer.ui.activities.configuration.Configuration import org.koin.android.ext.android.inject import java.time.ZonedDateTime import java.time.format.DateTimeFormatter +import java.util.Date import java.util.UUID + class DateTarget: SmartspacerTargetProvider() { private val dataRepository by inject() private val gson by inject() override fun getSmartspaceTargets(smartspacerId: String): List { - val dateFormat = getDateFormat(smartspacerId) - val featureType = if(dateFormat != null) { - SmartspaceTarget.FEATURE_UNDEFINED - }else{ - SmartspaceTarget.FEATURE_WEATHER - } - val header = if(dateFormat != null) { - SmartspaceAction( - id = "", - icon = null, - title = dateFormat.format(ZonedDateTime.now()), - intent = getCalendarIntent() - ) - }else null + val dateFormat = getDateFormat(smartspacerId) ?: getDefaultDateFormat() + val featureType = SmartspaceTarget.FEATURE_UNDEFINED + val header = SmartspaceAction( + id = "", + icon = null, + title = dateFormat.format(ZonedDateTime.now()), + intent = getCalendarIntent() + ) val templateData = BasicTemplateData( - primaryItem = if(dateFormat != null) { - SubItemInfo( - text = Text(dateFormat.format(ZonedDateTime.now())), - tapAction = TapAction(intent = getCalendarIntent()) - ) - }else null + primaryItem = SubItemInfo( + text = Text(dateFormat.format(ZonedDateTime.now())), + tapAction = TapAction(intent = getCalendarIntent()) + ) ) return listOf( SmartspaceTarget( @@ -121,13 +117,15 @@ class DateTarget: SmartspacerTargetProvider() { notifyChange(smartspacerId) } - private fun getDateFormat(smartspacerId: String): DateTimeFormatter? { - return dataRepository.getTargetData(smartspacerId, TargetData::class.java)?.let { + private fun getDateFormat(smartspacerId: String): Formatter? { + return dataRepository.getTargetData(smartspacerId, TargetData::class.java)?.dateFormat?.let { try { - DateTimeFormatter.ofPattern(it.dateFormat) + DateTimeFormatter.ofPattern(it) }catch (e: IllegalArgumentException) { null } + }?.let { + Formatter.DateTimeFormatter(it) } } @@ -143,6 +141,29 @@ class DateTarget: SmartspacerTargetProvider() { } } + private fun getDefaultDateFormat(): Formatter.DateFormat { + return DateFormat.getInstanceForSkeleton("EEEMMMd").apply { + setContext(DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) + }.let { + Formatter.DateFormat(it) + } + } + + sealed class Formatter { + data class DateTimeFormatter(val formatter: java.time.format.DateTimeFormatter): Formatter() { + override fun format(date: ZonedDateTime): String { + return formatter.format(date) + } + } + data class DateFormat(val formatter: android.icu.text.DateFormat): Formatter() { + override fun format(date: ZonedDateTime): String { + return formatter.format(Date.from(date.toInstant())) + } + } + + abstract fun format(date: ZonedDateTime): String + } + data class TargetData( @SerializedName("date_format") val dateFormat: String? = null diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DefaultTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DefaultTarget.kt index 603353b9..3f6415c0 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DefaultTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DefaultTarget.kt @@ -8,7 +8,11 @@ import com.kieronquinn.app.smartspacer.BuildConfig import com.kieronquinn.app.smartspacer.R import com.kieronquinn.app.smartspacer.components.notifications.NotificationId import com.kieronquinn.app.smartspacer.model.database.TargetDataType -import com.kieronquinn.app.smartspacer.repositories.* +import com.kieronquinn.app.smartspacer.repositories.DataRepository +import com.kieronquinn.app.smartspacer.repositories.NotificationRepository +import com.kieronquinn.app.smartspacer.repositories.ShizukuServiceRepository +import com.kieronquinn.app.smartspacer.repositories.SmartspaceRepository +import com.kieronquinn.app.smartspacer.repositories.SmartspacerSettingsRepository import com.kieronquinn.app.smartspacer.sdk.model.Backup import com.kieronquinn.app.smartspacer.sdk.model.CompatibilityState import com.kieronquinn.app.smartspacer.sdk.model.SmartspaceTarget @@ -109,7 +113,8 @@ class DefaultTarget: SmartspacerTargetProvider() { compatibilityState = getCompatibilityState(), configActivity = TrampolineActivity.createAsiTrampolineIntent(provideContext())?.let { ConfigurationActivity.createIntent(provideContext(), TARGET_DEFAULT) - } + }, + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DigitalWellbeingTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DigitalWellbeingTarget.kt index c4ff40ec..02e7d555 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DigitalWellbeingTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/DigitalWellbeingTarget.kt @@ -89,7 +89,8 @@ class DigitalWellbeingTarget: SmartspacerTargetProvider() { ), compatibilityState = getCompatibility(), widgetProvider = "${BuildConfig.APPLICATION_ID}.widget.digitalwellbeing", - refreshPeriodMinutes = 1 + refreshPeriodMinutes = 1, + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/FlashlightTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/FlashlightTarget.kt index c596f8cf..7395c79f 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/FlashlightTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/FlashlightTarget.kt @@ -54,7 +54,8 @@ class FlashlightTarget: SmartspacerTargetProvider() { resources.getString(R.string.target_flashlight_description), AndroidIcon.createWithResource(provideContext(), R.drawable.ic_target_flashlight), configActivity = createIntent(provideContext(), NavGraphMapping.TARGET_FLASHLIGHT), - compatibilityState = getCompatibilityState() + compatibilityState = getCompatibilityState(), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/GoogleWeatherForecastTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/GoogleWeatherForecastTarget.kt index 480df14d..935e09e4 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/GoogleWeatherForecastTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/GoogleWeatherForecastTarget.kt @@ -1,7 +1,6 @@ package com.kieronquinn.app.smartspacer.components.smartspace.targets import android.content.ComponentName -import android.content.Intent import android.os.Build import com.kieronquinn.app.smartspacer.BuildConfig import com.kieronquinn.app.smartspacer.R @@ -19,7 +18,7 @@ import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.Text import com.kieronquinn.app.smartspacer.sdk.provider.SmartspacerTargetProvider import com.kieronquinn.app.smartspacer.sdk.utils.ComplicationTemplate import com.kieronquinn.app.smartspacer.sdk.utils.TargetTemplate -import com.kieronquinn.app.smartspacer.utils.extensions.EXPORTED_WEATHER_COMPONENT +import com.kieronquinn.app.smartspacer.utils.extensions.getGoogleWeatherIntent import org.koin.android.ext.android.inject import android.graphics.drawable.Icon as AndroidIcon @@ -34,7 +33,7 @@ class GoogleWeatherForecastTarget: SmartspacerTargetProvider() { } private fun ForecastState.toTarget(smartpacerId: String): SmartspaceTarget { - val tapAction = getTapAction() + val tapAction = clickIntent?.let { TapAction(pendingIntent = it) } ?: getTapAction() return TargetTemplate.Carousel( id = "google_weather_forecast_$smartpacerId", componentName = ComponentName(provideContext(), this::class.java), @@ -63,9 +62,7 @@ class GoogleWeatherForecastTarget: SmartspacerTargetProvider() { private fun getTapAction(): TapAction { return TapAction( - intent = Intent().apply { - component = EXPORTED_WEATHER_COMPONENT - } + intent = provideContext().getGoogleWeatherIntent() ) } @@ -77,7 +74,8 @@ class GoogleWeatherForecastTarget: SmartspacerTargetProvider() { provideContext(), R.drawable.ic_complication_google_weather ), widgetProvider = "${BuildConfig.APPLICATION_ID}.widget.googleweatherforecast", - compatibilityState = getCompatibilityState() + compatibilityState = getCompatibilityState(), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/MusicTarget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/MusicTarget.kt index ffd2592d..007ab985 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/MusicTarget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/targets/MusicTarget.kt @@ -88,7 +88,8 @@ class MusicTarget: SmartspacerTargetProvider() { setupActivity = Intent(provideContext(), NotificationPermissionActivity::class.java), configActivity = ConfigurationActivity.createIntent( provideContext(), NavGraphMapping.TARGET_MUSIC - ) + ), + allowAddingMoreThanOnce = true ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/widgets/GoogleWeatherForecastWidget.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/widgets/GoogleWeatherForecastWidget.kt index b65d676b..49e4f097 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/widgets/GoogleWeatherForecastWidget.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/components/smartspace/widgets/GoogleWeatherForecastWidget.kt @@ -4,6 +4,7 @@ import android.appwidget.AppWidgetProviderInfo import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import android.util.SizeF +import android.view.View import android.widget.ImageView import android.widget.RemoteViews import android.widget.TextView @@ -16,6 +17,7 @@ import com.kieronquinn.app.smartspacer.repositories.WidgetRepository import com.kieronquinn.app.smartspacer.sdk.provider.SmartspacerTargetProvider import com.kieronquinn.app.smartspacer.sdk.provider.SmartspacerWidgetProvider import com.kieronquinn.app.smartspacer.sdk.utils.findViewByIdentifier +import com.kieronquinn.app.smartspacer.sdk.utils.getClickPendingIntent import com.kieronquinn.app.smartspacer.utils.extensions.dp import org.koin.android.ext.android.inject @@ -80,8 +82,10 @@ class GoogleWeatherForecastWidget: SmartspacerWidgetProvider() { )?.getImageAsBitmap()?.scale() ?: continue forecasts.add(ForecastItem(forecastTime, forecastTemperature, forecastIcon)) } + val clickIntent = views.findViewById(android.R.id.background) + ?.getClickPendingIntent() val forecastState = ForecastState( - location, condition, ForecastItem(null, temperature, icon), forecasts + location, condition, ForecastItem(null, temperature, icon), forecasts, clickIntent ) googleWeatherRepository.setForecastState(forecastState) SmartspacerTargetProvider.notifyChange( diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/model/settings/SettingsItem.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/model/settings/SettingsItem.kt index 54216714..5c66163f 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/model/settings/SettingsItem.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/model/settings/SettingsItem.kt @@ -92,9 +92,10 @@ sealed class GenericSettingsItem(val type: GenericSettingsItemType): BaseSetting data class Card( val icon: Drawable?, val content: CharSequence, - val onClick: (() -> Unit)? = null + val onClick: (() -> Unit)? = null, + val contentHash: Long? = null ): GenericSettingsItem(GenericSettingsItemType.CARD) { - override fun getItemId() = content.hashCode().toLong() + override fun getItemId() = contentHash ?: content.hashCode().toLong() } data class Footer( @@ -109,7 +110,7 @@ sealed class GenericSettingsItem(val type: GenericSettingsItemType): BaseSetting data class RadioCard( val isChecked: Boolean, val title: CharSequence, - val content: CharSequence, + val content: CharSequence?, val onClick: () -> Unit ): GenericSettingsItem(GenericSettingsItemType.RADIO_CARD) { override fun getItemId() = title.hashCode().toLong() diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/receivers/DailyUpdateAlarmReceiver.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/receivers/DailyUpdateAlarmReceiver.kt index 3ea9ede9..22082c4f 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/receivers/DailyUpdateAlarmReceiver.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/receivers/DailyUpdateAlarmReceiver.kt @@ -3,6 +3,7 @@ package com.kieronquinn.app.smartspacer.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import com.kieronquinn.app.smartspacer.BuildConfig import com.kieronquinn.app.smartspacer.components.smartspace.complications.DateComplication import com.kieronquinn.app.smartspacer.components.smartspace.targets.DateTarget import com.kieronquinn.app.smartspacer.repositories.AlarmRepository @@ -17,6 +18,8 @@ import org.koin.core.component.inject class DailyUpdateAlarmReceiver: BroadcastReceiver(), KoinComponent { companion object { + const val INTENT_DAY_CHANGED = "${BuildConfig.APPLICATION_ID}.action.DATE_CHANGED" + fun createIntent(context: Context): Intent { return Intent(context, DailyUpdateAlarmReceiver::class.java).apply { applySecurity(context) @@ -33,6 +36,8 @@ class DailyUpdateAlarmReceiver: BroadcastReceiver(), KoinComponent { alarmRepository.enqueueDailyUpdateReceiver() SmartspacerTargetProvider.notifyChange(context, DateTarget::class.java) SmartspacerComplicationProvider.notifyChange(context, DateComplication::class.java) + //Send internal broadcast for the day changing, which reloads the blank target on some devices + context.sendBroadcast(Intent(INTENT_DAY_CHANGED).apply { `package` = context.packageName }) } } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/GoogleWeatherRepository.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/GoogleWeatherRepository.kt index 980a27f4..1533ee72 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/GoogleWeatherRepository.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/GoogleWeatherRepository.kt @@ -1,5 +1,6 @@ package com.kieronquinn.app.smartspacer.repositories +import android.app.PendingIntent import android.graphics.Bitmap import com.kieronquinn.app.smartspacer.repositories.GoogleWeatherRepository.ForecastState import com.kieronquinn.app.smartspacer.repositories.GoogleWeatherRepository.TodayState @@ -21,7 +22,8 @@ interface GoogleWeatherRepository { val location: String, val condition: String, val now: ForecastItem, - val forecast: List + val forecast: List, + val clickIntent: PendingIntent? ) { data class ForecastItem( val time: String?, diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/SmartspaceRepository.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/SmartspaceRepository.kt index 5fb33009..16610795 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/SmartspaceRepository.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/repositories/SmartspaceRepository.kt @@ -1,9 +1,8 @@ package com.kieronquinn.app.smartspacer.repositories import android.content.Context +import com.kieronquinn.app.smartspacer.components.smartspace.compat.TargetMergerRegular import com.kieronquinn.app.smartspacer.components.smartspace.compat.TargetMergerSplit -import com.kieronquinn.app.smartspacer.components.smartspace.compat.TargetMergerUndefined -import com.kieronquinn.app.smartspacer.components.smartspace.compat.TargetMergerWeather import com.kieronquinn.app.smartspacer.components.smartspace.complications.DefaultComplication import com.kieronquinn.app.smartspacer.components.smartspace.targets.DefaultTarget import com.kieronquinn.app.smartspacer.model.smartspace.Action @@ -24,7 +23,6 @@ import com.kieronquinn.app.smartspacer.sdk.receivers.SmartspacerUpdateReceiver import com.kieronquinn.app.smartspacer.sdk.receivers.SmartspacerVisibilityChangedReceiver import com.kieronquinn.app.smartspacer.utils.extensions.firstNotNull import com.kieronquinn.app.smartspacer.utils.extensions.fixActionsIfNeeded -import com.kieronquinn.app.smartspacer.utils.extensions.isAtLeastU import com.kieronquinn.app.smartspacer.utils.extensions.stripSmartspacerUniqueness import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -426,17 +424,8 @@ class SmartspaceRepositoryImpl( actionsFirst ) } - //Native on 14+ still requires the UNDEFINED feature type - isNative && isAtLeastU() -> { - TargetMergerUndefined.mergeTargetsAndActions( - targets, - actions, - openMode, - actionsFirst - ) - } else -> { - TargetMergerWeather.mergeTargetsAndActions( + TargetMergerRegular.mergeTargetsAndActions( targets, actions, openMode, diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/service/SmartspacerSmartspaceService.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/service/SmartspacerSmartspaceService.kt index f778e7aa..c8f01490 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/service/SmartspacerSmartspaceService.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/service/SmartspacerSmartspaceService.kt @@ -16,6 +16,7 @@ import com.kieronquinn.app.smartspacer.components.notifications.NotificationId import com.kieronquinn.app.smartspacer.components.smartspace.GlanceableHubSmartspacerSession import com.kieronquinn.app.smartspacer.components.smartspace.MediaDataSmartspacerSession import com.kieronquinn.app.smartspacer.components.smartspace.SystemSmartspacerSession +import com.kieronquinn.app.smartspacer.receivers.DailyUpdateAlarmReceiver.Companion.INTENT_DAY_CHANGED import com.kieronquinn.app.smartspacer.receivers.SafeModeReceiver import com.kieronquinn.app.smartspacer.repositories.CompatibilityRepository import com.kieronquinn.app.smartspacer.repositories.NotificationRepository @@ -64,7 +65,10 @@ class SmartspacerSmartspaceService: LifecycleSmartspaceService() { @Suppress("DEPRECATION") //Deprecated in favour of something we cannot use private val RELOAD_BROADCASTS = arrayOf( - Intent.ACTION_WALLPAPER_CHANGED + Intent.ACTION_WALLPAPER_CHANGED, + Intent.ACTION_TIME_CHANGED, + Intent.ACTION_TIMEZONE_CHANGED, + INTENT_DAY_CHANGED ) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/activities/ExportedSmartspaceTrampolineProxyActivity.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/activities/ExportedSmartspaceTrampolineProxyActivity.kt index 95a96f91..0cc4e08d 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/activities/ExportedSmartspaceTrampolineProxyActivity.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/activities/ExportedSmartspaceTrampolineProxyActivity.kt @@ -31,6 +31,8 @@ class ExportedSmartspaceTrampolineProxyActivity: AppCompatActivity() { "com.google.android.googlequicksearchbox", "com.google.android.apps.search.weather.WeatherActivity" ) + + private const val ACTION_WEATHER = "com.google.android.apps.weather.action.VIEW_LOCATION_EXTERNAL" } private val shizukuServiceRepository by inject() @@ -65,6 +67,7 @@ class ExportedSmartspaceTrampolineProxyActivity: AppCompatActivity() { } component = EXPORTED_WEATHER_COMPONENT } + intent?.action == ACTION_WEATHER -> intent intent?.action == SMARTSPACER_INTENT_EXTRA_ACTION_GM -> { startGmailPlid(intent, rootIntent) return false diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/base/settings/BaseSettingsAdapter.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/base/settings/BaseSettingsAdapter.kt index 0d6ac7b8..69b1b1ea 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/base/settings/BaseSettingsAdapter.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/base/settings/BaseSettingsAdapter.kt @@ -276,6 +276,7 @@ abstract class BaseSettingsAdapter( private fun GenericViewHolder.RadioCard.setup(item: GenericSettingsItem.RadioCard) = with(binding) { settingsRadioCardTitle.text = item.title settingsRadioCardContent.text = item.content + settingsRadioCardContent.isVisible = item.content != null settingsRadioCardRadio.isChecked = item.isChecked settingsRadioCardRadio.applyMonet() val background = monet.getPrimaryColor(root.context, !root.context.isDarkMode) diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/enhancedmode/request/EnhancedModeRequestFragment.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/enhancedmode/request/EnhancedModeRequestFragment.kt index 92820160..8232090b 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/enhancedmode/request/EnhancedModeRequestFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/enhancedmode/request/EnhancedModeRequestFragment.kt @@ -10,6 +10,7 @@ import com.kieronquinn.app.smartspacer.ui.base.BackAvailable import com.kieronquinn.app.smartspacer.ui.base.BoundFragment import com.kieronquinn.app.smartspacer.ui.screens.enhancedmode.request.EnhancedModeRequestViewModel.State import com.kieronquinn.app.smartspacer.utils.extensions.applyBackgroundTint +import com.kieronquinn.app.smartspacer.utils.extensions.applyBottomNavigationInset import com.kieronquinn.app.smartspacer.utils.extensions.onClicked import com.kieronquinn.app.smartspacer.utils.extensions.whenResumed import com.kieronquinn.monetcompat.extensions.views.applyMonet @@ -28,6 +29,13 @@ class EnhancedModeRequestFragment: BoundFragment() - override val header by lazy { - listOf( - GenericSettingsItem.Card( - ContextCompat.getDrawable(requireContext(), R.drawable.ic_info), - getText(R.string.expanded_settings_date_info) - ) - ) - } - override fun getSettingTitle(setting: ExpandedOpenMode): CharSequence { return getString(setting.label) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/expanded/settings/lock/ExpandedLockOpenModeSettingsFragment.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/expanded/settings/lock/ExpandedLockOpenModeSettingsFragment.kt index 35ebfeba..3a117048 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/expanded/settings/lock/ExpandedLockOpenModeSettingsFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/expanded/settings/lock/ExpandedLockOpenModeSettingsFragment.kt @@ -1,9 +1,6 @@ package com.kieronquinn.app.smartspacer.ui.screens.expanded.settings.lock -import androidx.core.content.ContextCompat import androidx.navigation.fragment.navArgs -import com.kieronquinn.app.smartspacer.R -import com.kieronquinn.app.smartspacer.model.settings.GenericSettingsItem import com.kieronquinn.app.smartspacer.repositories.SmartspacerSettingsRepository.ExpandedOpenMode import com.kieronquinn.app.smartspacer.ui.base.BackAvailable import com.kieronquinn.app.smartspacer.ui.base.HideBottomNavigation @@ -16,15 +13,6 @@ class ExpandedLockOpenModeSettingsFragment: BaseRadioSettingsFragment() - override val header by lazy { - listOf( - GenericSettingsItem.Card( - ContextCompat.getDrawable(requireContext(), R.drawable.ic_info), - getText(R.string.expanded_settings_date_info) - ) - ) - } - override fun getSettingTitle(setting: ExpandedOpenMode): CharSequence { return getString(setting.label) } diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsAdapter.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsAdapter.kt index 9bf855b8..c6492dae 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsAdapter.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsAdapter.kt @@ -67,6 +67,7 @@ class SettingsAdapter( itemUpdatesAboutContributors to about.onContributorsClicked, itemUpdatesAboutDonate to about.onDonateClicked, itemUpdatesAboutGithub to about.onGitHubClicked, + itemUpdatesAboutCrowdin to about.onCrowdinClicked, itemUpdatesAboutLibraries to about.onLibrariesClicked, itemUpdatesAboutTwitter to about.onTwitterClicked, itemUpdatesAboutXda to about.onXdaClicked diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsFragment.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsFragment.kt index 41b0229f..f560f039 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsFragment.kt @@ -14,6 +14,7 @@ import com.kieronquinn.app.smartspacer.ui.base.Root import com.kieronquinn.app.smartspacer.ui.base.settings.BaseSettingsFragment import com.kieronquinn.app.smartspacer.ui.screens.settings.SettingsViewModel.SettingsSettingsItem import com.kieronquinn.app.smartspacer.ui.screens.settings.SettingsViewModel.State +import com.kieronquinn.app.smartspacer.utils.extensions.getSelectedLanguage import com.kieronquinn.app.smartspacer.utils.extensions.whenResumed import org.koin.androidx.viewmodel.ext.android.viewModel @@ -157,6 +158,13 @@ class SettingsFragment: BaseSettingsFragment(), Root, CanShowSnackbar { ContextCompat.getDrawable(requireContext(), R.drawable.ic_settings_analytics), onChanged = viewModel::onEnableAnalyticsChanged ), + Setting( + getString(R.string.settings_language_title), + requireContext().getSelectedLanguage(supportedLocales)?.displayName + ?: getString(R.string.settings_language_default), + ContextCompat.getDrawable(requireContext(), R.drawable.ic_language), + onClick = viewModel::onLanguageClicked + ), Header(getString(R.string.settings_debug_header)), Setting( getString(R.string.settings_dump_title), @@ -168,6 +176,7 @@ class SettingsFragment: BaseSettingsFragment(), Root, CanShowSnackbar { viewModel::onContributorsClicked, viewModel::onDonateClicked, viewModel::onGitHubClicked, + viewModel::onCrowdinClicked, viewModel::onTwitterClicked, viewModel::onXdaClicked, viewModel::onLibrariesClicked diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsViewModel.kt index d2036b5e..0fdf4d78 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/SettingsViewModel.kt @@ -1,5 +1,6 @@ package com.kieronquinn.app.smartspacer.ui.screens.settings +import android.content.Context import android.content.Intent import android.net.Uri import androidx.lifecycle.ViewModel @@ -11,6 +12,7 @@ import com.kieronquinn.app.smartspacer.repositories.CompatibilityRepository import com.kieronquinn.app.smartspacer.repositories.CompatibilityRepository.CompatibilityReport.Companion.isNativeModeAvailable import com.kieronquinn.app.smartspacer.repositories.SmartspacerSettingsRepository import com.kieronquinn.app.smartspacer.repositories.SmartspacerSettingsRepository.HideSensitive +import com.kieronquinn.app.smartspacer.utils.extensions.getSupportedLocales import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -36,11 +38,13 @@ abstract class SettingsViewModel: ViewModel() { abstract fun onPluginRepositoryClicked() abstract fun onCheckForUpdatesChanged(enabled: Boolean) abstract fun onEnableAnalyticsChanged(enabled: Boolean) + abstract fun onLanguageClicked() abstract fun onDebugClicked() abstract fun onContributorsClicked() abstract fun onDonateClicked() abstract fun onGitHubClicked() + abstract fun onCrowdinClicked() abstract fun onLibrariesClicked() abstract fun onTwitterClicked() abstract fun onXdaClicked() @@ -53,7 +57,8 @@ abstract class SettingsViewModel: ViewModel() { val supportsNativeSmartspace: Boolean, val hideSensitive: HideSensitive, val checkForUpdates: Boolean, - val enableAnalytics: Boolean + val enableAnalytics: Boolean, + val supportedLocales: List ): State() { override fun equals(other: Any?): Boolean { return false @@ -67,6 +72,7 @@ abstract class SettingsViewModel: ViewModel() { val onContributorsClicked: () -> Unit, val onDonateClicked: () -> Unit, val onGitHubClicked: () -> Unit, + val onCrowdinClicked: () -> Unit, val onTwitterClicked: () -> Unit, val onXdaClicked: () -> Unit, val onLibrariesClicked: () -> Unit @@ -80,6 +86,7 @@ abstract class SettingsViewModel: ViewModel() { } class SettingsViewModelImpl( + context: Context, settingsRepository: SmartspacerSettingsRepository, private val compatibilityRepository: CompatibilityRepository, private val navigation: ContainerNavigation @@ -88,6 +95,7 @@ class SettingsViewModelImpl( companion object { private const val LINK_TWITTER = "https://kieronquinn.co.uk/redirect/Smartspacer/twitter" private const val LINK_GITHUB = "https://kieronquinn.co.uk/redirect/Smartspacer/github" + private const val LINK_CROWDIN = "https://kieronquinn.co.uk/redirect/Smartspacer/crowdin" private const val LINK_XDA = "https://kieronquinn.co.uk/redirect/Smartspacer/xda" } @@ -101,6 +109,10 @@ class SettingsViewModelImpl( private val checkForUpdates = settingsRepository.updateCheckEnabled private val analyticsEnabled = settingsRepository.analyticsEnabled + private val supportedLocales = flow { + emit(context.getSupportedLocales().map { it.toLanguageTag() }) + } + private val enhanced = combine( enhancedCompatible, enhancedEnabled.asFlow() @@ -108,13 +120,20 @@ class SettingsViewModelImpl( Pair(compatible, enabled) } - override val state = combine( - enhanced, + private val options = combine( settingsRepository.hideSensitive.asFlow(), checkForUpdates.asFlow(), analyticsEnabled.asFlow(), + supportedLocales + ) { hideSensitive, checkForUpdates, analyticsEnabled, supportedLocales -> + Options(hideSensitive, checkForUpdates, analyticsEnabled, supportedLocales) + } + + override val state = combine( + enhanced, + options, onResume - ) { enhanced, sensitive, updates, analytics, _ -> + ) { enhanced, options, _ -> //If there's no compatible apps at all, native should not be accessible val isNativeSmartspaceAvailable = compatibilityRepository.getCompatibilityReports().isNativeModeAvailable() @@ -122,9 +141,10 @@ class SettingsViewModelImpl( enhanced.first, enhanced.second, isNativeSmartspaceAvailable, - sensitive, - updates, - analytics + options.hideSensitive, + options.checkForUpdates, + options.analyticsEnabled, + options.supportedLocales ) }.stateIn(viewModelScope, SharingStarted.Eagerly, State.Loading) @@ -209,6 +229,12 @@ class SettingsViewModelImpl( } } + override fun onLanguageClicked() { + viewModelScope.launch { + navigation.navigate(SettingsFragmentDirections.actionSettingsFragmentToSettingsLanguageFragment()) + } + } + override fun onDebugClicked() { viewModelScope.launch { navigation.navigate(SettingsFragmentDirections.actionSettingsFragmentToDumpSmartspacerFragment()) @@ -233,6 +259,12 @@ class SettingsViewModelImpl( } } + override fun onCrowdinClicked() { + viewModelScope.launch { + navigation.navigate(LINK_CROWDIN.toIntent()) + } + } + override fun onLibrariesClicked() { viewModelScope.launch { navigation.navigate(SettingsFragmentDirections.actionSettingsFragmentToOssLicensesMenuActivity()) @@ -257,4 +289,11 @@ class SettingsViewModelImpl( } } + private data class Options( + val hideSensitive: HideSensitive, + val checkForUpdates: Boolean, + val analyticsEnabled: Boolean, + val supportedLocales: List + ) + } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageFragment.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageFragment.kt new file mode 100644 index 00000000..cf610c41 --- /dev/null +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageFragment.kt @@ -0,0 +1,102 @@ +package com.kieronquinn.app.smartspacer.ui.screens.settings.language + +import android.os.Bundle +import android.text.Html +import android.view.View +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.content.ContextCompat +import androidx.core.os.LocaleListCompat +import androidx.core.view.isVisible +import com.kieronquinn.app.smartspacer.R +import com.kieronquinn.app.smartspacer.model.settings.BaseSettingsItem +import com.kieronquinn.app.smartspacer.model.settings.GenericSettingsItem.Card +import com.kieronquinn.app.smartspacer.model.settings.GenericSettingsItem.RadioCard +import com.kieronquinn.app.smartspacer.ui.base.BackAvailable +import com.kieronquinn.app.smartspacer.ui.base.settings.BaseSettingsFragment +import com.kieronquinn.app.smartspacer.ui.screens.settings.SettingsAdapter +import com.kieronquinn.app.smartspacer.ui.screens.settings.language.SettingsLanguageViewModel.State +import com.kieronquinn.app.smartspacer.utils.extensions.capitalise +import com.kieronquinn.app.smartspacer.utils.extensions.whenResumed +import org.koin.androidx.viewmodel.ext.android.viewModel +import java.util.Locale + +class SettingsLanguageFragment: BaseSettingsFragment(), BackAvailable { + + private val viewModel by viewModel() + + override val additionalPadding by lazy { + resources.getDimension(R.dimen.margin_8) + } + + override val adapter by lazy { + SettingsAdapter(binding.settingsBaseRecyclerView, emptyList()) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupState() + } + + override fun onResume() { + super.onResume() + viewModel.reload() + } + + private fun setupState() { + handleState(viewModel.state.value) + whenResumed { + viewModel.state.collect { + handleState(it) + } + } + } + + private fun handleState(state: State) = with(binding) { + when(state) { + is State.Loading -> { + settingsBaseLoading.isVisible = true + settingsBaseRecyclerView.isVisible = false + } + is State.Loaded -> { + settingsBaseLoading.isVisible = false + settingsBaseRecyclerView.isVisible = true + adapter.update(state.getItems(), settingsBaseRecyclerView) + } + } + } + + private fun State.Loaded.getItems(): List { + return listOf( + Card( + ContextCompat.getDrawable(requireContext(), R.drawable.ic_info), + Html.fromHtml( + getString(R.string.settings_language_info), + Html.FROM_HTML_MODE_COMPACT + ), + contentHash = -1L + ), + RadioCard( + selectedLocale == null, + getString(R.string.settings_language_default), + null + ) { + onLanguageClicked(null) + } + ) + supportedLocales.map { + RadioCard( + it == selectedLocale, + it.displayName.capitalise(), + null + ) { + onLanguageClicked(it) + } + } + } + + private fun onLanguageClicked(locale: Locale?) { + val locales = locale?.let { LocaleListCompat.create(locale) } + ?: LocaleListCompat.getEmptyLocaleList() + AppCompatDelegate.setApplicationLocales(locales) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageViewModel.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageViewModel.kt new file mode 100644 index 00000000..3bdc9ca0 --- /dev/null +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/ui/screens/settings/language/SettingsLanguageViewModel.kt @@ -0,0 +1,48 @@ +package com.kieronquinn.app.smartspacer.ui.screens.settings.language + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kieronquinn.app.smartspacer.utils.extensions.getSelectedLanguage +import com.kieronquinn.app.smartspacer.utils.extensions.getSupportedLocales +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import java.util.Locale + +abstract class SettingsLanguageViewModel: ViewModel() { + + abstract val state: StateFlow + + abstract fun reload() + + sealed class State { + data object Loading: State() + data class Loaded( + val supportedLocales: List, + val selectedLocale: Locale? + ): State() + } + +} + +class SettingsLanguageViewModelImpl(context: Context): SettingsLanguageViewModel() { + + private val reloadBus = MutableStateFlow(System.currentTimeMillis()) + + override val state = reloadBus.map { + val supported = context.getSupportedLocales().sortedBy { it.displayName.lowercase() } + val selected = context.getSelectedLanguage(supported.map { it.toLanguageTag() }) + State.Loaded(supported, selected) + }.stateIn(viewModelScope, SharingStarted.Eagerly, State.Loading) + + override fun reload() { + viewModelScope.launch { + reloadBus.emit(System.currentTimeMillis()) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Context.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Context.kt index e6d580a4..a2d1666d 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Context.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Context.kt @@ -21,6 +21,7 @@ import android.content.pm.LauncherApps import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.content.res.Configuration +import android.content.res.XmlResourceParser import android.database.ContentObserver import android.graphics.Rect import android.hardware.Sensor @@ -41,6 +42,7 @@ import android.provider.Settings import android.service.notification.NotificationListenerService import android.util.DisplayMetrics import android.view.WindowManager +import androidx.core.app.LocaleManagerCompat import androidx.core.app.NotificationManagerCompat import androidx.lifecycle.LifecycleCoroutineScope import com.kieronquinn.app.smartspacer.BuildConfig @@ -57,6 +59,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import java.util.Locale import java.util.concurrent.Executor import kotlin.math.max import kotlin.math.min @@ -515,4 +518,30 @@ fun Context.hasFlashlight(): Boolean { fun Context.hasLightSensor(): Boolean { val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager return sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT) != null +} + +@SuppressLint("DiscouragedApi") +fun Context.getSupportedLocales(): List { + val id = resources.getIdentifier( + "_generated_res_locale_config", + "xml", + packageName + ) + val localeXml = resources.getXml(id) + val locales = ArrayList() + var event = localeXml.next() + while(event != XmlResourceParser.END_DOCUMENT) { + if(event == XmlResourceParser.START_TAG && localeXml.name == "locale") { + locales.add(localeXml.getAttributeValue(0)) + } + event = localeXml.next() + } + return locales.map { + Locale.forLanguageTag(it) + } +} + +fun Context.getSelectedLanguage(supportedLocales: List): Locale? { + return LocaleManagerCompat.getApplicationLocales(this) + .getFirstMatch(supportedLocales.toTypedArray()) } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Intent.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Intent.kt index aa8b6d8f..78b0ae24 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Intent.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Intent.kt @@ -39,6 +39,8 @@ val EXPORTED_WEATHER_COMPONENT = ComponentName( "com.google.android.apps.search.weather.WeatherExportedActivity" ) +private const val PACKAGE_GOOGLE_WEATHER = "com.google.android.apps.weather" + private const val EXTRA_FEEDBACK_FEATURE_TYPE = "com.google.android.apps.search.assistant.verticals.ambient.shared.constants.SMARTSPACE_EXTRA_CONTEXTUAL_FEEDBACK_FEATURE_TYPE" fun Intent?.isValid(context: Context): Boolean { @@ -123,4 +125,10 @@ fun getIgnoreBatteryOptimisationsIntent(): Intent { fun Intent.setClassLoaderToPackage(context: Context, packageName: String) { setExtrasClassLoader(context.getClassLoaderForPackage(packageName) ?: return) +} + +fun Context.getGoogleWeatherIntent(): Intent { + return packageManager.getLaunchIntentForPackage(PACKAGE_GOOGLE_WEATHER) ?: Intent().apply { + component = EXPORTED_WEATHER_COMPONENT + } } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Text.kt b/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Text.kt index e71b4056..a584260a 100644 --- a/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Text.kt +++ b/app/src/main/java/com/kieronquinn/app/smartspacer/utils/extensions/Extensions+Text.kt @@ -8,6 +8,7 @@ import android.widget.TextView import androidx.core.text.getSpans import com.kieronquinn.app.smartspacer.sdk.model.uitemplatedata.Text import com.kieronquinn.app.smartspacer.utils.spans.SmartspacerForegroundColorSpan +import java.util.Locale import android.app.smartspace.uitemplatedata.Text as SystemText @@ -53,4 +54,10 @@ fun TextView.setShadowEnabled(enabled: Boolean) { shadowDy, if(enabled) Color.BLACK else Color.TRANSPARENT ) +} + +fun String.capitalise(): String { + return replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_language.xml b/app/src/main/res/drawable/ic_language.xml new file mode 100644 index 00000000..a3e6b9a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_language.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/item_settings_about.xml b/app/src/main/res/layout/item_settings_about.xml index 3ff7bf9f..ec19f0a7 100644 --- a/app/src/main/res/layout/item_settings_about.xml +++ b/app/src/main/res/layout/item_settings_about.xml @@ -2,10 +2,10 @@ + android:layout_margin="@dimen/margin_16" + app:cardBackgroundColor="?android:colorControlHighlight"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> @@ -42,93 +42,101 @@ android:textAppearance="@style/TextAppearance.AppCompat.Small.Smartspacer" app:layout_constraintTop_toBottomOf="@id/item_updates_about_title" /> - + app:layout_constraintTop_toBottomOf="@id/item_updates_about_content"> - + - + - + - + - + + + + + + + diff --git a/app/src/main/res/layout/item_settings_radio_card.xml b/app/src/main/res/layout/item_settings_radio_card.xml index 83fb9a0e..ed8a0434 100644 --- a/app/src/main/res/layout/item_settings_radio_card.xml +++ b/app/src/main/res/layout/item_settings_radio_card.xml @@ -23,34 +23,35 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - + app:layout_constraintStart_toEndOf="@id/settings_radio_card_radio"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph_settings.xml b/app/src/main/res/navigation/nav_graph_settings.xml index e63dc392..abb0840e 100644 --- a/app/src/main/res/navigation/nav_graph_settings.xml +++ b/app/src/main/res/navigation/nav_graph_settings.xml @@ -51,6 +51,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 77d45729..939e07e1 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index 9c1ccf46..dad13be0 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 7924f06a..5a459958 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 71f37ff9..32d3acf6 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -683,7 +683,6 @@ Möglicherweise muss auch GPS aktiviert sein, damit Geräte und Verbindungen im Öffnet den erweiterten Smartspace, wenn das Ziel zusätzliche Einstellungen hat, die im erweiterten Smartspace verfügbar sind. Durch erneutes Antippen des Ziels im erweiterten Smartspace wird die ursprüngliche Aktion des Ziels ausgeführt. Immer Öffnet immer den erweiterten Smartspace. Wenn das Ziel im erweiterten Smartspace erneut angetippt wird, führt es die ursprüngliche Aktion des Ziels aus. - Hinweis: Aufgrund von Systembeschränkungen, gilt diese Option nicht für das Antippen des Datums vom Datumsziel (oder ein Fülldatum, das oberhalb der Komplikationen angezeigt wird) Farbton Die Farbe für Text und Icons auf dem erweiterten Smartspace: %1s diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index a1187865..c86aaf43 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index 92ad76fb..cb722634 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 9a25f956..d02d04e3 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Siempre Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Nota: Debido a limitaciones del sistema, esta opción no se aplica al presionar la fecha del objetivo de fecha (o una fecha de objetivo de relleno mostrada encima de las complicaciones) Tono Color que se usa para el texto y los iconos en Smartspace expandido: %1s diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 4acb242a..0c2b30b9 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -18,9 +18,9 @@ Paramètres Autorisez les paramètres restreints en ouvrant le menu « ... » Depuis Android 13, Google interdit par défaut l\'accès aux services d\'accessibilité aux applications téléchargées en dehors du Play Store en forçant une vérification de sécurité dans les paramètres.\n\nSi vous n\'arrivez pas à activer le service d\'accessibilité, vous devez ouvrir les Infos sur l\'appli et autoriser les paramètres restreints. -
Si un message vous indique que les paramètres sont restreints, vous devez alors désinstaller Smartspacer et le réinstaller à l'aider d'une application utilisant l'installation par session comme Split APKs Installer (SAI) ou l'application APKMirror. Vous DEVEZ désinstaller l'application AVANT de la réinstaller.

Un autre moyen de procéder est d'activer le mode amélioré (nécessite Shizuku ou un accès root).]]>
+
Si un message vous indique que les paramètres sont restreints, vous devez alors désinstaller Smartspacer et le réinstaller à l\'aider d\'une application utilisant l\'installation par session comme Split APKs Installer (SAI) ou l\'application APKMirror. Vous DEVEZ désinstaller l\'application AVANT de la réinstaller.

Un autre moyen de procéder est d\'activer le mode amélioré (nécessite Shizuku ou un accès root).]]>
Depuis Android 13, Google interdit par défaut l\'accès aux notifications aux applications téléchargées en dehors du Play Store en forçant une vérification de sécurité dans les paramètres.\n\nSi vous n\'arrivez pas à accorder l\'accès aux notifications, vous devez ouvrir les Infos sur l\'appli et autoriser les paramètres restreints. -
Si un message vous indique que les paramètres sont restreints, vous devez alors désinstaller Smartspacer et le réinstaller à l'aider d'une application utilisant l'installation par session comme Split APKs Installer (SAI) ou l'application APKMirror. Vous DEVEZ désinstaller l'application AVANT de la réinstaller.

Un autre moyen de procéder est d'activer le mode amélioré (nécessite Shizuku ou un accès root).]]>
+
Si un message vous indique que les paramètres sont restreints, vous devez alors désinstaller Smartspacer et le réinstaller à l\'aider d\'une application utilisant l\'installation par session comme Split APKs Installer (SAI) ou l\'application APKMirror. Vous DEVEZ désinstaller l\'application AVANT de la réinstaller.

Un autre moyen de procéder est d\'activer le mode amélioré (nécessite Shizuku ou un accès root).]]>
Ouvrir les Infos sur l\'appli Accorder l\'autorisation avec Shizuku Contenus masqués @@ -449,7 +449,7 @@ Collecte de données Données et rapports de plantage - Pour aider à la correction des bugs, Smartspacer peut envoyer les rapports de plantage à Firebase Crashlytics, avec des données statistiques de base (sur les lancements de l'application).
Toutes ces données sont anonymes et leur collecte est optionnelle. Plus de détails et règles de confidentialité ici]]>
+ Pour aider à la correction des bugs, Smartspacer peut envoyer les rapports de plantage à Firebase Crashlytics, avec des données statistiques de base (sur les lancements de l\'application).
Toutes ces données sont anonymes et leur collecte est optionnelle. Plus de détails et règles de confidentialité ici]]>
Autoriser Interdire @@ -682,7 +682,6 @@ Ouvre Smartspace étendu si la cible a des options supplémentaires accessibles depuis Smartspace étendu. Appuyer à nouveau sur la cible dans Smartspace étendu aura pour effet d\'exécuter l\'action originale de la cible. Toujours Toujours ouvrir Smartspace étendu. Appuyer à nouveau sur la cible dans Smartspace étendu aura pour effet d\'exécuter l\'action originale de la cible. - Remarque : en raison de limitations systèmes, cette option ne s\'applique pas aux appuis sur la date de la cible Date (ou d\'une cible de remplissage permettant d\'afficher la date au-dessus des complications). Couleur Couleur à utiliser pour le texte et les icônes de Smartspace étendu : %1s diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 6a99b330..83f3d298 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index d97f29b9..06875fc8 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -18,9 +18,9 @@ Impostazioni Consenti impostazioni limitate nel menu di overflow Da Android 13, Google ha aggiunto un controllo di sicurezza alle impostazioni, impedendo alle applicazioni che sono state installate tramite sideload di utilizzare i servizi di accessibilità per impostazione predefinita.\n\nSe vedi un messaggio di impostazioni limitate quando cerchi di abilitare il servizio di accessibilità, è necessario aprire Informazioni App consenti le impostazioni limitate. -
Se vedi un messaggio riguardo impostazioni limitate, è necessario disinstallare Smartspacer e reinstallarlo utilizzando un'applicazione basata su installer di sessione come Split APKs Installer (SAI) o l'app APKMirror. Aggiornare l'app (senza disinstallarla) NON è sufficiente.

In alternativa, con la modalità Enhanced attivata, Smartspacer aggirerà questo requisito (non può essere fatto senza Shizuku o root).]]>
+
Se vedi un messaggio riguardo impostazioni limitate, è necessario disinstallare Smartspacer e reinstallarlo utilizzando un\'applicazione basata su installer di sessione come Split APKs Installer (SAI) o l\'app APKMirror. Aggiornare l\'app (senza disinstallarla) NON è sufficiente.

In alternativa, con la modalità Enhanced attivata, Smartspacer aggirerà questo requisito (non può essere fatto senza Shizuku o root).]]>
Da Android 13, Google ha aggiunto un controllo di sicurezza alle impostazioni, impedendo alle applicazioni che sono state installate tramite sideload di inviare notifiche per impostazione predefinita.\n\nSe vedi un messaggio di impostazioni limitate quando cerchi di abilitare le notifiche, è necessario aprire Informazioni App consenti le impostazioni limitate. -
Se vedi un messaggio riguardo impostazioni limitate, è necessario disinstallare Smartspacer e reinstallarlo utilizzando un'applicazione basata su installer di sessione come Split APKs Installer (SAI) o l'app APKMirror. Aggiornare l'app (senza disinstallarla) NON è sufficiente.

In alternativa, con la modalità Enhanced attivata, Smartspacer aggirerà questo requisito (non può essere fatto senza Shizuku o root).]]>
+
Se vedi un messaggio riguardo impostazioni limitate, è necessario disinstallare Smartspacer e reinstallarlo utilizzando un\'applicazione basata su installer di sessione come Split APKs Installer (SAI) o l\'app APKMirror. Aggiornare l\'app (senza disinstallarla) NON è sufficiente.

In alternativa, con la modalità Enhanced attivata, Smartspacer aggirerà questo requisito (non può essere fatto senza Shizuku o root).]]>
Apri le informazioni dell\'app Concedi il permesso con Shizuku Contenuto nascosto @@ -449,7 +449,7 @@ Analytics Analytics & Crash Report - Per agevolare il bug fixing, Smartspacer può inviare crash report a Firebase Crashlitics, insieme a delle analytics di base (lanci dell'app).
Questi dati sono tutti anonimi, e sono assolutamente opzionali, maggiori dettagli e privacy policy qui]]>
+ Per agevolare il bug fixing, Smartspacer può inviare crash report a Firebase Crashlitics, insieme a delle analytics di base (lanci dell\'app).
Questi dati sono tutti anonimi, e sono assolutamente opzionali, maggiori dettagli e privacy policy qui]]>
Consenti Nega @@ -492,7 +492,7 @@ Aggiungi widget Aggiungi Smartspacer alla schermata home - Lock Screen Widgets per aggiungere il widget.]]> + Lock Screen Widgets per aggiungere il widget.]]> Requisiti I Requisiti consentono di personalizzare quando un target o una complicazione devono essere visualizzati in Smartspace. Con essi è possibile creare scenari in cui le informazioni utili vengono mostrate nello Smartspace. @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index dab959f2..9f96db59 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 3d28184e..1768903c 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index cdba2644..dabf9b24 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -682,7 +682,6 @@ Åpner «Utvidet Smartspace» hvis målet som er trykket på har ytterligere handlinger som er tilgjengelige i «Utvidet Smartspace». Hvis du trykker på målet på nytt i «Utvidet Smartspace», så vil målets trykkhandling kjøres. Alltid Åpner alltid «Utvidet Smartspace» hvis et mål er trykket på. Hvis du trykker på målet på nytt i «Utvidet Smartspace», så vil målets trykkhandling kjøres. - Merk deg at på grunn av systembegrensinger kan «Utvidet Smartspace» ikke åpnes fra «Dato»-målet Fargetone Fargen som skal brukes for tekst og ikoner i «Utvidet Smartspace»: %1s diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 54d66732..c7bcee54 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Zawsze Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index bbc052ae..cdea9c01 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -682,7 +682,6 @@ Abre o Smartspace Expandido se o Destaque tiver opções extras disponíveis nele. Tocar novamente no Destaque dentro do Smartspace Expandido executará sua ação original. Sempre Sempre abre o Smartspace Expandido. Tocar novamente no Destaque dentro do Smartspace Expandido executará sua ação original. - Observação: Devido a limitações do sistema, esta opção não se aplica ao tocar na data do destaque de Data (ou um destaque de data de preenchimento mostrado acima dos complementos) Tonalidade da Cor Cor a ser usada para texto e ícones do smartspace expandido: %1s diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index eb6eeabb..9bdf6eae 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 54c8e964..e4fc6670 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -682,7 +682,6 @@ Открывает Расширенное Пространство, если у Цели есть дополнительные опции для Расширенного Пространства. Нажатие на Цель снова в Расширенном Пространстве запустит действие по нажатию. Всегда Всегда открывает Расширенное Пространство. Нажатие на Цель в Расширенном Пространстве запустит её действие по нажатию. - Примечание: из-за ограничений системы, эта настройка не применяется к нажатию на цель \"Дата\" (или цель-филлер \"Дата\", отображаемую, когда есть свободные Дополнения) Цвет Цвет, который будут использовать текст и иконки в Расширенном Пространстве: %1s diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 5dd21d45..400af8ba 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index 5ba64302..6124947d 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 7d83021f..187ac483 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -682,7 +682,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b0dde0d6..fd9ed240 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -682,7 +682,6 @@ 如果对象能在 Smartspace 扩展面板中提供额外选项则打开面板。在面板中再次点击对象可以继续执行原始操作。 总是 总是打开 Smartspace 扩展面板。在 Smartspacer 扩展面板中再次点击对象来执行对象的原始操作。 - 注意:因为系统限制,该选项不适用于点击日期对象中的日期(或显示在附件上方的日期对象填充) 着色 Smartspace 扩展面板文本和图标所使用的颜色:%1s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f67c7826..58cc0dc6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -682,7 +682,6 @@ 如果目標有可在擴展 Smartspace 中使用的額外選項,則打開擴展 Smartspace。在擴展 Smartspace 中再次點擊目標將執行目標的原始動作。 總是 總是打開擴展 Smartspace。在擴展 Smartspace 中再次點擊目標將執行目標的原始動作。 - 注意:由於系統限制,此選項不適用於點擊來自日期目標的日期(或顯示在複雜功能之上的填充日期目標)。 色調顏色 在擴展 Smartspace 上用於文字和圖示的顏色:%1s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1b987c5c..cd5b5133 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -456,6 +456,10 @@ Automatically check for Smartspacer updates and show a notification if one is available Enable Analytics & Crash Reporting Allow sending anonymous crash reports and basic analytics to Firebase, to help fix bugs + Language + System Default + Note: Not all languages are complete, you can contribute translations on the Smartspacer Crowdin + Hide Sensitive Targets Hide Sensitive Hide Targets on the lock screen where they are marked as sensitive: %1s @@ -775,7 +779,6 @@ Opens Expanded Smartspace if the Target has extra options, available in Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. Always Always opens Expanded Smartspace. Tapping the Target again in Expanded Smartspace will run the Target\'s original action. - Note: Due to system limitations, this option does not apply to tapping the date from the Date Target (or a filler date Target shown above Complications) Tint Colour The colour to use for text and icons on Expanded Smartspace: %1s @@ -988,6 +991,7 @@ Follow me on Twitter Version %1s\nCreated by Kieron Quinn Contributors + Crowdin Icons diff --git a/build.gradle b/build.gradle index a8e17b53..0b5fa1ee 100644 --- a/build.gradle +++ b/build.gradle @@ -13,15 +13,15 @@ buildscript { // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.4.1' apply false - id 'com.android.library' version '8.4.1' apply false + id 'com.android.application' version '8.5.2' apply false + id 'com.android.library' version '8.5.2' apply false id 'org.jetbrains.kotlin.android' version '1.9.10' apply false id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false id 'dev.rikka.tools.refine' version "$refine_version" apply false id 'com.google.devtools.ksp' version '1.9.10-1.0.13' apply false - id "com.google.gms.google-services" version "4.3.15" apply false - id "com.google.firebase.crashlytics" version "2.9.9" apply false - id "com.vanniktech.maven.publish" version "0.25.3" apply false + id "com.google.gms.google-services" version "4.4.2" apply false + id "com.google.firebase.crashlytics" version "3.0.2" apply false + id "com.vanniktech.maven.publish" version "0.29.0" apply false } allprojects { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ef2d5452..3f528970 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Oct 23 22:32:37 BST 2023 +#Tue Aug 27 04:42:21 BST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sdk-client/build.gradle b/sdk-client/build.gradle index 43c29a16..dd104e6c 100644 --- a/sdk-client/build.gradle +++ b/sdk-client/build.gradle @@ -40,10 +40,10 @@ android { dependencies { api('com.kieronquinn.smartspacer:sdk-core:1.0.5') implementation('androidx.core:core-ktx:1.13.1') - implementation('androidx.fragment:fragment-ktx:1.8.1') + implementation('androidx.fragment:fragment-ktx:1.8.2') implementation('androidx.constraintlayout:constraintlayout:2.1.4') - implementation('androidx.lifecycle:lifecycle-service:2.8.3') - implementation('androidx.lifecycle:lifecycle-runtime-ktx:2.8.3') + implementation('androidx.lifecycle:lifecycle-service:2.8.4') + implementation('androidx.lifecycle:lifecycle-runtime-ktx:2.8.4') implementation('org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3') implementation('com.github.skydoves:balloon:1.4.7') } diff --git a/sdk-sample/build.gradle b/sdk-sample/build.gradle index daa0f7ea..b61a6000 100644 --- a/sdk-sample/build.gradle +++ b/sdk-sample/build.gradle @@ -34,9 +34,9 @@ android { dependencies { implementation 'androidx.appcompat:appcompat:1.7.0' - implementation "androidx.fragment:fragment-ktx:1.8.1" - implementation "androidx.lifecycle:lifecycle-service:2.8.3" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.3" + implementation "androidx.fragment:fragment-ktx:1.8.2" + implementation "androidx.lifecycle:lifecycle-service:2.8.4" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.4" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" implementation project(path: ':sdk-plugin') implementation project(path: ':sdk-client') diff --git a/systemstubs/build.gradle b/systemstubs/build.gradle index 319174dc..23b0781b 100644 --- a/systemstubs/build.gradle +++ b/systemstubs/build.gradle @@ -30,7 +30,7 @@ android { } dependencies { - implementation "androidx.annotation:annotation:1.8.0" + implementation "androidx.annotation:annotation:1.8.2" annotationProcessor "dev.rikka.tools.refine:annotation-processor:$refine_version" compileOnly "dev.rikka.tools.refine:annotation:$refine_version" } \ No newline at end of file