/* * Copyright (C) 2024 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.quickstep import android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS import android.app.PendingIntent import android.app.RemoteAction import android.content.Context import android.graphics.drawable.Icon import android.view.accessibility.AccessibilityManager import com.android.launcher3.R import java.util.concurrent.Executor /** * Registers a [RemoteAction] for toggling All Apps if needed. * * We need this action when either [isHomeAndOverviewSame] or [isTaskbarPresent] is `true`. When * home and overview are the same, we can control Launcher's or Taskbar's All Apps tray. If they are * not the same, but Taskbar is present, we can only control Taskbar's tray. */ class AllAppsActionManager( private val context: Context, private val bgExecutor: Executor, private val createAllAppsPendingIntent: () -> PendingIntent, ) { /** `true` if home and overview are the same Activity. */ var isHomeAndOverviewSame = false set(value) { field = value updateSystemAction() } /** `true` if Taskbar is enabled. */ var isTaskbarPresent = false set(value) { field = value updateSystemAction() } /** `true` if the action should be registered. */ var isActionRegistered = false private set private fun updateSystemAction() { val shouldRegisterAction = isHomeAndOverviewSame || isTaskbarPresent if (isActionRegistered == shouldRegisterAction) return isActionRegistered = shouldRegisterAction bgExecutor.execute { val accessibilityManager = context.getSystemService(AccessibilityManager::class.java) ?: return@execute if (shouldRegisterAction) { accessibilityManager.registerSystemAction( RemoteAction( Icon.createWithResource(context, R.drawable.ic_apps), context.getString(R.string.all_apps_label), context.getString(R.string.all_apps_label), createAllAppsPendingIntent(), ), GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS, ) } else { accessibilityManager.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS) } } } fun onDestroy() { isActionRegistered = false context .getSystemService(AccessibilityManager::class.java) ?.unregisterSystemAction( GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS, ) } }