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

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

Merge "Introduce Result_xxx for CDM"

parents d0118115 7d0cd3f6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -9085,6 +9085,11 @@ package android.companion {
    method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void stopObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException;
    field public static final String EXTRA_ASSOCIATION = "android.companion.extra.ASSOCIATION";
    field @Deprecated public static final String EXTRA_DEVICE = "android.companion.extra.DEVICE";
    field public static final int RESULT_CANCELED = 0; // 0x0
    field public static final int RESULT_DISCOVERY_TIMEOUT = 2; // 0x2
    field public static final int RESULT_INTERNAL_ERROR = 3; // 0x3
    field public static final int RESULT_OK = -1; // 0xffffffff
    field public static final int RESULT_USER_REJECTED = 1; // 0x1
  }
  public abstract static class CompanionDeviceManager.Callback {
+47 −17
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.Manifest.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_P
import static android.Manifest.permission.REQUEST_COMPANION_PROFILE_COMPUTER;
import static android.Manifest.permission.REQUEST_COMPANION_PROFILE_WATCH;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -56,6 +57,8 @@ import libcore.io.IoUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -84,33 +87,52 @@ public final class CompanionDeviceManager {
    private static final boolean DEBUG = false;
    private static final String LOG_TAG = "CDM_CompanionDeviceManager";

    /** @hide */
    @IntDef(prefix = {"RESULT_"}, value = {
            RESULT_OK,
            RESULT_CANCELED,
            RESULT_USER_REJECTED,
            RESULT_DISCOVERY_TIMEOUT,
            RESULT_INTERNAL_ERROR
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface ResultCode {}

    /**
     * The result code to propagate back to the originating activity, indicates the association
     * dialog is explicitly declined by the users.
     *
     * @hide
     * The result code to propagate back to the user activity, indicates the association
     * is created successfully.
     */
    public static final int RESULT_OK = -1;

    /**
     * The result code to propagate back to the user activity, indicates if the association dialog
     * is implicitly cancelled.
     * E.g. phone is locked, switch to another app or press outside the dialog.
     */
    public static final int RESULT_CANCELED = 0;

    /**
     * The result code to propagate back to the user activity, indicates the association dialog
     * is explicitly declined by the users.
     */
    public static final int RESULT_USER_REJECTED = 1;

    /**
     * The result code to propagate back to the originating activity, indicates the association
     * The result code to propagate back to the user activity, indicates the association
     * dialog is dismissed if there's no device found after 20 seconds.
     *
     * @hide
     */
    public static final int RESULT_DISCOVERY_TIMEOUT = 2;

    /**
     * The result code to propagate back to the originating activity, indicates the internal error
     * The result code to propagate back to the user activity, indicates the internal error
     * in CompanionDeviceManager.
     *
     * @hide
     */
    public static final int RESULT_INTERNAL_ERROR = 3;

    /**
     * Requesting applications will receive the String in {@link Callback#onFailure} if the
     *  association dialog is explicitly declined by the users. e.g. press the Don't allow button.
     * association dialog is explicitly declined by the users. E.g. press the Don't allow
     * button.
     *
     * @hide
     */
@@ -118,15 +140,23 @@ public final class CompanionDeviceManager {

    /**
     * Requesting applications will receive the String in {@link Callback#onFailure} if there's
     *  no device found after 20 seconds.
     * no devices found after 20 seconds.
     *
     * @hide
     */
    public static final String REASON_DISCOVERY_TIMEOUT = "discovery_timeout";

    /**
     * Requesting applications will receive the String in {@link Callback#onFailure} if there's
     * an internal error.
     *
     * @hide
     */
    public static final String REASON_INTERNAL_ERROR = "internal_error";

    /**
     * Requesting applications will receive the String in {@link Callback#onFailure} if the
     *  association dialog is in-explicitly declined by the users. e.g. phone is locked, switch to
     * association dialog is implicitly cancelled. E.g. phone is locked, switch to
     * another app or press outside the dialog.
     *
     * @hide
+20 −10
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER;
import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH;
import static android.companion.CompanionDeviceManager.REASON_CANCELED;
import static android.companion.CompanionDeviceManager.REASON_DISCOVERY_TIMEOUT;
import static android.companion.CompanionDeviceManager.REASON_INTERNAL_ERROR;
import static android.companion.CompanionDeviceManager.REASON_USER_REJECTED;
import static android.companion.CompanionDeviceManager.RESULT_DISCOVERY_TIMEOUT;
import static android.companion.CompanionDeviceManager.RESULT_INTERNAL_ERROR;
@@ -214,7 +215,8 @@ public class CompanionDeviceActivity extends FragmentActivity implements

            Log.i(TAG, "Cancelling the user confirmation");

            cancel(false, false);
            cancel(/* discoveryTimeOut */ false,
                    /* userRejected */ false, /* internalError */ false);
            return;
        }

@@ -241,7 +243,8 @@ public class CompanionDeviceActivity extends FragmentActivity implements

        // TODO: handle config changes without cancelling.
        if (!isDone()) {
            cancel(/* discoveryTimeOut */ false, /* userRejected */ false); // will finish()
            cancel(/* discoveryTimeOut */ false,
                    /* userRejected */ false, /* internalError */ false); // will finish()
        }
    }

@@ -326,7 +329,8 @@ public class CompanionDeviceActivity extends FragmentActivity implements
    private void onDiscoveryStateChanged(DiscoveryState newState) {
        if (newState == FINISHED_TIMEOUT
                && CompanionDeviceDiscoveryService.getScanResult().getValue().isEmpty()) {
            cancel(/* discoveryTimeOut */ true, /* userRejected */ false);
            cancel(/* discoveryTimeOut */ true,
                    /* userRejected */ false, /* internalError */ false);
        }
    }

@@ -364,12 +368,14 @@ public class CompanionDeviceActivity extends FragmentActivity implements
        mCdmServiceReceiver.send(RESULT_CODE_ASSOCIATION_APPROVED, data);
    }

    private void cancel(boolean discoveryTimeout, boolean userRejected) {
    private void cancel(boolean discoveryTimeout, boolean userRejected, boolean internalError) {
        if (DEBUG) {
            Log.i(TAG, "cancel(), discoveryTimeout="
                    + discoveryTimeout
                    + ", userRejected="
                    + userRejected, new Exception("Stack Trace Dump"));
                    + userRejected
                    + ", internalError="
                    + internalError, new Exception("Stack Trace Dump"));
        }

        if (isDone()) {
@@ -391,9 +397,12 @@ public class CompanionDeviceActivity extends FragmentActivity implements
        } else if (discoveryTimeout) {
            cancelReason = REASON_DISCOVERY_TIMEOUT;
            resultCode = RESULT_DISCOVERY_TIMEOUT;
        } else if (internalError) {
            cancelReason = REASON_INTERNAL_ERROR;
            resultCode = RESULT_INTERNAL_ERROR;
        } else {
            cancelReason = REASON_CANCELED;
            resultCode = RESULT_CANCELED;
            resultCode = CompanionDeviceManager.RESULT_CANCELED;
        }

        // First send callback to the app directly...
@@ -449,7 +458,8 @@ public class CompanionDeviceActivity extends FragmentActivity implements
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Package u" + userId + "/" + packageName + " not found.");
            setResultAndFinish(null, RESULT_INTERNAL_ERROR);
            cancel(/* discoveryTimeout */ false,
                    /* userRejected */ false, /* internalError */ true);
            return;
        }

@@ -627,7 +637,7 @@ public class CompanionDeviceActivity extends FragmentActivity implements
        // Disable the button, to prevent more clicks.
        v.setEnabled(false);

        cancel(/* discoveryTimeout */ false, /* userRejected */ true);
        cancel(/* discoveryTimeout */ false, /* userRejected */ true, /* internalError */ false);
    }

    private void onShowHelperDialog(View view) {
@@ -652,7 +662,7 @@ public class CompanionDeviceActivity extends FragmentActivity implements
                        final AssociationInfo association = data.getParcelable(
                                EXTRA_ASSOCIATION, AssociationInfo.class);
                        requireNonNull(association);
                        setResultAndFinish(association, RESULT_OK);
                        setResultAndFinish(association, CompanionDeviceManager.RESULT_OK);
                    } else {
                        setResultAndFinish(null, resultCode);
                    }
@@ -661,7 +671,7 @@ public class CompanionDeviceActivity extends FragmentActivity implements

    @Override
    public void onShowHelperDialogFailed() {
        setResultAndFinish(null, RESULT_INTERNAL_ERROR);
        cancel(/* discoveryTimeout */ false, /* userRejected */ false, /* internalError */ true);
    }

    @Override
+4 −4
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.app.PendingIntent.FLAG_ONE_SHOT;
import static android.companion.CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME;
import static android.companion.CompanionDeviceManager.REASON_INTERNAL_ERROR;
import static android.companion.CompanionDeviceManager.RESULT_INTERNAL_ERROR;
import static android.content.ComponentName.createRelative;

import static com.android.server.companion.CompanionDeviceManagerService.DEBUG;
@@ -40,7 +42,6 @@ import android.app.PendingIntent;
import android.companion.AssociatedDevice;
import android.companion.AssociationInfo;
import android.companion.AssociationRequest;
import android.companion.CompanionDeviceManager;
import android.companion.IAssociationRequestCallback;
import android.content.ComponentName;
import android.content.Context;
@@ -348,8 +349,7 @@ class AssociationRequestsProcessor {
            // Send the association back via the app's callback
            if (callback != null) {
                try {
                    // TODO: update to INTERNAL_ERROR once it's added.
                    callback.onFailure(CompanionDeviceManager.REASON_CANCELED);
                    callback.onFailure(REASON_INTERNAL_ERROR);
                } catch (RemoteException ignore) {
                }
            }
@@ -358,7 +358,7 @@ class AssociationRequestsProcessor {
            // back to the app via Activity.setResult().
            if (resultReceiver != null) {
                final Bundle data = new Bundle();
                resultReceiver.send(CompanionDeviceManager.RESULT_INTERNAL_ERROR, data);
                resultReceiver.send(RESULT_INTERNAL_ERROR, data);
            }
        }
    }