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

Commit 6ed45d8c authored by Eugene Susla's avatar Eugene Susla
Browse files

CompanionDeviceManager

This introduces an API for apps that support companion devices to provide a
more streamlined flow for pairing and setting up the device

Bug: 30932767
Test: Using a toy app, invoke the newly introduced API (CompanionDeviceManager),
 and go through the flow. Ensure filtering works, and device is returned to
 the calling app. Ensure the calling app can pair to the selected device.
Change-Id: I0aeb653afd65e4adead13ea9c7248ec20971b04a
parent 556897f7
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -295,6 +295,10 @@ LOCAL_SRC_FILES += \
	core/java/android/print/IWriteResultCallback.aidl \
	core/java/android/printservice/IPrintService.aidl \
	core/java/android/printservice/IPrintServiceClient.aidl \
	core/java/android/companion/ICompanionDeviceManager.aidl \
	core/java/android/companion/ICompanionDeviceManagerService.aidl \
	core/java/android/companion/ICompanionDeviceManagerServiceCallback.aidl \
	core/java/android/companion/IOnAssociateCallback.aidl \
	core/java/android/service/dreams/IDreamManager.aidl \
	core/java/android/service/dreams/IDreamService.aidl \
	core/java/android/service/persistentdata/IPersistentDataBlockService.aidl \
+60 −0
Original line number Diff line number Diff line
@@ -7950,6 +7950,65 @@ package android.bluetooth.le {
}
package android.companion {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
  }
  public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
    method public android.companion.AssociationRequest<F> build();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
    method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
    method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
  }
  public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothDeviceFilter> CREATOR;
  }
  public static final class BluetoothDeviceFilter.Builder {
    ctor public BluetoothDeviceFilter.Builder();
    method public android.companion.BluetoothDeviceFilter.Builder addServiceUuid(android.os.ParcelUuid, android.os.ParcelUuid);
    method public android.companion.BluetoothDeviceFilter build();
    method public android.companion.BluetoothDeviceFilter.Builder setAddress(java.lang.String);
    method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
  }
  public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
  }
  public static final class BluetoothLEDeviceFilter.Builder {
    ctor public BluetoothLEDeviceFilter.Builder();
    method public android.companion.BluetoothLEDeviceFilter build();
    method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
    method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
  }
  public final class CompanionDeviceManager {
    method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
  }
  public static abstract class CompanionDeviceManager.Callback {
    ctor public CompanionDeviceManager.Callback();
    method public abstract void onDeviceFound(android.content.IntentSender);
    method public abstract void onFailure(java.lang.CharSequence);
  }
  public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
  }
}
package android.content {
  public abstract class AbstractThreadedSyncAdapter {
@@ -8562,6 +8621,7 @@ package android.content {
    field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
    field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
    field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
    field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companion_device";
    field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
    field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
    field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
+60 −0
Original line number Diff line number Diff line
@@ -8340,6 +8340,65 @@ package android.bluetooth.le {
}
package android.companion {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
  }
  public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
    method public android.companion.AssociationRequest<F> build();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
    method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
    method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
  }
  public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothDeviceFilter> CREATOR;
  }
  public static final class BluetoothDeviceFilter.Builder {
    ctor public BluetoothDeviceFilter.Builder();
    method public android.companion.BluetoothDeviceFilter.Builder addServiceUuid(android.os.ParcelUuid, android.os.ParcelUuid);
    method public android.companion.BluetoothDeviceFilter build();
    method public android.companion.BluetoothDeviceFilter.Builder setAddress(java.lang.String);
    method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
  }
  public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
  }
  public static final class BluetoothLEDeviceFilter.Builder {
    ctor public BluetoothLEDeviceFilter.Builder();
    method public android.companion.BluetoothLEDeviceFilter build();
    method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
    method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
  }
  public final class CompanionDeviceManager {
    method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
  }
  public static abstract class CompanionDeviceManager.Callback {
    ctor public CompanionDeviceManager.Callback();
    method public abstract void onDeviceFound(android.content.IntentSender);
    method public abstract void onFailure(java.lang.CharSequence);
  }
  public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
  }
}
package android.content {
  public abstract class AbstractThreadedSyncAdapter {
@@ -8959,6 +9018,7 @@ package android.content {
    field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
    field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
    field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
    field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companion_device";
    field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
    field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
    field public static final java.lang.String CONTEXTHUB_SERVICE = "contexthub";
+60 −0
Original line number Diff line number Diff line
@@ -7973,6 +7973,65 @@ package android.bluetooth.le {
}
package android.companion {
  public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
  }
  public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
    method public android.companion.AssociationRequest<F> build();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
    method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
    method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
    method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
  }
  public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothDeviceFilter> CREATOR;
  }
  public static final class BluetoothDeviceFilter.Builder {
    ctor public BluetoothDeviceFilter.Builder();
    method public android.companion.BluetoothDeviceFilter.Builder addServiceUuid(android.os.ParcelUuid, android.os.ParcelUuid);
    method public android.companion.BluetoothDeviceFilter build();
    method public android.companion.BluetoothDeviceFilter.Builder setAddress(java.lang.String);
    method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
  }
  public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
  }
  public static final class BluetoothLEDeviceFilter.Builder {
    ctor public BluetoothLEDeviceFilter.Builder();
    method public android.companion.BluetoothLEDeviceFilter build();
    method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
    method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
  }
  public final class CompanionDeviceManager {
    method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
    field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
  }
  public static abstract class CompanionDeviceManager.Callback {
    ctor public CompanionDeviceManager.Callback();
    method public abstract void onDeviceFound(android.content.IntentSender);
    method public abstract void onFailure(java.lang.CharSequence);
  }
  public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
  }
}
package android.content {
  public abstract class AbstractThreadedSyncAdapter {
@@ -8587,6 +8646,7 @@ package android.content {
    field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
    field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
    field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
    field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companion_device";
    field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
    field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
    field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
+14 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import android.app.usage.StorageStatsManager;
import android.app.usage.UsageStatsManager;
import android.appwidget.AppWidgetManager;
import android.bluetooth.BluetoothManager;
import android.companion.CompanionDeviceManager;
import android.companion.ICompanionDeviceManager;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.IRestrictionsManager;
@@ -634,6 +636,18 @@ final class SystemServiceRegistry {
                        UserHandle.getAppId(Process.myUid()));
            }});

        registerService(Context.COMPANION_DEVICE_SERVICE, CompanionDeviceManager.class,
                new CachedServiceFetcher<CompanionDeviceManager>() {
                    @Override
                    public CompanionDeviceManager createService(ContextImpl ctx)
                            throws ServiceNotFoundException {
                        IBinder iBinder =
                                ServiceManager.getServiceOrThrow(Context.COMPANION_DEVICE_SERVICE);
                        ICompanionDeviceManager service =
                                ICompanionDeviceManager.Stub.asInterface(iBinder);
                        return new CompanionDeviceManager(service, ctx);
                    }});

        registerService(Context.CONSUMER_IR_SERVICE, ConsumerIrManager.class,
                new CachedServiceFetcher<ConsumerIrManager>() {
            @Override
Loading