1 /* <lambda>null2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.launcher3.model 18 19 import android.content.pm.LauncherApps 20 import android.content.pm.PackageInstaller.SessionInfo 21 import android.content.pm.ShortcutInfo 22 import android.os.UserHandle 23 import android.text.TextUtils 24 import com.android.launcher3.LauncherModel.ModelUpdateTask 25 import com.android.launcher3.config.FeatureFlags 26 import com.android.launcher3.logging.FileLog 27 import com.android.launcher3.model.PackageUpdatedTask.OP_ADD 28 import com.android.launcher3.model.PackageUpdatedTask.OP_REMOVE 29 import com.android.launcher3.model.PackageUpdatedTask.OP_SUSPEND 30 import com.android.launcher3.model.PackageUpdatedTask.OP_UNAVAILABLE 31 import com.android.launcher3.model.PackageUpdatedTask.OP_UNSUSPEND 32 import com.android.launcher3.model.PackageUpdatedTask.OP_UPDATE 33 import com.android.launcher3.pm.InstallSessionTracker 34 import com.android.launcher3.pm.PackageInstallInfo 35 import com.android.launcher3.util.PackageUserKey 36 import java.util.function.Consumer 37 38 /** 39 * Implementation of {@link LauncherApps#Callbacks} which converts various events to corresponding 40 * model tasks 41 */ 42 class ModelLauncherCallbacks(private var taskExecutor: Consumer<ModelUpdateTask>) : 43 LauncherApps.Callback(), InstallSessionTracker.Callback { 44 45 override fun onPackageAdded(packageName: String, user: UserHandle) { 46 FileLog.d(TAG, "onPackageAdded triggered for packageName=$packageName, user=$user") 47 taskExecutor.accept(PackageUpdatedTask(OP_ADD, user, packageName)) 48 } 49 50 override fun onPackageChanged(packageName: String, user: UserHandle) { 51 taskExecutor.accept(PackageUpdatedTask(OP_UPDATE, user, packageName)) 52 } 53 54 override fun onPackageLoadingProgressChanged( 55 packageName: String, 56 user: UserHandle, 57 progress: Float, 58 ) { 59 taskExecutor.accept(PackageIncrementalDownloadUpdatedTask(packageName, user, progress)) 60 } 61 62 override fun onPackageRemoved(packageName: String, user: UserHandle) { 63 FileLog.d(TAG, "onPackageRemoved triggered for packageName=$packageName, user=$user") 64 taskExecutor.accept(PackageUpdatedTask(OP_REMOVE, user, packageName)) 65 } 66 67 override fun onPackagesAvailable( 68 vararg packageNames: String, 69 user: UserHandle, 70 replacing: Boolean, 71 ) { 72 taskExecutor.accept(PackageUpdatedTask(OP_UPDATE, user, *packageNames)) 73 } 74 75 override fun onPackagesSuspended(vararg packageNames: String, user: UserHandle) { 76 taskExecutor.accept(PackageUpdatedTask(OP_SUSPEND, user, *packageNames)) 77 } 78 79 override fun onPackagesUnavailable( 80 packageNames: Array<String>, 81 user: UserHandle, 82 replacing: Boolean, 83 ) { 84 if (!replacing) { 85 taskExecutor.accept(PackageUpdatedTask(OP_UNAVAILABLE, user, *packageNames)) 86 } 87 } 88 89 override fun onPackagesUnsuspended(vararg packageNames: String, user: UserHandle) { 90 taskExecutor.accept(PackageUpdatedTask(OP_UNSUSPEND, user, *packageNames)) 91 } 92 93 override fun onShortcutsChanged( 94 packageName: String, 95 shortcuts: MutableList<ShortcutInfo>, 96 user: UserHandle, 97 ) { 98 taskExecutor.accept(ShortcutsChangedTask(packageName, shortcuts, user, true)) 99 } 100 101 fun onPackagesRemoved(user: UserHandle, packages: List<String>) { 102 FileLog.d(TAG, "package removed received " + TextUtils.join(",", packages)) 103 taskExecutor.accept(PackageUpdatedTask(OP_REMOVE, user, *packages.toTypedArray())) 104 } 105 106 override fun onSessionFailure(packageName: String, user: UserHandle) { 107 taskExecutor.accept(SessionFailureTask(packageName, user)) 108 } 109 110 override fun onPackageStateChanged(installInfo: PackageInstallInfo) { 111 taskExecutor.accept(PackageInstallStateChangedTask(installInfo)) 112 } 113 114 override fun onUpdateSessionDisplay(key: PackageUserKey, info: SessionInfo) { 115 /** Updates the icons and label of all pending icons for the provided package name. */ 116 taskExecutor.accept { controller, _, _ -> 117 controller.app.iconCache.updateSessionCache(key, info) 118 } 119 taskExecutor.accept( 120 CacheDataUpdatedTask( 121 CacheDataUpdatedTask.OP_SESSION_UPDATE, 122 key.mUser, 123 hashSetOf(key.mPackageName), 124 ) 125 ) 126 } 127 128 override fun onInstallSessionCreated(sessionInfo: PackageInstallInfo) { 129 if (FeatureFlags.PROMISE_APPS_IN_ALL_APPS.get()) { 130 taskExecutor.accept { taskController, _, apps -> 131 apps.addPromiseApp(taskController.app.context, sessionInfo) 132 taskController.bindApplicationsIfNeeded() 133 } 134 } 135 } 136 137 companion object { 138 private const val TAG = "LauncherAppsCallbackImpl" 139 } 140 } 141