Loading packages/SystemUI/customization/src/com/android/systemui/shared/customization/data/content/CustomizationProviderClient.kt +30 −2 Original line number Original line Diff line number Diff line Loading @@ -20,12 +20,15 @@ package com.android.systemui.shared.customization.data.content import android.annotation.SuppressLint import android.annotation.SuppressLint import android.content.ContentValues import android.content.ContentValues import android.content.Context import android.content.Context import android.content.Intent import android.database.ContentObserver import android.database.ContentObserver import android.graphics.Color import android.graphics.Color import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable import android.net.Uri import android.net.Uri import android.util.Log import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract import java.net.URISyntaxException import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow Loading Loading @@ -169,6 +172,8 @@ interface CustomizationProviderClient { * If `null`, the button should not be shown. * If `null`, the button should not be shown. */ */ val enablementActionComponentName: String? = null, val enablementActionComponentName: String? = null, /** Optional [Intent] to use to start an activity to configure this affordance. */ val configureIntent: Intent? = null, ) ) /** Models a selection of a quick affordance on a slot. */ /** Models a selection of a quick affordance on a slot. */ Loading Loading @@ -337,6 +342,11 @@ class CustomizationProviderClientImpl( Contract.LockScreenQuickAffordances.AffordanceTable.Columns Contract.LockScreenQuickAffordances.AffordanceTable.Columns .ENABLEMENT_COMPONENT_NAME .ENABLEMENT_COMPONENT_NAME ) ) val configureIntentColumnIndex = cursor.getColumnIndex( Contract.LockScreenQuickAffordances.AffordanceTable.Columns .CONFIGURE_INTENT ) if ( if ( idColumnIndex == -1 || idColumnIndex == -1 || nameColumnIndex == -1 || nameColumnIndex == -1 || Loading @@ -344,15 +354,17 @@ class CustomizationProviderClientImpl( isEnabledColumnIndex == -1 || isEnabledColumnIndex == -1 || enablementInstructionsColumnIndex == -1 || enablementInstructionsColumnIndex == -1 || enablementActionTextColumnIndex == -1 || enablementActionTextColumnIndex == -1 || enablementComponentNameColumnIndex == -1 enablementComponentNameColumnIndex == -1 || configureIntentColumnIndex == -1 ) { ) { return@buildList return@buildList } } while (cursor.moveToNext()) { while (cursor.moveToNext()) { val affordanceId = cursor.getString(idColumnIndex) add( add( CustomizationProviderClient.Affordance( CustomizationProviderClient.Affordance( id = cursor.getString(idColumnIndex), id = affordanceId, name = cursor.getString(nameColumnIndex), name = cursor.getString(nameColumnIndex), iconResourceId = cursor.getInt(iconColumnIndex), iconResourceId = cursor.getInt(iconColumnIndex), isEnabled = cursor.getInt(isEnabledColumnIndex) == 1, isEnabled = cursor.getInt(isEnabledColumnIndex) == 1, Loading @@ -367,6 +379,10 @@ class CustomizationProviderClientImpl( cursor.getString(enablementActionTextColumnIndex), cursor.getString(enablementActionTextColumnIndex), enablementActionComponentName = enablementActionComponentName = cursor.getString(enablementComponentNameColumnIndex), cursor.getString(enablementComponentNameColumnIndex), configureIntent = cursor .getString(configureIntentColumnIndex) ?.toIntent(affordanceId = affordanceId), ) ) ) ) } } Loading Loading @@ -504,7 +520,19 @@ class CustomizationProviderClientImpl( .onStart { emit(Unit) } .onStart { emit(Unit) } } } private fun String.toIntent( affordanceId: String, ): Intent? { return try { Intent.parseUri(this, 0) } catch (e: URISyntaxException) { Log.w(TAG, "Cannot parse Uri into Intent for affordance with ID \"$affordanceId\"!") null } } companion object { companion object { private const val TAG = "CustomizationProviderClient" private const val SYSTEM_UI_PACKAGE_NAME = "com.android.systemui" private const val SYSTEM_UI_PACKAGE_NAME = "com.android.systemui" } } } } packages/SystemUI/customization/src/com/android/systemui/shared/customization/data/content/CustomizationProviderContract.kt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -113,6 +113,11 @@ object CustomizationProviderContract { * opens a destination where the user can re-enable the disabled affordance. * opens a destination where the user can re-enable the disabled affordance. */ */ const val ENABLEMENT_COMPONENT_NAME = "enablement_action_intent" const val ENABLEMENT_COMPONENT_NAME = "enablement_action_intent" /** * Byte array. Optional parcelled `Intent` to use to start an activity that can be * used to configure the affordance. */ const val CONFIGURE_INTENT = "configure_intent" } } } } Loading packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -282,6 +282,7 @@ class CustomizationProvider : .ENABLEMENT_ACTION_TEXT, .ENABLEMENT_ACTION_TEXT, Contract.LockScreenQuickAffordances.AffordanceTable.Columns Contract.LockScreenQuickAffordances.AffordanceTable.Columns .ENABLEMENT_COMPONENT_NAME, .ENABLEMENT_COMPONENT_NAME, Contract.LockScreenQuickAffordances.AffordanceTable.Columns.CONFIGURE_INTENT, ) ) ) ) .apply { .apply { Loading @@ -298,6 +299,7 @@ class CustomizationProvider : ), ), representation.actionText, representation.actionText, representation.actionComponentName, representation.actionComponentName, representation.configureIntent?.toUri(0), ) ) ) ) } } Loading packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfig.kt +62 −53 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.data.quickaffordance package com.android.systemui.keyguard.data.quickaffordance import android.content.Context import android.content.Context import android.content.Intent import android.net.Uri import android.net.Uri import android.provider.Settings import android.provider.Settings import android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS import android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS Loading @@ -39,6 +40,7 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.settings.SettingsProxyExt.observerFlow import com.android.systemui.util.settings.SettingsProxyExt.observerFlow import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow Loading @@ -48,10 +50,10 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.onStart import javax.inject.Inject @SysUISingleton @SysUISingleton class DoNotDisturbQuickAffordanceConfig constructor( class DoNotDisturbQuickAffordanceConfig constructor( private val context: Context, private val context: Context, private val controller: ZenModeController, private val controller: ZenModeController, private val secureSettings: SecureSettings, private val secureSettings: SecureSettings, Loading @@ -76,15 +78,18 @@ class DoNotDisturbQuickAffordanceConfig constructor( private val conditionUri: Uri private val conditionUri: Uri get() = get() = testConditionId ?: ZenModeConfig.toTimeCondition( testConditionId ?: ZenModeConfig.toTimeCondition( context, context, settingsValue, settingsValue, userTracker.userId, userTracker.userId, true, /* shortVersion */ true, /* shortVersion */ ).id ) .id private val dialog: EnableZenModeDialog by lazy { private val dialog: EnableZenModeDialog by lazy { testDialog ?: EnableZenModeDialog( testDialog ?: EnableZenModeDialog( context, context, R.style.Theme_SystemUI_Dialog, R.style.Theme_SystemUI_Dialog, true, /* cancelIsNeutral */ true, /* cancelIsNeutral */ Loading @@ -98,9 +103,11 @@ class DoNotDisturbQuickAffordanceConfig constructor( override val pickerIconResourceId: Int = R.drawable.ic_do_not_disturb override val pickerIconResourceId: Int = R.drawable.ic_do_not_disturb override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> = combine( override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> = combine( conflatedCallbackFlow { conflatedCallbackFlow { val callback = object: ZenModeController.Callback { val callback = object : ZenModeController.Callback { override fun onZenChanged(zen: Int) { override fun onZenChanged(zen: Int) { dndMode = zen dndMode = zen trySendWithFailureLogging(updateState(), TAG) trySendWithFailureLogging(updateState(), TAG) Loading Loading @@ -131,17 +138,19 @@ class DoNotDisturbQuickAffordanceConfig constructor( override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { return if (controller.isZenAvailable) { return if (controller.isZenAvailable) { KeyguardQuickAffordanceConfig.PickerScreenState.Default KeyguardQuickAffordanceConfig.PickerScreenState.Default( configureIntent = Intent(Settings.ACTION_ZEN_MODE_SETTINGS) ) } else { } else { KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice } } } } override fun onTriggered(expandable: Expandable?): override fun onTriggered( KeyguardQuickAffordanceConfig.OnTriggeredResult { expandable: Expandable? ): KeyguardQuickAffordanceConfig.OnTriggeredResult { return when { return when { !isAvailable -> !isAvailable -> KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled dndMode != ZEN_MODE_OFF -> { dndMode != ZEN_MODE_OFF -> { controller.setZen(ZEN_MODE_OFF, null, TAG) controller.setZen(ZEN_MODE_OFF, null, TAG) KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled Loading packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfig.kt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -135,7 +135,7 @@ constructor( override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState = override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState = if (flashlightController.isAvailable) { if (flashlightController.isAvailable) { KeyguardQuickAffordanceConfig.PickerScreenState.Default KeyguardQuickAffordanceConfig.PickerScreenState.Default() } else { } else { KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice } } Loading Loading
packages/SystemUI/customization/src/com/android/systemui/shared/customization/data/content/CustomizationProviderClient.kt +30 −2 Original line number Original line Diff line number Diff line Loading @@ -20,12 +20,15 @@ package com.android.systemui.shared.customization.data.content import android.annotation.SuppressLint import android.annotation.SuppressLint import android.content.ContentValues import android.content.ContentValues import android.content.Context import android.content.Context import android.content.Intent import android.database.ContentObserver import android.database.ContentObserver import android.graphics.Color import android.graphics.Color import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable import android.net.Uri import android.net.Uri import android.util.Log import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract import java.net.URISyntaxException import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow Loading Loading @@ -169,6 +172,8 @@ interface CustomizationProviderClient { * If `null`, the button should not be shown. * If `null`, the button should not be shown. */ */ val enablementActionComponentName: String? = null, val enablementActionComponentName: String? = null, /** Optional [Intent] to use to start an activity to configure this affordance. */ val configureIntent: Intent? = null, ) ) /** Models a selection of a quick affordance on a slot. */ /** Models a selection of a quick affordance on a slot. */ Loading Loading @@ -337,6 +342,11 @@ class CustomizationProviderClientImpl( Contract.LockScreenQuickAffordances.AffordanceTable.Columns Contract.LockScreenQuickAffordances.AffordanceTable.Columns .ENABLEMENT_COMPONENT_NAME .ENABLEMENT_COMPONENT_NAME ) ) val configureIntentColumnIndex = cursor.getColumnIndex( Contract.LockScreenQuickAffordances.AffordanceTable.Columns .CONFIGURE_INTENT ) if ( if ( idColumnIndex == -1 || idColumnIndex == -1 || nameColumnIndex == -1 || nameColumnIndex == -1 || Loading @@ -344,15 +354,17 @@ class CustomizationProviderClientImpl( isEnabledColumnIndex == -1 || isEnabledColumnIndex == -1 || enablementInstructionsColumnIndex == -1 || enablementInstructionsColumnIndex == -1 || enablementActionTextColumnIndex == -1 || enablementActionTextColumnIndex == -1 || enablementComponentNameColumnIndex == -1 enablementComponentNameColumnIndex == -1 || configureIntentColumnIndex == -1 ) { ) { return@buildList return@buildList } } while (cursor.moveToNext()) { while (cursor.moveToNext()) { val affordanceId = cursor.getString(idColumnIndex) add( add( CustomizationProviderClient.Affordance( CustomizationProviderClient.Affordance( id = cursor.getString(idColumnIndex), id = affordanceId, name = cursor.getString(nameColumnIndex), name = cursor.getString(nameColumnIndex), iconResourceId = cursor.getInt(iconColumnIndex), iconResourceId = cursor.getInt(iconColumnIndex), isEnabled = cursor.getInt(isEnabledColumnIndex) == 1, isEnabled = cursor.getInt(isEnabledColumnIndex) == 1, Loading @@ -367,6 +379,10 @@ class CustomizationProviderClientImpl( cursor.getString(enablementActionTextColumnIndex), cursor.getString(enablementActionTextColumnIndex), enablementActionComponentName = enablementActionComponentName = cursor.getString(enablementComponentNameColumnIndex), cursor.getString(enablementComponentNameColumnIndex), configureIntent = cursor .getString(configureIntentColumnIndex) ?.toIntent(affordanceId = affordanceId), ) ) ) ) } } Loading Loading @@ -504,7 +520,19 @@ class CustomizationProviderClientImpl( .onStart { emit(Unit) } .onStart { emit(Unit) } } } private fun String.toIntent( affordanceId: String, ): Intent? { return try { Intent.parseUri(this, 0) } catch (e: URISyntaxException) { Log.w(TAG, "Cannot parse Uri into Intent for affordance with ID \"$affordanceId\"!") null } } companion object { companion object { private const val TAG = "CustomizationProviderClient" private const val SYSTEM_UI_PACKAGE_NAME = "com.android.systemui" private const val SYSTEM_UI_PACKAGE_NAME = "com.android.systemui" } } } }
packages/SystemUI/customization/src/com/android/systemui/shared/customization/data/content/CustomizationProviderContract.kt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -113,6 +113,11 @@ object CustomizationProviderContract { * opens a destination where the user can re-enable the disabled affordance. * opens a destination where the user can re-enable the disabled affordance. */ */ const val ENABLEMENT_COMPONENT_NAME = "enablement_action_intent" const val ENABLEMENT_COMPONENT_NAME = "enablement_action_intent" /** * Byte array. Optional parcelled `Intent` to use to start an activity that can be * used to configure the affordance. */ const val CONFIGURE_INTENT = "configure_intent" } } } } Loading
packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -282,6 +282,7 @@ class CustomizationProvider : .ENABLEMENT_ACTION_TEXT, .ENABLEMENT_ACTION_TEXT, Contract.LockScreenQuickAffordances.AffordanceTable.Columns Contract.LockScreenQuickAffordances.AffordanceTable.Columns .ENABLEMENT_COMPONENT_NAME, .ENABLEMENT_COMPONENT_NAME, Contract.LockScreenQuickAffordances.AffordanceTable.Columns.CONFIGURE_INTENT, ) ) ) ) .apply { .apply { Loading @@ -298,6 +299,7 @@ class CustomizationProvider : ), ), representation.actionText, representation.actionText, representation.actionComponentName, representation.actionComponentName, representation.configureIntent?.toUri(0), ) ) ) ) } } Loading
packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfig.kt +62 −53 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.data.quickaffordance package com.android.systemui.keyguard.data.quickaffordance import android.content.Context import android.content.Context import android.content.Intent import android.net.Uri import android.net.Uri import android.provider.Settings import android.provider.Settings import android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS import android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS Loading @@ -39,6 +40,7 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.settings.SettingsProxyExt.observerFlow import com.android.systemui.util.settings.SettingsProxyExt.observerFlow import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow Loading @@ -48,10 +50,10 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.onStart import javax.inject.Inject @SysUISingleton @SysUISingleton class DoNotDisturbQuickAffordanceConfig constructor( class DoNotDisturbQuickAffordanceConfig constructor( private val context: Context, private val context: Context, private val controller: ZenModeController, private val controller: ZenModeController, private val secureSettings: SecureSettings, private val secureSettings: SecureSettings, Loading @@ -76,15 +78,18 @@ class DoNotDisturbQuickAffordanceConfig constructor( private val conditionUri: Uri private val conditionUri: Uri get() = get() = testConditionId ?: ZenModeConfig.toTimeCondition( testConditionId ?: ZenModeConfig.toTimeCondition( context, context, settingsValue, settingsValue, userTracker.userId, userTracker.userId, true, /* shortVersion */ true, /* shortVersion */ ).id ) .id private val dialog: EnableZenModeDialog by lazy { private val dialog: EnableZenModeDialog by lazy { testDialog ?: EnableZenModeDialog( testDialog ?: EnableZenModeDialog( context, context, R.style.Theme_SystemUI_Dialog, R.style.Theme_SystemUI_Dialog, true, /* cancelIsNeutral */ true, /* cancelIsNeutral */ Loading @@ -98,9 +103,11 @@ class DoNotDisturbQuickAffordanceConfig constructor( override val pickerIconResourceId: Int = R.drawable.ic_do_not_disturb override val pickerIconResourceId: Int = R.drawable.ic_do_not_disturb override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> = combine( override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> = combine( conflatedCallbackFlow { conflatedCallbackFlow { val callback = object: ZenModeController.Callback { val callback = object : ZenModeController.Callback { override fun onZenChanged(zen: Int) { override fun onZenChanged(zen: Int) { dndMode = zen dndMode = zen trySendWithFailureLogging(updateState(), TAG) trySendWithFailureLogging(updateState(), TAG) Loading Loading @@ -131,17 +138,19 @@ class DoNotDisturbQuickAffordanceConfig constructor( override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { return if (controller.isZenAvailable) { return if (controller.isZenAvailable) { KeyguardQuickAffordanceConfig.PickerScreenState.Default KeyguardQuickAffordanceConfig.PickerScreenState.Default( configureIntent = Intent(Settings.ACTION_ZEN_MODE_SETTINGS) ) } else { } else { KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice } } } } override fun onTriggered(expandable: Expandable?): override fun onTriggered( KeyguardQuickAffordanceConfig.OnTriggeredResult { expandable: Expandable? ): KeyguardQuickAffordanceConfig.OnTriggeredResult { return when { return when { !isAvailable -> !isAvailable -> KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled dndMode != ZEN_MODE_OFF -> { dndMode != ZEN_MODE_OFF -> { controller.setZen(ZEN_MODE_OFF, null, TAG) controller.setZen(ZEN_MODE_OFF, null, TAG) KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled Loading
packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfig.kt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -135,7 +135,7 @@ constructor( override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState = override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState = if (flashlightController.isAvailable) { if (flashlightController.isAvailable) { KeyguardQuickAffordanceConfig.PickerScreenState.Default KeyguardQuickAffordanceConfig.PickerScreenState.Default() } else { } else { KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice } } Loading