Home | History | Annotate | Download | only in content
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package android.content;
     17 
     18 import android.annotation.NonNull;
     19 import android.annotation.Nullable;
     20 import android.annotation.TestApi;
     21 import android.app.ActivityThread;
     22 import android.os.Parcel;
     23 import android.os.Parcelable;
     24 import android.util.ArraySet;
     25 import android.util.Log;
     26 import android.view.autofill.AutofillManager;
     27 import android.view.autofill.AutofillManager.AutofillClient;
     28 
     29 import java.io.PrintWriter;
     30 
     31 /**
     32  * Autofill options for a given package.
     33  *
     34  * <p>This object is created by the Autofill System Service and passed back to the app when the
     35  * application is created.
     36  *
     37  * @hide
     38  */
     39 @TestApi
     40 public final class AutofillOptions implements Parcelable {
     41 
     42     private static final String TAG = AutofillOptions.class.getSimpleName();
     43 
     44     /**
     45      * Logging level for {@code logcat} statements.
     46      */
     47     public final int loggingLevel;
     48 
     49     /**
     50      * Whether compatibility mode is enabled for the package.
     51      */
     52     public final boolean compatModeEnabled;
     53 
     54     /**
     55      * Whether package is whitelisted for augmented autofill.
     56      */
     57     public boolean augmentedAutofillEnabled;
     58 
     59     /**
     60      * List of whitelisted activities.
     61      */
     62     @Nullable
     63     public ArraySet<ComponentName> whitelistedActivitiesForAugmentedAutofill;
     64 
     65     public AutofillOptions(int loggingLevel, boolean compatModeEnabled) {
     66         this.loggingLevel = loggingLevel;
     67         this.compatModeEnabled = compatModeEnabled;
     68     }
     69 
     70     /**
     71      * Returns whether activity is whitelisted for augmented autofill.
     72      */
     73     public boolean isAugmentedAutofillEnabled(@NonNull Context context) {
     74         if (!augmentedAutofillEnabled) return false;
     75 
     76         final AutofillClient autofillClient = context.getAutofillClient();
     77         if (autofillClient == null) return false;
     78 
     79         final ComponentName component = autofillClient.autofillClientGetComponentName();
     80         return whitelistedActivitiesForAugmentedAutofill == null
     81                 || whitelistedActivitiesForAugmentedAutofill.contains(component);
     82     }
     83 
     84     /**
     85      * @hide
     86      */
     87     @TestApi
     88     public static AutofillOptions forWhitelistingItself() {
     89         final ActivityThread at = ActivityThread.currentActivityThread();
     90         if (at == null) {
     91             throw new IllegalStateException("No ActivityThread");
     92         }
     93 
     94         final String packageName = at.getApplication().getPackageName();
     95 
     96         if (!"android.autofillservice.cts".equals(packageName)) {
     97             Log.e(TAG, "forWhitelistingItself(): called by " + packageName);
     98             throw new SecurityException("Thou shall not pass!");
     99         }
    100 
    101         final AutofillOptions options = new AutofillOptions(
    102                 AutofillManager.FLAG_ADD_CLIENT_VERBOSE, /* compatModeAllowed= */ true);
    103         options.augmentedAutofillEnabled = true;
    104         // Always log, as it's used by test only
    105         Log.i(TAG, "forWhitelistingItself(" + packageName + "): " + options);
    106 
    107         return options;
    108     }
    109 
    110     @Override
    111     public String toString() {
    112         return "AutofillOptions [loggingLevel=" + loggingLevel + ", compatMode=" + compatModeEnabled
    113                 + ", augmentedAutofillEnabled=" + augmentedAutofillEnabled + "]";
    114     }
    115 
    116     /** @hide */
    117     public void dumpShort(@NonNull PrintWriter pw) {
    118         pw.print("logLvl="); pw.print(loggingLevel);
    119         pw.print(", compatMode="); pw.print(compatModeEnabled);
    120         pw.print(", augmented="); pw.print(augmentedAutofillEnabled);
    121         if (whitelistedActivitiesForAugmentedAutofill != null) {
    122             pw.print(", whitelistedActivitiesForAugmentedAutofill=");
    123             pw.print(whitelistedActivitiesForAugmentedAutofill);
    124         }
    125     }
    126 
    127     @Override
    128     public int describeContents() {
    129         return 0;
    130     }
    131 
    132     @Override
    133     public void writeToParcel(Parcel parcel, int flags) {
    134         parcel.writeInt(loggingLevel);
    135         parcel.writeBoolean(compatModeEnabled);
    136         parcel.writeBoolean(augmentedAutofillEnabled);
    137         parcel.writeArraySet(whitelistedActivitiesForAugmentedAutofill);
    138     }
    139 
    140     public static final @android.annotation.NonNull Parcelable.Creator<AutofillOptions> CREATOR =
    141             new Parcelable.Creator<AutofillOptions>() {
    142 
    143                 @Override
    144                 public AutofillOptions createFromParcel(Parcel parcel) {
    145                     final int loggingLevel = parcel.readInt();
    146                     final boolean compatMode = parcel.readBoolean();
    147                     final AutofillOptions options = new AutofillOptions(loggingLevel, compatMode);
    148                     options.augmentedAutofillEnabled = parcel.readBoolean();
    149                     options.whitelistedActivitiesForAugmentedAutofill =
    150                             (ArraySet<ComponentName>) parcel.readArraySet(null);
    151                     return options;
    152                 }
    153 
    154                 @Override
    155                 public AutofillOptions[] newArray(int size) {
    156                     return new AutofillOptions[size];
    157                 }
    158     };
    159 }
    160