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

Commit d11862e6 authored by Ale Nijamkin's avatar Ale Nijamkin Committed by Automerger Merge Worker
Browse files

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

parents 4db81ce5 7eb00fa9
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -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
@@ -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. */
@@ -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 ||
@@ -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,
@@ -367,6 +379,10 @@ class CustomizationProviderClientImpl(
                                        cursor.getString(enablementActionTextColumnIndex),
                                    enablementActionComponentName =
                                        cursor.getString(enablementComponentNameColumnIndex),
                                    configureIntent =
                                        cursor
                                            .getString(configureIntentColumnIndex)
                                            ?.toIntent(affordanceId = affordanceId),
                                )
                            )
                        }
@@ -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"
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -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"
            }
        }

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