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

Commit db7588db authored by Evan Chen's avatar Evan Chen Committed by Android (Google) Code Review
Browse files

Merge "Send BLE callback after phone is unlocked if the app is not directBootAware." into main

parents 7fa918d2 d6ff4bbe
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.