Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7eb00fa9 authored by Ale Nijamkin's avatar Ale Nijamkin Committed by Android (Google) Code Review
Browse files

Merge "Long-press to configure quick affordances (1/2)." into tm-qpr-dev

parents e32bce64 c26282ed
Loading
Loading
Loading
Loading
+30 −2
Original line number Original line Diff line number Diff line
@@ -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
@@ -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. */
@@ -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 ||
@@ -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,
@@ -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),
                                )
                                )
                            )
                            )
                        }
                        }
@@ -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"
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -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"
            }
            }
        }
        }


+2 −0
Original line number Original line Diff line number Diff line
@@ -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 {
@@ -298,6 +299,7 @@ class CustomizationProvider :
                            ),
                            ),
                            representation.actionText,
                            representation.actionText,
                            representation.actionComponentName,
                            representation.actionComponentName,
                            representation.configureIntent?.toUri(0),
                        )
                        )
                    )
                    )
                }
                }
+62 −53
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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,
@@ -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 */
@@ -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)
@@ -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
+1 −1
Original line number Original line Diff line number Diff line
@@ -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