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

Commit 48059256 authored by Sean Pont's avatar Sean Pont Committed by Android (Google) Code Review
Browse files

Merge "Add QuickAccessWallet API"

parents 4f57d9a7 d00aefb4
Loading
Loading
Loading
Loading
+90 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ package android {
    field public static final String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
    field public static final String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
    field public static final String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
    field public static final String BIND_QUICK_ACCESS_WALLET_SERVICE = "android.permission.BIND_QUICK_ACCESS_WALLET_SERVICE";
    field public static final String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE";
    field public static final String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS";
    field public static final String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE";
@@ -40059,6 +40060,7 @@ package android.provider {
    field public static final String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
    field public static final String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
    field public static final String ACTION_PROCESS_WIFI_EASY_CONNECT_URI = "android.settings.PROCESS_WIFI_EASY_CONNECT_URI";
    field public static final String ACTION_QUICK_ACCESS_WALLET_SETTINGS = "android.settings.QUICK_ACCESS_WALLET_SETTINGS";
    field public static final String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
    field public static final String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
    field public static final String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
@@ -43234,6 +43236,94 @@ package android.service.notification {
}
package android.service.quickaccesswallet {
  public final class GetWalletCardsCallback {
    method public void onFailure(@NonNull android.service.quickaccesswallet.GetWalletCardsError);
    method public void onSuccess(@NonNull android.service.quickaccesswallet.GetWalletCardsResponse);
  }
  public final class GetWalletCardsError implements android.os.Parcelable {
    ctor public GetWalletCardsError(@Nullable android.graphics.drawable.Icon, @Nullable CharSequence);
    method public int describeContents();
    method @Nullable public android.graphics.drawable.Icon getIcon();
    method @Nullable public CharSequence getMessage();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.quickaccesswallet.GetWalletCardsError> CREATOR;
  }
  public final class GetWalletCardsRequest implements android.os.Parcelable {
    ctor public GetWalletCardsRequest(int, int, int, int);
    method public int describeContents();
    method public int getCardHeightPx();
    method public int getCardWidthPx();
    method public int getIconSizePx();
    method public int getMaxCards();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.quickaccesswallet.GetWalletCardsRequest> CREATOR;
  }
  public final class GetWalletCardsResponse implements android.os.Parcelable {
    ctor public GetWalletCardsResponse(@NonNull java.util.List<android.service.quickaccesswallet.WalletCard>, int);
    method public int describeContents();
    method public int getSelectedIndex();
    method @NonNull public java.util.List<android.service.quickaccesswallet.WalletCard> getWalletCards();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.quickaccesswallet.GetWalletCardsResponse> CREATOR;
  }
  public abstract class QuickAccessWalletService extends android.app.Service {
    ctor public QuickAccessWalletService();
    method @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
    method public abstract void onWalletCardSelected(@NonNull android.service.quickaccesswallet.SelectWalletCardRequest);
    method public abstract void onWalletCardsRequested(@NonNull android.service.quickaccesswallet.GetWalletCardsRequest, @NonNull android.service.quickaccesswallet.GetWalletCardsCallback);
    method public abstract void onWalletDismissed();
    method public final void sendWalletServiceEvent(@NonNull android.service.quickaccesswallet.WalletServiceEvent);
    field public static final String ACTION_DISMISS_WALLET = "android.service.quickaccesswallet.action.DISMISS_WALLET";
    field public static final String ACTION_VIEW_WALLET = "android.service.quickaccesswallet.action.VIEW_WALLET";
    field public static final String ACTION_VIEW_WALLET_SETTINGS = "android.service.quickaccesswallet.action.VIEW_WALLET_SETTINGS";
    field public static final String SERVICE_INTERFACE = "android.service.quickaccesswallet.QuickAccessWalletService";
    field public static final String SERVICE_META_DATA = "android.quickaccesswallet";
  }
  public final class SelectWalletCardRequest implements android.os.Parcelable {
    ctor public SelectWalletCardRequest(@NonNull String);
    method public int describeContents();
    method @NonNull public String getCardId();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.quickaccesswallet.SelectWalletCardRequest> CREATOR;
  }
  public final class WalletCard implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public android.graphics.drawable.Icon getCardIcon();
    method @NonNull public String getCardId();
    method @NonNull public android.graphics.drawable.Icon getCardImage();
    method @Nullable public CharSequence getCardLabel();
    method @NonNull public CharSequence getContentDescription();
    method @NonNull public android.app.PendingIntent getPendingIntent();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.quickaccesswallet.WalletCard> CREATOR;
  }
  public static final class WalletCard.Builder {
    ctor public WalletCard.Builder(@NonNull String, @NonNull android.graphics.drawable.Icon, @NonNull CharSequence, @NonNull android.app.PendingIntent);
    method @NonNull public android.service.quickaccesswallet.WalletCard build();
    method @NonNull public android.service.quickaccesswallet.WalletCard.Builder setCardIcon(@Nullable android.graphics.drawable.Icon);
    method @NonNull public android.service.quickaccesswallet.WalletCard.Builder setCardLabel(@Nullable CharSequence);
  }
  public final class WalletServiceEvent implements android.os.Parcelable {
    ctor public WalletServiceEvent(int);
    method public int describeContents();
    method public int getEventType();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.quickaccesswallet.WalletServiceEvent> CREATOR;
    field public static final int TYPE_NFC_PAYMENT_STARTED = 1; // 0x1
  }
}
package android.service.quicksettings {
  public final class Tile implements android.os.Parcelable {
+15 −0
Original line number Diff line number Diff line
@@ -1968,6 +1968,21 @@ public final class Settings {
    public static final String ACTION_REQUEST_SET_AUTOFILL_SERVICE =
            "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
    /**
     * Activity Action: Show screen for controlling the Quick Access Wallet.
     * <p>
     * In some cases, a matching Activity may not exist, so ensure you
     * safeguard against this.
     * <p>
     * Input: The Intent's data URI specifies the application package name
     * to be shown, with the "package" scheme.  That is "package:com.my.app".
     * <p>
     * Output: Nothing.
     */
    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    public static final String ACTION_QUICK_ACCESS_WALLET_SETTINGS =
            "android.settings.QUICK_ACCESS_WALLET_SETTINGS";
    /**
     * Activity Action: Show screen for controlling which apps have access on volume directories.
     * <p>
+92 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.quickaccesswallet;

import android.annotation.NonNull;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;

/**
 * Handles response from the {@link QuickAccessWalletService} for {@link GetWalletCardsRequest}
 */
public final class GetWalletCardsCallback {

    private static final String TAG = "QAWalletCallback";

    private final IQuickAccessWalletServiceCallbacks mCallback;
    private final Handler mHandler;
    private boolean mCalled;

    /**
     * @hide
     */
    GetWalletCardsCallback(IQuickAccessWalletServiceCallbacks callback, Handler handler) {
        mCallback = callback;
        mHandler = handler;
    }

    /**
     * Notifies the Android System that an {@link QuickAccessWalletService#onWalletCardsRequested}
     * was successfully handled by the service.
     *
     * @param response The response contains the list of {@link WalletCard walletCards} to be shown
     *                 to the user as well as the index of the card that should initially be
     *                 presented as the selected card.
     */
    public void onSuccess(@NonNull GetWalletCardsResponse response) {
        mHandler.post(() -> onSuccessInternal(response));
    }

    /**
     * Notifies the Android System that an {@link QuickAccessWalletService#onWalletCardsRequested}
     * could not be handled by the service.
     *
     * @param error The error message. <b>Note: </b> this message should <b>not</b> contain PII
     *              (Personally Identifiable Information, such as username or email address).
     * @throws IllegalStateException if this method or {@link #onSuccess} was already called.
     */
    public void onFailure(@NonNull GetWalletCardsError error) {
        mHandler.post(() -> onFailureInternal(error));
    }

    private void onSuccessInternal(GetWalletCardsResponse response) {
        if (mCalled) {
            Log.w(TAG, "already called");
            return;
        }
        mCalled = true;
        try {
            mCallback.onGetWalletCardsSuccess(response);
        } catch (RemoteException e) {
            Log.e(TAG, "Error returning wallet cards", e);
        }
    }

    private void onFailureInternal(GetWalletCardsError error) {
        if (mCalled) {
            Log.w(TAG, "already called");
            return;
        }
        mCalled = true;
        try {
            mCallback.onGetWalletCardsFailure(error);
        } catch (RemoteException e) {
            Log.e(TAG, "Error returning failure message", e);
        }
    }
}
+19 −0
Original line number Diff line number Diff line
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.quickaccesswallet;

parcelable GetWalletCardsError;
 No newline at end of file
+100 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.quickaccesswallet;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.drawable.Icon;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

/**
 * Error response for an {@link GetWalletCardsRequest}.
 */
public final class GetWalletCardsError implements Parcelable {

    private final Icon mIcon;
    private final CharSequence mMessage;

    /**
     * Construct a new error response. If provided, the icon and message will be displayed to the
     * user.
     *
     * @param icon    an icon to be shown to the user next to the message. Optional.
     * @param message message to be shown to the user. Optional.
     */
    public GetWalletCardsError(@Nullable Icon icon, @Nullable CharSequence message) {
        mIcon = icon;
        mMessage = message;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        if (mIcon == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            mIcon.writeToParcel(dest, flags);
        }
        TextUtils.writeToParcel(mMessage, dest, flags);
    }

    private static GetWalletCardsError readFromParcel(Parcel source) {
        Icon icon = source.readByte() == 0 ? null : Icon.CREATOR.createFromParcel(source);
        CharSequence message = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
        return new GetWalletCardsError(icon, message);
    }

    @NonNull
    public static final Creator<GetWalletCardsError> CREATOR =
            new Creator<GetWalletCardsError>() {
                @Override
                public GetWalletCardsError createFromParcel(Parcel source) {
                    return readFromParcel(source);
                }

                @Override
                public GetWalletCardsError[] newArray(int size) {
                    return new GetWalletCardsError[size];
                }
            };

    /**
     * An icon that may be displayed with the message to provide a visual indication of why cards
     * could not be provided in the Quick Access Wallet.
     */
    @Nullable
    public Icon getIcon() {
        return mIcon;
    }

    /**
     * A localized message that may be shown to the user in the event that the wallet cards cannot
     * be retrieved. <b>Note: </b> this message should <b>not</b> contain PII (Personally
     * Identifiable Information, such as username or email address).
     */
    @Nullable
    public CharSequence getMessage() {
        return mMessage;
    }
}
Loading