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

Commit a38fbf63 authored by Eugene Susla's avatar Eugene Susla
Browse files

Unbind from service on app killed and dedup association requests

1. Listen to calling package binder death stopping the scanning on that.
2. Don't restart scanning when a request with the same values was made.

Bug: 30932767
Test: 1.:
  - Using a test app start scanning and kill the app.
  - In debug mode ensure that DeviceDiscoveryService#stopScan gets triggered
2.:
  - Start scanning and rotate the device while device chooser is visible
  - Ensure no visible loss of state is happening
Change-Id: If126a2c963da90172a956fbd88e6b3dcd7ac8b01
parent cf0341ec
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ import android.nfc.NfcManager;
import android.os.BatteryManager;
import android.os.BatteryStats;
import android.os.Build;
import android.os.Debug;
import android.os.DropBoxManager;
import android.os.HardwarePropertiesManager;
import android.os.IBatteryPropertiesRegistrar;
+15 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.internal.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * A request for the user to select a companion device to associate with.
@@ -68,6 +69,20 @@ public final class AssociationRequest implements Parcelable {
        return mDeviceFilters;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AssociationRequest that = (AssociationRequest) o;
        return mSingleDevice == that.mSingleDevice &&
                Objects.equals(mDeviceFilters, that.mDeviceFilters);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mSingleDevice, mDeviceFilters);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeByte((byte) (mSingleDevice ? 1 : 0));
+17 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.internal.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;

/**
@@ -122,6 +123,22 @@ public final class BluetoothDeviceFilter implements DeviceFilter<BluetoothDevice
        dest.writeParcelableList(mServiceUuidMasks, flags);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BluetoothDeviceFilter that = (BluetoothDeviceFilter) o;
        return Objects.equals(mNamePattern, that.mNamePattern) &&
                Objects.equals(mAddress, that.mAddress) &&
                Objects.equals(mServiceUuids, that.mServiceUuids) &&
                Objects.equals(mServiceUuidMasks, that.mServiceUuidMasks);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mNamePattern, mAddress, mServiceUuids, mServiceUuidMasks);
    }

    @Override
    public int describeContents() {
        return 0;
+54 −10
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ import com.android.internal.util.BitUtils;
import com.android.internal.util.ObjectUtils;
import com.android.internal.util.Preconditions;

import java.util.Arrays;
import java.util.Objects;
import java.util.regex.Pattern;

/**
@@ -159,10 +161,40 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
        return DeviceFilter.MEDIUM_TYPE_BLUETOOTH_LE;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BluetoothLEDeviceFilter that = (BluetoothLEDeviceFilter) o;
        return mRenameBytesFrom == that.mRenameBytesFrom &&
                mRenameBytesTo == that.mRenameBytesTo &&
                mRenameBytesReverseOrder == that.mRenameBytesReverseOrder &&
                Objects.equals(mNamePattern, that.mNamePattern) &&
                Objects.equals(mScanFilter, that.mScanFilter) &&
                Arrays.equals(mRawDataFilter, that.mRawDataFilter) &&
                Arrays.equals(mRawDataFilterMask, that.mRawDataFilterMask) &&
                Objects.equals(mRenamePrefix, that.mRenamePrefix) &&
                Objects.equals(mRenameSuffix, that.mRenameSuffix);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mNamePattern, mScanFilter, mRawDataFilter, mRawDataFilterMask,
                mRenamePrefix, mRenameSuffix, mRenameBytesFrom, mRenameBytesTo,
                mRenameBytesReverseOrder);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(patternToString(getNamePattern()));
        dest.writeParcelable(mScanFilter, flags);
        dest.writeByteArray(mRawDataFilter);
        dest.writeByteArray(mRawDataFilterMask);
        dest.writeString(mRenamePrefix);
        dest.writeString(mRenameSuffix);
        dest.writeInt(mRenameBytesFrom);
        dest.writeInt(mRenameBytesTo);
        dest.writeBoolean(mRenameBytesReverseOrder);
    }

    @Override
@@ -174,13 +206,23 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
            = new Creator<BluetoothLEDeviceFilter>() {
        @Override
        public BluetoothLEDeviceFilter createFromParcel(Parcel in) {
            return new BluetoothLEDeviceFilter.Builder()
            Builder builder = new Builder()
                    .setNamePattern(patternFromString(in.readString()))
                    .setScanFilter(in.readParcelable(null))
                    .setRawDataFilter(in.readBlob(), in.readBlob())
                    .setRename(in.readString(), in.readString(),
                            in.readInt(), in.readInt(), in.readBoolean())
                    .build();
                    .setScanFilter(in.readParcelable(null));
            byte[] rawDataFilter = in.createByteArray();
            byte[] rawDataFilterMask = in.createByteArray();
            if (rawDataFilter != null) {
                builder.setRawDataFilter(rawDataFilter, rawDataFilterMask);
            }
            String renamePrefix = in.readString();
            String suffix = in.readString();
            int bytesFrom = in.readInt();
            int bytesTo = in.readInt();
            boolean bytesReverseOrder = in.readBoolean();
            if (renamePrefix != null) {
                builder.setRename(renamePrefix, suffix, bytesFrom, bytesTo, bytesReverseOrder);
            }
            return builder.build();
        }

        @Override
@@ -240,12 +282,14 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
         */
        @NonNull
        public Builder setRawDataFilter(@NonNull byte[] rawDataFilter,
                @NonNull byte[] rawDataFilterMask) {
                @Nullable byte[] rawDataFilterMask) {
            checkNotUsed();
            checkArgument(rawDataFilter.length == rawDataFilterMask.length,
            Preconditions.checkNotNull(rawDataFilter);
            checkArgument(rawDataFilterMask == null ||
                    rawDataFilter.length == rawDataFilterMask.length,
                    "Mask and filter should be the same length");
            mRawDataFilter = Preconditions.checkNotNull(rawDataFilter);
            mRawDataFilterMask = Preconditions.checkNotNull(rawDataFilterMask);
            mRawDataFilter = rawDataFilter;
            mRawDataFilterMask = rawDataFilterMask;
            return this;
        }

+6 −6
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package android.companion;


import static com.android.internal.util.Preconditions.checkNotNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
@@ -24,7 +26,6 @@ import android.content.Context;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;

@@ -43,7 +44,7 @@ import java.util.List;
 */
public final class CompanionDeviceManager {

    private static final boolean DEBUG = false; //TODO
    private static final boolean DEBUG = false;
    private static final String LOG_TAG = "CompanionDeviceManager";

    /**
@@ -129,10 +130,9 @@ public final class CompanionDeviceManager {
        if (!checkFeaturePresent()) {
            return;
        }

        final Handler finalHandler = handler != null
                ? handler
                : new Handler(Looper.getMainLooper());
        checkNotNull(request, "Request cannot be null");
        checkNotNull(callback, "Callback cannot be null");
        final Handler finalHandler = Handler.mainIfNull(handler);
        try {
            mService.associate(
                    request,
Loading