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