This effectively treats chooser activity pause event as cancel.
Bug:
30932767
Test: Install two toy apps and call associate API from both.
Ensure foreground app always end up showing fresh data.
Change-Id: I49943959c2b4f05f2e1d49603fd472b3e0c47213
/** @hide */
interface ICompanionDeviceDiscoveryServiceCallback {
oneway void onDeviceSelected(String packageName, int userId, String deviceAddress);
+ oneway void onDeviceSelectionCancel();
}
}
mPairButton = findViewById(R.id.button_pair);
- mPairButton.setOnClickListener((view) ->
- onPairTapped(getService().mSelectedDevice));
+ mPairButton.setOnClickListener(v -> onPairTapped(getService().mSelectedDevice));
updatePairButtonEnabled();
mCancelButton = findViewById(R.id.button_cancel);
- mCancelButton.setOnClickListener((view) -> {
- setResult(RESULT_CANCELED);
- finish();
- });
+ mCancelButton.setOnClickListener(v -> cancel());
+ }
+
+ private void cancel() {
+ getService().onCancel();
+ setResult(RESULT_CANCELED);
+ finish();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if (!isFinishing()) {
+ cancel();
+ }
}
private CharSequence getCallingAppName() {
reset();
} else if (DEBUG) Log.i(LOG_TAG, "startDiscovery: duplicate request: " + request);
-
-
if (!ArrayUtils.isEmpty(mDevicesFound)) {
onReadyToShowUI();
}
}
}
+ void onCancel() {
+ try {
+ mServiceCallback.onDeviceSelectionCancel();
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
class DevicesAdapter extends ArrayAdapter<DeviceFilterPair> {
//TODO wifi icon
private Drawable BLUETOOTH_ICON = icon(android.R.drawable.stat_sys_data_bluetooth);
@Override
public void binderDied() {
- Handler.getMain().post(this::handleBinderDied);
+ Handler.getMain().post(this::cleanup);
}
- private void handleBinderDied() {
+ private void cleanup() {
mServiceConnection = unbind(mServiceConnection);
mFindDeviceCallback = unlinkToDeath(mFindDeviceCallback, this, 0);
}
}
}
-
@Override
public List<String> getAssociations(String callingPackage) {
return CollectionUtils.map(
mFindDeviceCallback.asBinder().linkToDeath(
CompanionDeviceManagerService.this, 0);
} catch (RemoteException e) {
- handleBinderDied();
+ cleanup();
return;
}
try {
@Override
public void onDeviceSelected(String packageName, int userId, String deviceAddress) {
- //TODO unbind
updateSpecialAccessPermissionForAssociatedPackage(packageName, userId);
recordAssociation(packageName, deviceAddress);
+ cleanup();
}
+
+ @Override
+ public void onDeviceSelectionCancel() {
+ cleanup();
+ }
+
};
}