Loading core/java/android/service/autofill/FillResponse.java +22 −10 Original line number Diff line number Diff line Loading @@ -23,15 +23,16 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.content.IntentSender; import android.content.pm.ParceledListSlice; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.widget.RemoteViews; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Response for a {@link Loading @@ -41,7 +42,7 @@ import java.util.Arrays; */ public final class FillResponse implements Parcelable { private final @Nullable ArrayList<Dataset> mDatasets; private final @Nullable ParceledListSlice<Dataset> mDatasets; private final @Nullable SaveInfo mSaveInfo; private final @Nullable Bundle mClientState; private final @Nullable RemoteViews mPresentation; Loading @@ -51,7 +52,7 @@ public final class FillResponse implements Parcelable { private int mRequestId; private FillResponse(@NonNull Builder builder) { mDatasets = builder.mDatasets; mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null; mSaveInfo = builder.mSaveInfo; mClientState = builder.mCLientState; mPresentation = builder.mPresentation; Loading @@ -67,8 +68,8 @@ public final class FillResponse implements Parcelable { } /** @hide */ public @Nullable ArrayList<Dataset> getDatasets() { return mDatasets; public @Nullable List<Dataset> getDatasets() { return (mDatasets != null) ? mDatasets.getList() : null; } /** @hide */ Loading Loading @@ -143,12 +144,13 @@ public final class FillResponse implements Parcelable { * for the user to trigger your authentication flow. * * <p>When a user triggers autofill, the system launches the provided intent * whose extras will have the {@link AutofillManager#EXTRA_ASSIST_STRUCTURE screen * whose extras will have the * {@link android.view.autofill.AutofillManager#EXTRA_ASSIST_STRUCTURE screen * content} and your {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE * client state}. Once you complete your authentication flow you should set the * {@link Activity} result to {@link android.app.Activity#RESULT_OK} and provide the fully * populated {@link FillResponse response} by setting it to the {@link * AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra. * populated {@link FillResponse response} by setting it to the * {@link android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra. * For example, if you provided an empty {@link FillResponse resppnse} because the * user's data was locked and marked that the response needs an authentication then * in the response returned if authentication succeeds you need to provide all Loading Loading @@ -205,6 +207,15 @@ public final class FillResponse implements Parcelable { /** * Adds a new {@link Dataset} to this response. * * <p><b>Note: </b> on Android {@link android.os.Build.VERSION_CODES#O}, the total number of * datasets is limited by the Binder transaction size, so it's recommended to keep it * small (in the range of 10-20 at most) and use pagination by adding a fake * {@link Dataset.Builder#setAuthentication(IntentSender) authenticated} at the end with * a presentation string like "Next 10" that would return a new {@link FillResponse} with * the next 10 datasets, and so on. This limitation was lifted on * Android {@link android.os.Build.VERSION_CODES#O_MR1}, although the Binder transaction * size can still be reached if each dataset itself is too big. * * @return This builder. */ public @NonNull Builder addDataset(@Nullable Dataset dataset) { Loading Loading @@ -313,7 +324,7 @@ public final class FillResponse implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeTypedArrayList(mDatasets, flags); parcel.writeParcelable(mDatasets, flags); parcel.writeParcelable(mSaveInfo, flags); parcel.writeParcelable(mClientState, flags); parcel.writeParcelableArray(mAuthenticationIds, flags); Loading @@ -331,7 +342,8 @@ public final class FillResponse implements Parcelable { // the system obeys the contract of the builder to avoid attacks // using specially crafted parcels. final Builder builder = new Builder(); final ArrayList<Dataset> datasets = parcel.readTypedArrayList(null); final ParceledListSlice<Dataset> datasetSlice = parcel.readParcelable(null); final List<Dataset> datasets = (datasetSlice != null) ? datasetSlice.getList() : null; final int datasetCount = (datasets != null) ? datasets.size() : 0; for (int i = 0; i < datasetCount; i++) { builder.addDataset(datasets.get(i)); Loading services/autofill/java/com/android/server/autofill/Session.java +4 −4 Original line number Diff line number Diff line Loading @@ -928,7 +928,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Make sure the service doesn't have the fields already by checking the datasets // content. final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); if (datasets != null) { datasets_loop: for (int i = 0; i < datasets.size(); i++) { final Dataset dataset = datasets.get(i); Loading Loading @@ -1157,7 +1157,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); if (datasets != null) { final int numDatasets = datasets.size(); Loading Loading @@ -1353,7 +1353,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Must also track that are part of datasets, otherwise the FillUI won't be hidden when // they go away (if they're not savable). final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); ArraySet<AutofillId> fillableIds = null; if (datasets != null) { for (int i = 0; i < datasets.size(); i++) { Loading Loading @@ -1426,7 +1426,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * Sets the state of all views in the given response. */ private void setViewStatesLocked(FillResponse response, int state, boolean clearResponse) { final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); if (datasets != null) { for (int i = 0; i < datasets.size(); i++) { final Dataset dataset = datasets.get(i); Loading Loading
core/java/android/service/autofill/FillResponse.java +22 −10 Original line number Diff line number Diff line Loading @@ -23,15 +23,16 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.content.IntentSender; import android.content.pm.ParceledListSlice; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.widget.RemoteViews; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Response for a {@link Loading @@ -41,7 +42,7 @@ import java.util.Arrays; */ public final class FillResponse implements Parcelable { private final @Nullable ArrayList<Dataset> mDatasets; private final @Nullable ParceledListSlice<Dataset> mDatasets; private final @Nullable SaveInfo mSaveInfo; private final @Nullable Bundle mClientState; private final @Nullable RemoteViews mPresentation; Loading @@ -51,7 +52,7 @@ public final class FillResponse implements Parcelable { private int mRequestId; private FillResponse(@NonNull Builder builder) { mDatasets = builder.mDatasets; mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null; mSaveInfo = builder.mSaveInfo; mClientState = builder.mCLientState; mPresentation = builder.mPresentation; Loading @@ -67,8 +68,8 @@ public final class FillResponse implements Parcelable { } /** @hide */ public @Nullable ArrayList<Dataset> getDatasets() { return mDatasets; public @Nullable List<Dataset> getDatasets() { return (mDatasets != null) ? mDatasets.getList() : null; } /** @hide */ Loading Loading @@ -143,12 +144,13 @@ public final class FillResponse implements Parcelable { * for the user to trigger your authentication flow. * * <p>When a user triggers autofill, the system launches the provided intent * whose extras will have the {@link AutofillManager#EXTRA_ASSIST_STRUCTURE screen * whose extras will have the * {@link android.view.autofill.AutofillManager#EXTRA_ASSIST_STRUCTURE screen * content} and your {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE * client state}. Once you complete your authentication flow you should set the * {@link Activity} result to {@link android.app.Activity#RESULT_OK} and provide the fully * populated {@link FillResponse response} by setting it to the {@link * AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra. * populated {@link FillResponse response} by setting it to the * {@link android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra. * For example, if you provided an empty {@link FillResponse resppnse} because the * user's data was locked and marked that the response needs an authentication then * in the response returned if authentication succeeds you need to provide all Loading Loading @@ -205,6 +207,15 @@ public final class FillResponse implements Parcelable { /** * Adds a new {@link Dataset} to this response. * * <p><b>Note: </b> on Android {@link android.os.Build.VERSION_CODES#O}, the total number of * datasets is limited by the Binder transaction size, so it's recommended to keep it * small (in the range of 10-20 at most) and use pagination by adding a fake * {@link Dataset.Builder#setAuthentication(IntentSender) authenticated} at the end with * a presentation string like "Next 10" that would return a new {@link FillResponse} with * the next 10 datasets, and so on. This limitation was lifted on * Android {@link android.os.Build.VERSION_CODES#O_MR1}, although the Binder transaction * size can still be reached if each dataset itself is too big. * * @return This builder. */ public @NonNull Builder addDataset(@Nullable Dataset dataset) { Loading Loading @@ -313,7 +324,7 @@ public final class FillResponse implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeTypedArrayList(mDatasets, flags); parcel.writeParcelable(mDatasets, flags); parcel.writeParcelable(mSaveInfo, flags); parcel.writeParcelable(mClientState, flags); parcel.writeParcelableArray(mAuthenticationIds, flags); Loading @@ -331,7 +342,8 @@ public final class FillResponse implements Parcelable { // the system obeys the contract of the builder to avoid attacks // using specially crafted parcels. final Builder builder = new Builder(); final ArrayList<Dataset> datasets = parcel.readTypedArrayList(null); final ParceledListSlice<Dataset> datasetSlice = parcel.readParcelable(null); final List<Dataset> datasets = (datasetSlice != null) ? datasetSlice.getList() : null; final int datasetCount = (datasets != null) ? datasets.size() : 0; for (int i = 0; i < datasetCount; i++) { builder.addDataset(datasets.get(i)); Loading
services/autofill/java/com/android/server/autofill/Session.java +4 −4 Original line number Diff line number Diff line Loading @@ -928,7 +928,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Make sure the service doesn't have the fields already by checking the datasets // content. final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); if (datasets != null) { datasets_loop: for (int i = 0; i < datasets.size(); i++) { final Dataset dataset = datasets.get(i); Loading Loading @@ -1157,7 +1157,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); if (datasets != null) { final int numDatasets = datasets.size(); Loading Loading @@ -1353,7 +1353,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Must also track that are part of datasets, otherwise the FillUI won't be hidden when // they go away (if they're not savable). final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); ArraySet<AutofillId> fillableIds = null; if (datasets != null) { for (int i = 0; i < datasets.size(); i++) { Loading Loading @@ -1426,7 +1426,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * Sets the state of all views in the given response. */ private void setViewStatesLocked(FillResponse response, int state, boolean clearResponse) { final ArrayList<Dataset> datasets = response.getDatasets(); final List<Dataset> datasets = response.getDatasets(); if (datasets != null) { for (int i = 0; i < datasets.size(); i++) { final Dataset dataset = datasets.get(i); Loading