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

Commit 0c630c34 authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Use AppOpsController for AlarmsAndReminders

Instead of AlarmsAndRemindersController, to always provide the correct
status.

Bug: 322916468
Test: manual - on Alarms & reminders page and switch between apps
Test: unit test
Change-Id: Ia428b426895f35e0d11c25c58dc89a06e564afe7
parent 2f1943b2
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -27,7 +27,8 @@ import android.os.PowerExemptionManager
import androidx.compose.runtime.Composable
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.R
import com.android.settingslib.spa.livedata.observeAsCallback
import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.model.app.PackageManagers
@@ -47,7 +48,7 @@ data class AlarmsAndRemindersAppRecord(
    override val app: ApplicationInfo,
    val isTrumped: Boolean,
    val isChangeable: Boolean,
    var controller: AlarmsAndRemindersController,
    var controller: AppOpsController,
) : AppRecord

class AlarmsAndRemindersAppListModel(
@@ -82,7 +83,7 @@ class AlarmsAndRemindersAppListModel(
    @Composable
    override fun isAllowed(record: AlarmsAndRemindersAppRecord): () -> Boolean? = when {
        record.isTrumped -> ({ true })
        else -> record.controller.isAllowed.observeAsCallback()
        else -> record.controller.isAllowed.collectAsCallbackWithLifecycle()
    }

    override fun isChangeable(record: AlarmsAndRemindersAppRecord) = record.isChangeable
@@ -112,7 +113,12 @@ class AlarmsAndRemindersAppListModel(
            app = app,
            isTrumped = isTrumped,
            isChangeable = hasRequestPermission && !isTrumped,
            controller = AlarmsAndRemindersController(context, app),
            controller = AppOpsController(
                context = context,
                app = app,
                op = AppOpsManager.OP_SCHEDULE_EXACT_ALARM,
                setModeByUid = true,
            ),
        )
    }

+0 −51
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.spa.app.specialaccess

import android.app.AppOpsManager
import android.app.AppOpsManager.MODE_ALLOWED
import android.app.AppOpsManager.MODE_ERRORED
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.android.settingslib.spaprivileged.framework.common.alarmManager
import com.android.settingslib.spaprivileged.framework.common.appOpsManager
import com.android.settingslib.spaprivileged.model.app.userId

class AlarmsAndRemindersController(
    context: Context,
    private val app: ApplicationInfo,
) {
    private val alarmManager = context.alarmManager
    private val appOpsManager = context.appOpsManager

    val isAllowed: LiveData<Boolean>
        get() = _allowed

    fun setAllowed(allowed: Boolean) {
        val mode = if (allowed) MODE_ALLOWED else MODE_ERRORED
        appOpsManager.setUidMode(AppOpsManager.OP_SCHEDULE_EXACT_ALARM, app.uid, mode)
        _allowed.postValue(allowed)
    }

    private val _allowed = object : MutableLiveData<Boolean>() {
        override fun onActive() {
            postValue(alarmManager.hasScheduleExactAlarm(app.packageName, app.userId))
        }
    }
}