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

Commit de40929c authored by Makoto Onuki's avatar Makoto Onuki Committed by android-build-merger
Browse files

Merge "Fix launcher side callback" into nyc-dev

am: ed1b8987

* commit 'ed1b8987':
  Fix launcher side callback
parents 90f7db62 ed1b8987
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ import java.util.List;
 * {@hide}
 */
interface ILauncherApps {
    void addOnAppsChangedListener(in IOnAppsChangedListener listener);
    void addOnAppsChangedListener(String callingPackage, in IOnAppsChangedListener listener);
    void removeOnAppsChangedListener(in IOnAppsChangedListener listener);
    ParceledListSlice getLauncherActivities(String packageName, in UserHandle user);
    ResolveInfo resolveActivity(in Intent intent, in UserHandle user);
+2 −1
Original line number Diff line number Diff line
@@ -565,7 +565,8 @@ public class LauncherApps {
                addCallbackLocked(callback, handler);
                if (addedFirstCallback) {
                    try {
                        mService.addOnAppsChangedListener(mAppsChangedListener);
                        mService.addOnAppsChangedListener(mContext.getPackageName(),
                                mAppsChangedListener);
                    } catch (RemoteException re) {
                        throw re.rethrowFromSystemServer();
                    }
+1 −2
Original line number Diff line number Diff line
@@ -36,8 +36,7 @@ import java.util.List;
 */
public abstract class ShortcutServiceInternal {
    public interface ShortcutChangeListener {
        void onShortcutChanged(@NonNull String packageName,
                @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId);
        void onShortcutChanged(@NonNull String packageName, @UserIdInt int userId);
    }

    public abstract List<ShortcutInfo>
+90 −54
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ILauncherApps;
import android.content.pm.IOnAppsChangedListener;
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps.ShortcutQuery;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -74,9 +75,20 @@ public class LauncherAppsService extends SystemService {

    @Override
    public void onStart() {
        Binder.LOG_RUNTIME_EXCEPTION = true;
        publishBinderService(Context.LAUNCHER_APPS_SERVICE, mLauncherAppsImpl);
    }

    static class BroadcastCookie {
        public final UserHandle user;
        public final String packageName;

        BroadcastCookie(UserHandle userHandle, String packageName) {
            this.user = userHandle;
            this.packageName = packageName;
        }
    }

    @VisibleForTesting
    static class LauncherAppsImpl extends ILauncherApps.Stub {
        private static final boolean DEBUG = false;
@@ -113,7 +125,8 @@ public class LauncherAppsService extends SystemService {
         *          android.content.pm.IOnAppsChangedListener)
         */
        @Override
        public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException {
        public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener)
                throws RemoteException {
            synchronized (mListeners) {
                if (DEBUG) {
                    Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle());
@@ -125,7 +138,8 @@ public class LauncherAppsService extends SystemService {
                    startWatchingPackageBroadcasts();
                }
                mListeners.unregister(listener);
                mListeners.register(listener, Binder.getCallingUserHandle());
                mListeners.register(listener, new BroadcastCookie(UserHandle.of(getCallingUserId()),
                        callingPackage));
            }
        }

@@ -490,12 +504,9 @@ public class LauncherAppsService extends SystemService {
            }
        }


        private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener {

        /** Checks if user is a profile of or same as listeningUser.
         * and the user is enabled. */
            private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser,
        boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser,
                String debugMsg) {
            if (user.getIdentifier() == listeningUser.getIdentifier()) {
                if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg);
@@ -526,6 +537,12 @@ public class LauncherAppsService extends SystemService {
            }
        }

        void postToPackageMonitor(Runnable r) {
            mPackageMonitor.getRegisteredHandler().post(r);
        }

        private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener {

            // TODO Simplify with lambdas.

            @Override
@@ -534,8 +551,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue;
                    try {
                        listener.onPackageAdded(user, packageName);
                    } catch (RemoteException re) {
@@ -553,8 +570,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue;
                    try {
                        listener.onPackageRemoved(user, packageName);
                    } catch (RemoteException re) {
@@ -572,8 +589,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue;
                    try {
                        listener.onPackageChanged(user, packageName);
                    } catch (RemoteException re) {
@@ -591,8 +608,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue;
                    try {
                        listener.onPackagesAvailable(user, packages, isReplacing());
                    } catch (RemoteException re) {
@@ -610,8 +627,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue;
                    try {
                        listener.onPackagesUnavailable(user, packages, isReplacing());
                    } catch (RemoteException re) {
@@ -629,8 +646,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackagesSuspended")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue;
                    try {
                        listener.onPackagesSuspended(user, packages);
                    } catch (RemoteException re) {
@@ -648,8 +665,8 @@ public class LauncherAppsService extends SystemService {
                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnsuspended")) continue;
                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue;
                    try {
                        listener.onPackagesUnsuspended(user, packages);
                    } catch (RemoteException re) {
@@ -663,20 +680,39 @@ public class LauncherAppsService extends SystemService {

            @Override
            public void onShortcutChanged(@NonNull String packageName,
                    @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId) {
                    @UserIdInt int userId) {
                postToPackageMonitor(() -> onShortcutChangedInner(packageName, userId));
            }

            private void onShortcutChangedInner(@NonNull String packageName,
                    @UserIdInt int userId) {
                final UserHandle user = UserHandle.of(userId);

                final int n = mListeners.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                    UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, listeningUser, "onShortcutChanged")) continue;

                    // STOPSHIP Skip if the receiver doesn't have the permission.

                    BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
                    if (!isEnabledProfileOf(user, cookie.user, "onShortcutChanged")) continue;

                    // Make sure the caller has the permission.
                    if (!mShortcutServiceInternal.hasShortcutHostPermission(cookie.packageName,
                            cookie.user.getIdentifier())) {
                        continue;
                    }
                    // Each launcher has a different set of pinned shortcuts, so we need to do a
                    // query in here.
                    // (As of now, only one launcher has the permission at a time, so it's bit
                    // moot, but we may change the permission model eventually.)
                    final List<ShortcutInfo> list =
                            mShortcutServiceInternal.getShortcuts(cookie.packageName,
                            /* changedSince= */ 0, packageName, /* component= */ null,
                                    ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY
                                    | ShortcutQuery.FLAG_GET_PINNED
                                    | ShortcutQuery.FLAG_GET_DYNAMIC
                                    , userId);
                    try {
                        listener.onShortcutChanged(user, packageName,
                                new ParceledListSlice<>(shortcuts));
                                new ParceledListSlice<>(list));
                    } catch (RemoteException re) {
                        Slog.d(TAG, "Callback failed ", re);
                    }
+26 −13
Original line number Diff line number Diff line
@@ -814,7 +814,7 @@ public class ShortcutService extends IShortcutService.Stub {
            return;
        }

        final long token = Binder.clearCallingIdentity();
        final long token = injectClearCallingIdentity();
        try {
            // Clear icon info on the shortcut.
            shortcut.setIconResourceId(0);
@@ -891,7 +891,7 @@ public class ShortcutService extends IShortcutService.Stub {
                shortcut.clearIcon();
            }
        } finally {
            Binder.restoreCallingIdentity(token);
            injectRestoreCallingIdentity(token);
        }
    }

@@ -992,6 +992,10 @@ public class ShortcutService extends IShortcutService.Stub {
        }
    }

    void postToHandler(Runnable r) {
        mHandler.post(r);
    }

    /**
     * Throw if {@code numShortcuts} is bigger than {@link #mMaxDynamicShortcuts}.
     */
@@ -1011,17 +1015,16 @@ public class ShortcutService extends IShortcutService.Stub {
    }

    private void notifyListeners(@NonNull String packageName, @UserIdInt int userId) {
        postToHandler(() -> {
            final ArrayList<ShortcutChangeListener> copy;
        final List<ShortcutInfo> shortcuts = new ArrayList<>();
            synchronized (mLock) {
                copy = new ArrayList<>(mListeners);

            getPackageShortcutsLocked(packageName, userId)
                    .findAll(shortcuts, /* query =*/ null, ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
            }
            // Note onShortcutChanged() needs to be called with the system service permissions.
            for (int i = copy.size() - 1; i >= 0; i--) {
            copy.get(i).onShortcutChanged(packageName, shortcuts, userId);
                copy.get(i).onShortcutChanged(packageName, userId);
            }
        });
    }

    /**
@@ -1799,6 +1802,16 @@ public class ShortcutService extends IShortcutService.Stub {
        return UserHandle.getUserId(injectBinderCallingUid());
    }

    // Injection point.
    long injectClearCallingIdentity() {
        return Binder.clearCallingIdentity();
    }

    // Injection point.
    void injectRestoreCallingIdentity(long token) {
        Binder.restoreCallingIdentity(token);
    }

    File injectSystemDataPath() {
        return Environment.getDataSystemDirectory();
    }
Loading