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

Commit d546ae47 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Use RoleManager in AppBindingService

This fixes the "default app uninstalled" issue.

Change-Id: I6926f8587abd9fa46e74883046e1b4c36ae5159a
Fix: 123774494
Test: manual
Test: atest -v AppBindingHostTest
parent a057c94b
Loading
Loading
Loading
Loading
+2 −36
Original line number Diff line number Diff line
@@ -177,13 +177,12 @@ public class AppBindingService extends Binder {
     * Handle boot phase PHASE_ACTIVITY_MANAGER_READY.
     */
    private void onPhaseActivityManagerReady() {
        // RoleManager doesn't tell us about upgrade, so we still need to listen for app upgrades.
        // (app uninstall/disable will be notified by RoleManager.)
        final IntentFilter packageFilter = new IntentFilter();
        packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        packageFilter.addDataScheme("package");

        packageFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        mContext.registerReceiverAsUser(mPackageUserMonitor, UserHandle.ALL,
                packageFilter, null, mHandler);

@@ -256,14 +255,6 @@ public class AppBindingService extends Binder {
                        handlePackageAddedReplacing(packageName, userId);
                    }
                    break;
                case Intent.ACTION_PACKAGE_REMOVED:
                    if (!replacing) {
                        handlePackageRemoved(packageName, userId);
                    }
                    break;
                case Intent.ACTION_PACKAGE_CHANGED:
                    handlePackageChanged(packageName, userId);
                    break;
            }
        }
    };
@@ -371,31 +362,6 @@ public class AppBindingService extends Binder {
        }
    }

    private void handlePackageRemoved(String packageName, int userId) {
        if (DEBUG) {
            Slog.d(TAG, "handlePackageRemoved: u" + userId + " " + packageName);
        }
        synchronized (mLock) {
            final AppServiceFinder finder = findFinderLocked(userId, packageName);
            if (finder != null) {
                unbindServicesLocked(userId, finder, "package uninstall");
            }
        }
    }

    private void handlePackageChanged(String packageName, int userId) {
        if (DEBUG) {
            Slog.d(TAG, "handlePackageChanged: u" + userId + " " + packageName);
        }
        synchronized (mLock) {
            final AppServiceFinder finder = findFinderLocked(userId, packageName);
            if (finder != null) {
                unbindServicesLocked(userId, finder, "package changed");
                bindServicesLocked(userId, finder, "package changed");
            }
        }
    }

    private void rebindAllLocked(String reason) {
        for (int i = 0; i < mRunningUsers.size(); i++) {
            if (!mRunningUsers.valueAt(i)) {
+18 −19
Original line number Diff line number Diff line
@@ -16,14 +16,10 @@

package com.android.server.appbinding.finders;

import static android.provider.Telephony.Sms.Intents.ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL;

import android.Manifest.permission;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ServiceInfo;
import android.os.Handler;
import android.os.IBinder;
@@ -35,7 +31,8 @@ import android.text.TextUtils;
import android.util.Slog;

import com.android.internal.R;
import com.android.internal.telephony.SmsApplication;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.CollectionUtils;
import com.android.server.appbinding.AppBindingConstants;

import java.util.function.BiConsumer;
@@ -45,10 +42,15 @@ import java.util.function.BiConsumer;
 */
public class CarrierMessagingClientServiceFinder
        extends AppServiceFinder<CarrierMessagingClientService, ICarrierMessagingClientService> {

    private final RoleManager mRoleManager;

    public CarrierMessagingClientServiceFinder(Context context,
            BiConsumer<AppServiceFinder, Integer> listener,
            Handler callbackHandler) {
        super(context, listener, callbackHandler);

        mRoleManager = context.getSystemService(RoleManager.class);
    }

    @Override
@@ -84,9 +86,8 @@ public class CarrierMessagingClientServiceFinder

    @Override
    public String getTargetPackage(int userId) {
        final ComponentName cn = SmsApplication.getDefaultSmsApplicationAsUser(
                mContext, /* updateIfNeeded= */ true, userId);
        String ret = cn == null ? null : cn.getPackageName();
        final String ret = CollectionUtils.firstOrNull(mRoleManager.getRoleHoldersAsUser(
                RoleManager.ROLE_SMS, UserHandle.of(userId)));

        if (DEBUG) {
            Slog.d(TAG, "getTargetPackage()=" + ret);
@@ -97,9 +98,8 @@ public class CarrierMessagingClientServiceFinder

    @Override
    public void startMonitoring() {
        final IntentFilter filter = new IntentFilter(ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL);
        mContext.registerReceiverAsUser(mSmsAppChangedWatcher, UserHandle.ALL, filter,
                /* permission= */ null, mHandler);
        mRoleManager.addOnRoleHoldersChangedListenerAsUser(
                mContext.getMainExecutor(), mRoleHolderChangedListener, UserHandle.ALL);
    }

    @Override
@@ -118,12 +118,11 @@ public class CarrierMessagingClientServiceFinder
        return constants.SMS_APP_BIND_FLAGS;
    }

    private final BroadcastReceiver mSmsAppChangedWatcher = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL.equals(intent.getAction())) {
                mListener.accept(CarrierMessagingClientServiceFinder.this, getSendingUserId());
            }
    private final OnRoleHoldersChangedListener mRoleHolderChangedListener = (role, user) -> {
        if (RoleManager.ROLE_SMS.equals(role)) {
            BackgroundThread.getHandler().post(() -> {
                mListener.accept(CarrierMessagingClientServiceFinder.this, user.getIdentifier());
            });
        }
    };
}