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

Commit d6ff4bbe authored by Evan Chen's avatar Evan Chen
Browse files

Send BLE callback after phone is unlocked if the app is not directBootAware.

Test: manually test + cts
Fix: 326458463
Change-Id: I31907aa60c950232a8656077dfe653ef00506516
parent c84590a9
Loading
Loading
Loading
Loading
+2 −36
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static android.Manifest.permission.MANAGE_COMPANION_DEVICES;
import static android.Manifest.permission.REQUEST_COMPANION_SELF_MANAGED;
import static android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE;
import static android.Manifest.permission.USE_COMPANION_TRANSPORTS;
import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Process.SYSTEM_UID;
@@ -53,7 +52,6 @@ import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice;
import android.companion.AssociationInfo;
import android.companion.AssociationRequest;
import android.companion.IAssociationRequestCallback;
@@ -76,7 +74,6 @@ import android.os.Binder;
import android.os.Environment;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.ParcelUuid;
import android.os.PowerExemptionManager;
import android.os.PowerManagerInternal;
import android.os.RemoteException;
@@ -118,9 +115,7 @@ import com.android.server.wm.ActivityTaskManagerInternal;
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;

@@ -250,38 +245,9 @@ public class CompanionDeviceManagerService extends SystemService {

    @Override
    public void onUserUnlocked(@NonNull TargetUser user) {
        Slog.i(TAG, "onUserUnlocked() user=" + user);
        // Notify and bind the app after the phone is unlocked.
        final int userId = user.getUserIdentifier();
        final Set<BluetoothDevice> blueToothDevices =
                mDevicePresenceProcessor.getPendingConnectedDevices().get(userId);

        final List<ObservableUuid> observableUuids =
                mObservableUuidStore.getObservableUuidsForUser(userId);

        if (blueToothDevices != null) {
            for (BluetoothDevice bluetoothDevice : blueToothDevices) {
                final ParcelUuid[] bluetoothDeviceUuids = bluetoothDevice.getUuids();

                final List<ParcelUuid> deviceUuids = ArrayUtils.isEmpty(bluetoothDeviceUuids)
                        ? Collections.emptyList() : Arrays.asList(bluetoothDeviceUuids);

                for (AssociationInfo ai :
                        mAssociationStore.getActiveAssociationsByAddress(
                                bluetoothDevice.getAddress())) {
                    Slog.i(TAG, "onUserUnlocked, device id( " + ai.getId() + " ) is connected");
                    mDevicePresenceProcessor.onBluetoothCompanionDeviceConnected(ai.getId());
                }

                for (ObservableUuid observableUuid : observableUuids) {
                    if (deviceUuids.contains(observableUuid.getUuid())) {
                        Slog.i(TAG, "onUserUnlocked, UUID( "
                                + observableUuid.getUuid() + " ) is connected");
                        mDevicePresenceProcessor.onDevicePresenceEventByUuid(
                                observableUuid, EVENT_BT_CONNECTED);
                    }
                }
            }
        }
        mDevicePresenceProcessor.sendDevicePresenceEventOnUnlocked(user.getUserIdentifier());
    }

    private void onPackageRemoveOrDataClearedInternal(
+56 −19
Original line number Diff line number Diff line
@@ -80,25 +80,6 @@ class CompanionDeviceShellCommand extends ShellCommand {
        final int associationId;

        try {
            if ("simulate-device-event".equals(cmd) && Flags.devicePresence()) {
                associationId = getNextIntArgRequired();
                int event = getNextIntArgRequired();
                mDevicePresenceProcessor.simulateDeviceEvent(associationId, event);
                return 0;
            }

            if ("simulate-device-uuid-event".equals(cmd) && Flags.devicePresence()) {
                String uuid = getNextArgRequired();
                String packageName = getNextArgRequired();
                int userId = getNextIntArgRequired();
                int event = getNextIntArgRequired();
                ObservableUuid observableUuid = new ObservableUuid(
                        userId, ParcelUuid.fromString(uuid), packageName,
                        System.currentTimeMillis());
                mDevicePresenceProcessor.simulateDeviceEventByUuid(observableUuid, event);
                return 0;
            }

            switch (cmd) {
                case "list": {
                    final int userId = getNextIntArgRequired();
@@ -167,6 +148,51 @@ class CompanionDeviceShellCommand extends ShellCommand {
                    mDevicePresenceProcessor.simulateDeviceEvent(associationId, /* event */ 1);
                    break;

                case "simulate-device-event": {
                    if (Flags.devicePresence()) {
                        associationId = getNextIntArgRequired();
                        int event = getNextIntArgRequired();
                        mDevicePresenceProcessor.simulateDeviceEvent(associationId, event);
                    }
                    break;
                }

                case "simulate-device-uuid-event": {
                    if (Flags.devicePresence()) {
                        String uuid = getNextArgRequired();
                        String packageName = getNextArgRequired();
                        int userId = getNextIntArgRequired();
                        int event = getNextIntArgRequired();
                        ObservableUuid observableUuid = new ObservableUuid(
                                userId, ParcelUuid.fromString(uuid), packageName,
                                System.currentTimeMillis());
                        mDevicePresenceProcessor.simulateDeviceEventByUuid(observableUuid, event);
                    }
                    break;
                }

                case "simulate-device-event-device-locked": {
                    if (Flags.devicePresence()) {
                        associationId = getNextIntArgRequired();
                        int userId = getNextIntArgRequired();
                        int event = getNextIntArgRequired();
                        String uuid = getNextArgRequired();
                        ParcelUuid parcelUuid =
                                uuid.equals("null") ? null : ParcelUuid.fromString(uuid);
                        mDevicePresenceProcessor.simulateDeviceEventOnDeviceLocked(
                                associationId, userId, event, parcelUuid);
                    }
                    break;
                }

                case "simulate-device-event-device-unlocked": {
                    if (Flags.devicePresence()) {
                        int userId = getNextIntArgRequired();
                        mDevicePresenceProcessor.simulateDeviceEventOnUserUnlocked(userId);
                    }
                    break;
                }

                case "get-backup-payload": {
                    final int userId = getNextIntArgRequired();
                    byte[] payload = mBackupRestoreProcessor.getBackupPayload(userId);
@@ -478,6 +504,17 @@ class CompanionDeviceShellCommand extends ShellCommand {
            pw.println("      Make CDM act as if the given DEVICE is BT disconnected base"
                    + "on the UUID");
            pw.println("      USE FOR DEBUGGING AND/OR TESTING PURPOSES ONLY.");

            pw.println("  simulate-device-event-device-locked"
                    + " ASSOCIATION_ID USER_ID DEVICE_EVENT PARCEL_UUID");
            pw.println("  Simulate device event when the device is locked");
            pw.println("  USE FOR DEBUGGING AND/OR TESTING PURPOSES ONLY.");

            pw.println("  simulate-device-event-device-unlocked USER_ID");
            pw.println("  Simulate device unlocked for given user. This will send corresponding");
            pw.println("  callback after simulate-device-event-device-locked");
            pw.println("  command has been called.");
            pw.println("  USE FOR DEBUGGING AND/OR TESTING PURPOSES ONLY.");
        }

        pw.println("  remove-inactive-associations");
+4 −4
Original line number Diff line number Diff line
@@ -73,9 +73,9 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener {
    private static final String TAG = "CDM_BleCompanionDeviceScanner";

    interface Callback {
        void onBleCompanionDeviceFound(int associationId);
        void onBleCompanionDeviceFound(int associationId, int userId);

        void onBleCompanionDeviceLost(int associationId);
        void onBleCompanionDeviceLost(int associationId, int userId);
    }

    private final @NonNull AssociationStore mAssociationStore;
@@ -259,7 +259,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener {
        if (DEBUG) Log.d(TAG, "  > associations=" + Arrays.toString(associations.toArray()));

        for (AssociationInfo association : associations) {
            mCallback.onBleCompanionDeviceFound(association.getId());
            mCallback.onBleCompanionDeviceFound(association.getId(), association.getUserId());
        }
    }

@@ -272,7 +272,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener {
        if (DEBUG) Log.d(TAG, "  > associations=" + Arrays.toString(associations.toArray()));

        for (AssociationInfo association : associations) {
            mCallback.onBleCompanionDeviceLost(association.getId());
            mCallback.onBleCompanionDeviceLost(association.getId(), association.getUserId());
        }
    }

+9 −48
Original line number Diff line number Diff line
@@ -34,20 +34,15 @@ import android.os.ParcelUuid;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.server.companion.association.AssociationStore;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

@SuppressLint("LongLogTag")
public class BluetoothCompanionDeviceConnectionListener
@@ -56,14 +51,13 @@ public class BluetoothCompanionDeviceConnectionListener
    private static final String TAG = "CDM_BluetoothCompanionDeviceConnectionListener";

    interface Callback {
        void onBluetoothCompanionDeviceConnected(int associationId);
        void onBluetoothCompanionDeviceConnected(int associationId, int userId);

        void onBluetoothCompanionDeviceDisconnected(int associationId);
        void onBluetoothCompanionDeviceDisconnected(int associationId, int userId);

        void onDevicePresenceEventByUuid(ObservableUuid uuid, int event);
    }

    private final UserManager mUserManager;
    private final @NonNull AssociationStore mAssociationStore;
    private final @NonNull Callback mCallback;
    /** A set of ALL connected BT device (not only companion.) */
@@ -71,21 +65,12 @@ public class BluetoothCompanionDeviceConnectionListener

    private final @NonNull ObservableUuidStore mObservableUuidStore;

    /**
     * A structure hold the connected BT devices that are pending to be reported to the companion
     * app when the user unlocks the local device per userId.
     */
    @GuardedBy("mPendingConnectedDevices")
    @NonNull
    final SparseArray<Set<BluetoothDevice>> mPendingConnectedDevices = new SparseArray<>();

    BluetoothCompanionDeviceConnectionListener(UserManager userManager,
            @NonNull AssociationStore associationStore,
            @NonNull ObservableUuidStore observableUuidStore, @NonNull Callback callback) {
        mAssociationStore = associationStore;
        mObservableUuidStore = observableUuidStore;
        mCallback = callback;
        mUserManager = userManager;
    }

    public void init(@NonNull BluetoothAdapter btAdapter) {
@@ -111,20 +96,9 @@ public class BluetoothCompanionDeviceConnectionListener
            if (DEBUG) Log.w(TAG, "Device " + btDeviceToString(device) + " is already connected.");
            return;
        }
        // Try to bind and notify the app after the phone is unlocked.
        if (!mUserManager.isUserUnlockingOrUnlocked(UserHandle.myUserId())) {
            Slog.i(TAG, "Current user is not in unlocking or unlocked stage yet. Notify "
                        + "the application when the phone is unlocked");
            synchronized (mPendingConnectedDevices) {
                Set<BluetoothDevice> bluetoothDevices = mPendingConnectedDevices.get(
                        userId, new HashSet<>());
                bluetoothDevices.add(device);
                mPendingConnectedDevices.put(userId, bluetoothDevices);
            }
        } else {

        onDeviceConnectivityChanged(device, true);
    }
    }

    /**
     * Overrides
@@ -149,19 +123,6 @@ public class BluetoothCompanionDeviceConnectionListener
            return;
        }

        // Do not need to report the connectivity since the user is not unlock the phone so
        // that cdm is not bind with the app yet.
        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
            synchronized (mPendingConnectedDevices) {
                Set<BluetoothDevice> bluetoothDevices = mPendingConnectedDevices.get(userId);
                if (bluetoothDevices != null) {
                    bluetoothDevices.remove(device);
                }
            }

            return;
        }

        onDeviceConnectivityChanged(device, false);
    }

@@ -190,16 +151,15 @@ public class BluetoothCompanionDeviceConnectionListener
            if (!association.isNotifyOnDeviceNearby()) continue;
            final int id = association.getId();
            if (connected) {
                mCallback.onBluetoothCompanionDeviceConnected(id);
                mCallback.onBluetoothCompanionDeviceConnected(id, association.getUserId());
            } else {
                mCallback.onBluetoothCompanionDeviceDisconnected(id);
                mCallback.onBluetoothCompanionDeviceDisconnected(id, association.getUserId());
            }
        }

        for (ObservableUuid uuid : observableUuids) {
            if (deviceUuids.contains(uuid.getUuid())) {
                mCallback.onDevicePresenceEventByUuid(
                        uuid, connected ? EVENT_BT_CONNECTED
                mCallback.onDevicePresenceEventByUuid(uuid, connected ? EVENT_BT_CONNECTED
                                : EVENT_BT_DISCONNECTED);
            }
        }
@@ -210,7 +170,8 @@ public class BluetoothCompanionDeviceConnectionListener
        if (DEBUG) Log.d(TAG, "onAssociation_Added() " + association);

        if (mAllConnectedDevices.containsKey(association.getDeviceMacAddress())) {
            mCallback.onBluetoothCompanionDeviceConnected(association.getId());
            mCallback.onBluetoothCompanionDeviceConnected(
                    association.getId(), association.getUserId());
        }
    }

+183 −16

File changed.

Preview size limit exceeded, changes collapsed.