Merge "Prepare tests for impending robolectric merge"
diff --git a/res/layout/instant_app_buttons.xml b/res/layout/instant_app_buttons.xml
index f80ac10..24b08bb 100644
--- a/res/layout/instant_app_buttons.xml
+++ b/res/layout/instant_app_buttons.xml
@@ -20,44 +20,48 @@
     android:id="@+id/instant_app_button_container"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:gravity="center"
-    android:paddingTop="24dp"
-    android:paddingStart="68dp"
-    android:paddingEnd="24dp"
-    android:orientation="horizontal">
+    android:paddingStart="8dp"
+    android:paddingEnd="8dp">
 
     <FrameLayout
         android:layout_width="0dp"
         android:layout_weight="1"
         android:layout_height="wrap_content">
+
         <Button
             android:id="@+id/install"
-            style="@style/ActionPrimaryButton"
+            style="@style/SettingsActionButton"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginBottom="4dp"
-            android:text="@string/install_text"/>
+            android:paddingTop="20dp"
+            android:paddingBottom="20dp"
+            android:text="@string/install_text"
+            android:drawableTop="@drawable/ic_settings_install"/>
+
         <Button
             android:id="@+id/launch"
-            style="@style/ActionPrimaryButton"
+            style="@style/SettingsActionButton"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginBottom="4dp"
-            android:text="@string/launch_instant_app"/>
+            android:paddingTop="20dp"
+            android:paddingBottom="20dp"
+            android:text="@string/launch_instant_app"
+            android:drawableTop="@drawable/ic_settings_open"/>
     </FrameLayout>
+
     <Space
-        android:layout_width="16dp"
+        android:layout_width="8dp"
         android:layout_height="wrap_content" />
-    <FrameLayout
+
+    <Button
+        android:id="@+id/clear_data"
+        style="@style/SettingsActionButton"
         android:layout_width="0dp"
+        android:layout_height="wrap_content"
         android:layout_weight="1"
-        android:layout_height="wrap_content">
-        <Button
-            android:id="@+id/clear_data"
-            style="@style/ActionSecondaryButton"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="4dp"
-            android:text="@string/clear_instant_app_data"/>
-    </FrameLayout>
+        android:paddingTop="20dp"
+        android:paddingBottom="20dp"
+        android:text="@string/clear_instant_app_data"
+        android:drawableTop="@drawable/ic_settings_delete"/>
+
 </LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d9ac590..bc35005 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10315,10 +10315,10 @@
     <!-- UI debug setting: force desktop mode summary [CHAR LIMIT=NONE] -->
     <string name="force_desktop_mode_summary">Force experimental desktop mode on secondary displays</string>
 
-    <!-- UI debug setting: Force enable "smart dark" UI rendering feature [CHAR LIMIT=25] -->
-    <string name="hwui_force_dark_title">Force-enable SmartDark</string>
-    <!-- UI debug setting: Force enable "smart dark" UI rendering feature summary [CHAR LIMIT=50] -->
-    <string name="hwui_force_dark_summary">Forces the SmartDark feature to be always-on</string>
+    <!-- UI debug setting: Force enable "smart dark" UI rendering feature [CHAR LIMIT=40] -->
+    <string name="hwui_force_dark_title">Override force-dark</string>
+    <!-- UI debug setting: Force enable "smart dark" UI rendering feature summary [CHAR LIMIT=100] -->
+    <string name="hwui_force_dark_summary">Overrides the force-dark feature to be always-on</string>
 
     <!-- Title for the top level Privacy Settings [CHAR LIMIT=30]-->
     <string name="privacy_dashboard_title">Privacy</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 28bc1a0..cfc5fd3 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -264,8 +264,8 @@
 
     <style name="TextAppearance.Medium" parent="@android:style/TextAppearance.Material.Medium"/>
     <style name="TextAppearance.Small" parent="@android:style/TextAppearance.Material.Small"/>
-    <style name="TextAppearance.Switch" parent="@android:style/TextAppearance.Material.Title">
-        <item name="android:textSize">18sp</item>
+    <style name="TextAppearance.Switch" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+        <item name="android:textSize">16sp</item>
     </style>
 
     <style name="TextAppearance.CategoryTitle"
diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml
index 84ea14d..1e320e4 100644
--- a/res/xml/app_info_settings.xml
+++ b/res/xml/app_info_settings.xml
@@ -32,7 +32,9 @@
         android:key="instant_app_buttons"
         android:layout="@layout/instant_app_buttons"
         android:selectable="false"
-        android:order="-9999" />
+        android:order="-9999"
+        settings:allowDividerAbove="true"
+        settings:allowDividerBelow="true"/>
 
     <com.android.settings.widget.ActionButtonPreference
         android:key="action_buttons"
diff --git a/res/xml/app_storage_settings.xml b/res/xml/app_storage_settings.xml
index cbde0ca..14ad180 100644
--- a/res/xml/app_storage_settings.xml
+++ b/res/xml/app_storage_settings.xml
@@ -24,7 +24,8 @@
 
     <com.android.settings.applications.SpacePreference
         android:key="storage_space"
-        android:layout_height="8dp" />
+        android:layout_height="8dp"
+        settings:allowDividerAbove="true"/>
 
     <Preference
         android:key="storage_used"
@@ -41,7 +42,6 @@
     <PreferenceCategory
         android:key="storage_category"
         android:title="@string/app_info_storage_title"
-        settings:allowDividerAbove="false"
         settings:allowDividerBelow="false">
 
         <Preference
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index 1891702..c854f77 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -23,7 +23,8 @@
         android:key="header_view"
         android:layout="@layout/settings_entity_header"
         android:selectable="false"
-        android:order="-10000"/>
+        android:order="-10000"
+        settings:allowDividerBelow="true"/>
 
     <com.android.settings.widget.ActionButtonPreference
         android:key="action_buttons"
diff --git a/src/com/android/settings/accounts/AvatarViewMixin.java b/src/com/android/settings/accounts/AvatarViewMixin.java
index 78750b1..35a3cbf 100644
--- a/src/com/android/settings/accounts/AvatarViewMixin.java
+++ b/src/com/android/settings/accounts/AvatarViewMixin.java
@@ -55,27 +55,37 @@
 
     private static final String METHOD_GET_ACCOUNT_AVATAR = "getAccountAvatar";
     private static final String KEY_AVATAR_BITMAP = "account_avatar";
+    private static final String KEY_ACCOUNT_NAME = "account_name";
+    private static final String EXTRA_ACCOUNT_NAME = "extra.accountName";
     private static final int REQUEST_CODE = 1013;
 
     private final Context mContext;
     private final ImageView mAvatarView;
     private final MutableLiveData<Bitmap> mAvatarImage;
 
+    private String mAccountName;
+
     public AvatarViewMixin(SettingsHomepageActivity activity, ImageView avatarView) {
         mContext = activity.getApplicationContext();
         mAvatarView = avatarView;
         mAvatarView.setOnClickListener(v -> {
-            if (hasAccount()) {
-                //TODO(b/117509285) launch the new page of the MeCard
-            } else {
-                final Intent intent = FeatureFactory.getFactory(mContext)
-                        .getAccountFeatureProvider()
-                        .getAccountSettingsDeeplinkIntent();
+            final Intent intent = FeatureFactory.getFactory(mContext)
+                    .getAccountFeatureProvider()
+                    .getAccountSettingsDeeplinkIntent();
 
-                if (intent != null) {
-                    activity.startActivityForResult(intent, REQUEST_CODE);
-                }
+            if (intent == null) {
+                return;
             }
+
+            if (!TextUtils.isEmpty(mAccountName)) {
+                //TODO(b/117509285) launch the new page of the MeCard
+                intent.putExtra(EXTRA_ACCOUNT_NAME, mAccountName);
+            }
+
+            // Here may have two different UI while start the activity.
+            // It will display adding account UI when device has no any account.
+            // It will display account information page when intent added the specified account.
+            activity.startActivityForResult(intent, REQUEST_CODE);
         });
 
         mAvatarImage = new MutableLiveData<>();
@@ -91,7 +101,7 @@
             return;
         }
         if (hasAccount()) {
-            loadAvatar();
+            loadAccount();
         } else {
             mAvatarView.setImageResource(R.drawable.ic_account_circle_24dp);
         }
@@ -104,7 +114,7 @@
         return (accounts != null) && (accounts.length > 0);
     }
 
-    private void loadAvatar() {
+    private void loadAccount() {
         final String authority = queryProviderAuthority();
         if (TextUtils.isEmpty(authority)) {
             return;
@@ -117,6 +127,7 @@
             final Bundle bundle = mContext.getContentResolver().call(uri,
                     METHOD_GET_ACCOUNT_AVATAR, null /* arg */, null /* extras */);
             final Bitmap bitmap = bundle.getParcelable(KEY_AVATAR_BITMAP);
+            mAccountName = bundle.getString(KEY_ACCOUNT_NAME, "" /* defaultValue */);
             mAvatarImage.postValue(bitmap);
         });
     }
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
index b09d0aa..37b949c 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
@@ -94,7 +94,7 @@
 
         if (shouldLaunchConfirmLock()) {
             launchConfirmLock(R.string.security_settings_face_preference_title,
-                    Utils.getFingerprintManagerOrNull(this).preEnroll());
+                    Utils.getFaceManagerOrNull(this).generateChallenge());
             mShouldFinishOnStop = false;
         } else {
             startEnrollment();
diff --git a/src/com/android/settings/homepage/contextualcards/CardContentProvider.java b/src/com/android/settings/homepage/contextualcards/CardContentProvider.java
index 74e09e8..e7ede14 100644
--- a/src/com/android/settings/homepage/contextualcards/CardContentProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/CardContentProvider.java
@@ -17,6 +17,7 @@
 package com.android.settings.homepage.contextualcards;
 
 import android.content.ContentProvider;
+import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.UriMatcher;
 import android.database.Cursor;
@@ -36,10 +37,15 @@
  */
 public class CardContentProvider extends ContentProvider {
 
-    private static final String TAG = "CardContentProvider";
-
     public static final String CARD_AUTHORITY = "com.android.settings.homepage.CardContentProvider";
 
+    public static final Uri URI = new Uri.Builder()
+                    .scheme(ContentResolver.SCHEME_CONTENT)
+                    .authority(CardContentProvider.CARD_AUTHORITY)
+                    .appendPath(CardDatabaseHelper.CARD_TABLE)
+                    .build();
+
+    private static final String TAG = "CardContentProvider";
     /** URI matcher for ContentProvider queries. */
     private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
     /** URI matcher type for cards table */
@@ -98,17 +104,7 @@
 
     @Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
-        final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
-        try {
-            maybeEnableStrictMode();
-            final SQLiteDatabase database = mDBHelper.getWritableDatabase();
-            final String table = getTableFromMatch(uri);
-            final int rowsDeleted = database.delete(table, selection, selectionArgs);
-            getContext().getContentResolver().notifyChange(uri, null /* observer */);
-            return rowsDeleted;
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
+        throw new UnsupportedOperationException("delete operation not supported currently.");
     }
 
     @Override
@@ -140,18 +136,7 @@
 
     @Override
     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
-        try {
-            maybeEnableStrictMode();
-
-            final SQLiteDatabase database = mDBHelper.getWritableDatabase();
-            final String table = getTableFromMatch(uri);
-            final int rowsUpdated = database.update(table, values, selection, selectionArgs);
-            getContext().getContentResolver().notifyChange(uri, null /* observer */);
-            return rowsUpdated;
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
+        throw new UnsupportedOperationException("update operation not supported currently.");
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/homepage/contextualcards/CardDatabaseHelper.java b/src/com/android/settings/homepage/contextualcards/CardDatabaseHelper.java
index b5cdf87..164afdd 100644
--- a/src/com/android/settings/homepage/contextualcards/CardDatabaseHelper.java
+++ b/src/com/android/settings/homepage/contextualcards/CardDatabaseHelper.java
@@ -209,16 +209,19 @@
      * Mark a specific ContextualCard with dismissal flag in the database to indicate that the
      * card has been dismissed.
      *
-     * @param cardName the card name of the ContextualCard which is dismissed by user.
-     * @return updated row number
+     * @param context Context
+     * @param cardName The card name of the ContextualCard which is dismissed by user.
+     * @return The number of rows updated
      */
-    public int markContextualCardAsDismissed(String cardName) {
-        final SQLiteDatabase database = this.getWritableDatabase();
+    public int markContextualCardAsDismissed(Context context, String cardName) {
+        final SQLiteDatabase database = getWritableDatabase();
         final ContentValues values = new ContentValues();
         values.put(CardColumns.CARD_DISMISSED, 1);
         final String selection = CardColumns.NAME + "=?";
         final String[] selectionArgs = {cardName};
         final int rowsUpdated = database.update(CARD_TABLE, values, selection, selectionArgs);
+        database.close();
+        context.getContentResolver().notifyChange(CardContentProvider.URI, null);
         return rowsUpdated;
     }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index adfaf20..c723cfd 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -24,8 +24,11 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
@@ -61,6 +64,19 @@
     }
 
     @Override
+    protected void onStartLoading() {
+        super.onStartLoading();
+        mContext.getContentResolver().registerContentObserver(CardContentProvider.URI,
+                false /*notifyForDescendants*/, mObserver);
+    }
+
+    @Override
+    protected void onStopLoading() {
+        super.onStopLoading();
+        mContext.getContentResolver().unregisterContentObserver(mObserver);
+    }
+
+    @Override
     protected void onDiscardResult(List<ContextualCard> result) {
 
     }
@@ -184,4 +200,14 @@
         }
         return -1L;
     }
+
+    private final ContentObserver mObserver = new ContentObserver(
+            new Handler(Looper.getMainLooper())) {
+        @Override
+        public void onChange(boolean selfChange) {
+            if (isStarted()) {
+                forceLoad();
+            }
+        }
+    };
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java b/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java
index 723b344..931bfb7 100644
--- a/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java
+++ b/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java
@@ -114,7 +114,7 @@
         if (ConditionContextualCardController.class == clz) {
             return new ConditionContextualCardController(context);
         } else if (SliceContextualCardController.class == clz) {
-            return new SliceContextualCardController();
+            return new SliceContextualCardController(context);
         } else if (LegacySuggestionContextualCardController.class == clz) {
             return new LegacySuggestionContextualCardController(context);
         }
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
index 84ceabd..6fcc636 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
@@ -77,13 +77,13 @@
 
     @Override
     public void onActionClick(ContextualCard contextualCard) {
-
+        final ConditionalContextualCard card = (ConditionalContextualCard) contextualCard;
+        mConditionManager.onActionClick(card.getConditionId());
     }
 
     @Override
     public void onDismissed(ContextualCard contextualCard) {
-        final ConditionalContextualCard card = (ConditionalContextualCard) contextualCard;
-        mConditionManager.onActionClick(card.getConditionId());
+
     }
 
     @Override
@@ -93,8 +93,8 @@
         final boolean isOddNumber = conditionCards.size() % 2 == 1;
         if (isOddNumber) {
             final int lastIndex = conditionCards.size() - 1;
-            final ConditionalContextualCard card = (ConditionalContextualCard) conditionCards.get(
-                    lastIndex);
+            final ConditionalContextualCard card = (ConditionalContextualCard) conditionCards
+                    .get(lastIndex);
             conditionCards.set(lastIndex, card.mutate().setIsHalfWidth(false).build());
         }
 
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java
index 3405dd2..34f442c 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java
@@ -113,7 +113,7 @@
                         viewContext, MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON,
                         card.getMetricsConstant());
                 mControllerRendererPool.getController(mContext, card.getCardType())
-                        .onDismissed(card);
+                        .onActionClick(card);
             });
         } else {
             button.setVisibility(View.GONE);
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java
index 6ab8f40..f1fbc9c 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java
@@ -16,9 +16,14 @@
 
 package com.android.settings.homepage.contextualcards.slices;
 
+import android.content.Context;
+
+import com.android.settings.homepage.contextualcards.CardContentProvider;
+import com.android.settings.homepage.contextualcards.CardDatabaseHelper;
 import com.android.settings.homepage.contextualcards.ContextualCard;
 import com.android.settings.homepage.contextualcards.ContextualCardController;
 import com.android.settings.homepage.contextualcards.ContextualCardUpdateListener;
+import com.android.settingslib.utils.ThreadUtils;
 
 /**
  * Card controller for {@link ContextualCard} built as slices.
@@ -27,8 +32,13 @@
 
     private static final String TAG = "SliceCardController";
 
+    private Context mContext;
     private ContextualCardUpdateListener mCardUpdateListener;
 
+    public SliceContextualCardController(Context context) {
+        mContext = context;
+    }
+
     @Override
     public int getCardType() {
         return ContextualCard.CardType.SLICE;
@@ -46,11 +56,14 @@
 
     @Override
     public void onDismissed(ContextualCard card) {
-        //TODO(b/113783548): Mark this card as dismissed in db and reload loader.
+        ThreadUtils.postOnBackgroundThread(() -> {
+            final CardDatabaseHelper dbHelper = CardDatabaseHelper.getInstance(mContext);
+            dbHelper.markContextualCardAsDismissed(mContext, card.getName());
+        });
     }
 
     @Override
     public void setCardUpdateListener(ContextualCardUpdateListener listener) {
-            mCardUpdateListener = listener;
+        mCardUpdateListener = listener;
     }
 }
diff --git a/src/com/android/settings/wifi/qrcode/QrCodeGenerator.java b/src/com/android/settings/wifi/qrcode/QrCodeGenerator.java
new file mode 100644
index 0000000..08fcb10
--- /dev/null
+++ b/src/com/android/settings/wifi/qrcode/QrCodeGenerator.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 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 com.android.settings.wifi.qrcode;
+
+import android.graphics.Bitmap;
+import android.graphics.Color;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+
+public final class QrCodeGenerator {
+    /**
+     * Generates a barcode image with {@code contents}.
+     *
+     * @param contents The contents to encode in the barcode
+     * @param size     The preferred image size in pixels
+     * @return Barcode bitmap
+     */
+    public static Bitmap encodeQrCode(String contents, int size)
+            throws WriterException, IllegalArgumentException {
+        final BitMatrix qrBits = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,
+                size, size);
+        final Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565);
+        for (int x = 0; x < size; x++) {
+            for (int y = 0; y < size; y++) {
+                bitmap.setPixel(x, y, qrBits.get(x, y) ? Color.BLACK : Color.WHITE);
+            }
+        }
+        return bitmap;
+    }
+}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 647ba5a..c98fbdb 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -71,6 +71,7 @@
 
     private WifiManager mWifiManager;
     private boolean mRestartWifiApAfterConfigChange;
+    private boolean mUnavailable;
 
     @VisibleForTesting
     TetherChangeReceiver mTetherChangeReceiver;
@@ -95,6 +96,15 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setIfOnlyAvailableForAdmins(true);
+        if (isUiRestricted()) {
+            mUnavailable = true;
+        }
+    }
+
+    @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@@ -109,6 +119,9 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        if (mUnavailable) {
+            return;
+        }
         // Assume we are in a SettingsActivity. This is only safe because we currently use
         // SettingsActivity as base for all preference fragments.
         final SettingsActivity activity = (SettingsActivity) getActivity();
@@ -122,6 +135,13 @@
     @Override
     public void onStart() {
         super.onStart();
+        if (mUnavailable) {
+            if (!isUiRestrictedByOnlyAdmin()) {
+                getEmptyTextView().setText(R.string.tethering_settings_not_available);
+            }
+            getPreferenceScreen().removeAll();
+            return;
+        }
         final Context context = getContext();
         if (context != null) {
             context.registerReceiver(mTetherChangeReceiver, TETHER_STATE_CHANGE_FILTER);
@@ -131,6 +151,9 @@
     @Override
     public void onStop() {
         super.onStop();
+        if (mUnavailable) {
+            return;
+        }
         final Context context = getContext();
         if (context != null) {
             context.unregisterReceiver(mTetherChangeReceiver);
diff --git a/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java b/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java
index 039d2e2..e074440 100644
--- a/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java
@@ -18,16 +18,25 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 import android.accounts.Account;
+import android.content.ContentProvider;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
 import android.widget.ImageView;
 
 import com.android.settings.homepage.SettingsHomepageActivity;
@@ -44,6 +53,7 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowContentResolver;
 import org.robolectric.shadows.ShadowPackageManager;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -51,6 +61,7 @@
     private static final String DUMMY_ACCOUNT = "test@domain.com";
     private static final String DUMMY_DOMAIN = "domain.com";
     private static final String DUMMY_AUTHORITY = "authority.domain.com";
+    private static final String METHOD_GET_ACCOUNT_AVATAR = "getAccountAvatar";
 
     private Context mContext;
     private ImageView mImageView;
@@ -128,6 +139,31 @@
         assertThat(avatarViewMixin.queryProviderAuthority()).isEqualTo(DUMMY_AUTHORITY);
     }
 
+    @Test
+    public void callWithGetAccountAvatarMethod_useDummyData_shouldReturnAccountNameAndAvatar() {
+        final ShadowContentResolver shadowContentResolver = Shadow.extract(
+                mContext.getContentResolver());
+        final Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(
+                DUMMY_AUTHORITY).build();
+        final ContentProvider mockContentProvider = mock(ContentProvider.class);
+
+        ShadowContentResolver.registerProviderInternal(DUMMY_AUTHORITY, mockContentProvider);
+
+        final Bundle bundle = new Bundle();
+        final Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+        bundle.putParcelable("account_avatar", bitmap);
+        bundle.putString("account_name", DUMMY_ACCOUNT);
+        doReturn(bundle).when(mockContentProvider).call(anyString(), anyString(),
+                any(Bundle.class));
+
+        final Bundle expectBundle = shadowContentResolver.call(uri, METHOD_GET_ACCOUNT_AVATAR,
+                null /* arg */, null /* extras */);
+
+        final Object object = bundle.getParcelable("account_avatar");
+        assertThat(object instanceof Bitmap).isTrue();
+        assertThat(bundle.getString("account_name")).isEqualTo(DUMMY_ACCOUNT);
+    }
+
     @Implements(value = AccountFeatureProviderImpl.class)
     public static class ShadowAccountFeatureProviderImpl {
 
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java
index e77106d..1adc678 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.applications.appinfo;
 
+import static com.android.settings.core.FeatureFlags.DATA_USAGE_V2;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -33,6 +35,7 @@
 import android.net.ConnectivityManager;
 import android.net.INetworkStatsSession;
 import android.os.Bundle;
+import android.util.FeatureFlagUtils;
 
 import androidx.loader.app.LoaderManager;
 import androidx.preference.Preference;
@@ -65,6 +68,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+        FeatureFlagUtils.setEnabled(mContext, DATA_USAGE_V2, false);
         mController = spy(new AppDataUsagePreferenceController(mContext, "test_key"));
         mController.setParentFragment(mFragment);
     }
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index 3813aa5..d52793e 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.app.usage.NetworkStatsManager;
 import android.content.Context;
 import android.net.NetworkPolicyManager;
 
@@ -68,6 +69,8 @@
     private SummaryLoader mSummaryLoader;
     @Mock
     private NetworkPolicyManager mNetworkPolicyManager;
+    @Mock
+    private NetworkStatsManager mNetworkStatsManager;
     private Context mContext;
     private FragmentActivity mActivity;
     private SummaryLoader.SummaryProvider mSummaryProvider;
@@ -86,6 +89,7 @@
 
         mContext = RuntimeEnvironment.application;
         mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
+        doReturn(mNetworkStatsManager).when(mActivity).getSystemService(NetworkStatsManager.class);
 
         mSummaryProvider = DataUsageSummary.SUMMARY_PROVIDER_FACTORY
                 .createSummaryProvider(mActivity, mSummaryLoader);
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java
index 0ffabb4..1e444bb 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java
@@ -95,15 +95,12 @@
         assertThat(count).isGreaterThan(0);
     }
 
-    @Test
+    @Test(expected = UnsupportedOperationException.class)
     public void cardData_delete() {
-        mResolver.insert(mUri, generateOneRow());
         final int delCount = mResolver.delete(mUri, null, null);
-
-        assertThat(delCount).isGreaterThan(0);
     }
 
-    @Test
+    @Test(expected = UnsupportedOperationException.class)
     public void cardData_update() {
         mResolver.insert(mUri, generateOneRow());
 
@@ -113,16 +110,6 @@
         final String strWhere = CardDatabaseHelper.CardColumns.NAME + "=?";
         final String[] selectionArgs = {"auto_rotate"};
         final int updateCount = mResolver.update(mUri, values, strWhere, selectionArgs);
-
-        assertThat(updateCount).isGreaterThan(0);
-
-        final String[] columns = {CardDatabaseHelper.CardColumns.SCORE};
-        final Cursor cr = mResolver.query(mUri, columns, strWhere, selectionArgs, null);
-        cr.moveToFirst();
-        final double qryScore = cr.getDouble(0);
-
-        cr.close();
-        assertThat(qryScore).isEqualTo(updatingScore);
     }
 
     @Test
@@ -146,28 +133,6 @@
     }
 
     @Test
-    public void delete_isMainThread_shouldEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(true);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-
-        mProvider.delete(mUri, null, null);
-
-        verify(mProvider).enableStrictMode();
-    }
-
-    @Test
-    public void update_isMainThread_shouldEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(true);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-        final ContentValues values = new ContentValues();
-        values.put(CardDatabaseHelper.CardColumns.SCORE, "0.01");
-
-        mProvider.update(mUri, values, null, null);
-
-        verify(mProvider).enableStrictMode();
-    }
-
-    @Test
     public void insert_notMainThread_shouldNotEnableStrictMode() {
         ShadowThreadUtils.setIsMainThread(false);
         ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
@@ -187,28 +152,6 @@
         verify(mProvider, never()).enableStrictMode();
     }
 
-    @Test
-    public void delete_notMainThread_shouldNotEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(false);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-
-        mProvider.delete(mUri, null, null);
-
-        verify(mProvider, never()).enableStrictMode();
-    }
-
-    @Test
-    public void update_notMainThread_shouldNotEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(false);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-        final ContentValues values = new ContentValues();
-        values.put(CardDatabaseHelper.CardColumns.SCORE, "0.01");
-
-        mProvider.update(mUri, values, null, null);
-
-        verify(mProvider, never()).enableStrictMode();
-    }
-
     @Test(expected = UnsupportedOperationException.class)
     public void getType_shouldCrash() {
         mProvider.getType(null);
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
new file mode 100644
index 0000000..362e1f5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2018 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 com.android.settings.homepage.contextualcards.slices;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+
+import com.android.settings.homepage.contextualcards.CardContentProvider;
+import com.android.settings.homepage.contextualcards.CardDatabaseHelper;
+import com.android.settings.homepage.contextualcards.ContextualCard;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowContentResolver;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SliceContextualCardControllerTest {
+
+    private static final String TEST_SLICE_URI = "content://test/test";
+    private static final String TEST_CARD_NAME = "test_card_name";
+
+    private Context mContext;
+    private CardContentProvider mProvider;
+    private ContentResolver mResolver;
+    private SliceContextualCardController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mProvider = Robolectric.setupContentProvider(CardContentProvider.class);
+        ShadowContentResolver.registerProviderInternal(CardContentProvider.CARD_AUTHORITY,
+                mProvider);
+        mResolver = mContext.getContentResolver();
+        mController = new SliceContextualCardController(mContext);
+    }
+
+    @Test
+    public void onDismissed_cardShouldBeMarkedAsDismissed() {
+        final Uri providerUri = CardContentProvider.URI;
+        final ContextualCard card = new ContextualCard.Builder()
+                .setName(TEST_CARD_NAME)
+                .setCardType(ContextualCard.CardType.SLICE)
+                .setSliceUri(Uri.parse(TEST_SLICE_URI))
+                .build();
+        mResolver.insert(providerUri, generateOneRow());
+
+        mController.onDismissed(card);
+
+        final String[] columns = {CardDatabaseHelper.CardColumns.CARD_DISMISSED};
+        final String selection = CardDatabaseHelper.CardColumns.NAME + "=?";
+        final String[] selectionArgs = {TEST_CARD_NAME};
+        final Cursor cr = mResolver.query(providerUri, columns, selection, selectionArgs, null);
+        cr.moveToFirst();
+        final int qryDismissed = cr.getInt(0);
+        cr.close();
+
+        assertThat(qryDismissed).isEqualTo(1);
+    }
+
+    private ContentValues generateOneRow() {
+        final ContentValues values = new ContentValues();
+        values.put(CardDatabaseHelper.CardColumns.NAME, TEST_CARD_NAME);
+        values.put(CardDatabaseHelper.CardColumns.TYPE, 1);
+        values.put(CardDatabaseHelper.CardColumns.SCORE, 0.9);
+        values.put(CardDatabaseHelper.CardColumns.SLICE_URI, TEST_SLICE_URI);
+        values.put(CardDatabaseHelper.CardColumns.CATEGORY, 2);
+        values.put(CardDatabaseHelper.CardColumns.PACKAGE_NAME, "com.android.settings");
+        values.put(CardDatabaseHelper.CardColumns.APP_VERSION, 10001);
+        values.put(CardDatabaseHelper.CardColumns.CARD_DISMISSED, 0);
+
+        return values;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
index ea6f903..1d91bb8 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
@@ -23,6 +23,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.Activity;
+import android.app.usage.NetworkStatsManager;
 import android.content.Context;
 import android.content.Intent;
 import android.provider.Settings;
@@ -48,6 +49,8 @@
 
     @Mock
     private TelephonyManager mTelephonyManager;
+    @Mock
+    private NetworkStatsManager mNetworkStatsManager;
     private DataUsagePreferenceController mController;
     private SwitchPreference mPreference;
     private Context mContext;
@@ -59,6 +62,7 @@
         mContext = spy(Robolectric.setupActivity(Activity.class));
         doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
+        doReturn(mNetworkStatsManager).when(mContext).getSystemService(NetworkStatsManager.class);
 
         mPreference = new SwitchPreference(mContext);
         mController = new DataUsagePreferenceController(mContext, "data_usage");
diff --git a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java
index ca74c19..2595bb6 100644
--- a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java
@@ -30,13 +30,10 @@
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
-import com.google.zxing.BarcodeFormat;
 import com.google.zxing.BinaryBitmap;
 import com.google.zxing.LuminanceSource;
 import com.google.zxing.RGBLuminanceSource;
-import com.google.zxing.MultiFormatWriter;
 import com.google.zxing.WriterException;
-import com.google.zxing.common.BitMatrix;
 import com.google.zxing.common.HybridBinarizer;
 
 import java.util.concurrent.CountDownLatch;
@@ -111,36 +108,17 @@
         final String googleUrl = "http://www.google.com";
 
         try {
-            Bitmap bmp = encodeQrCode(googleUrl, 320);
-            int[] intArray = new int[bmp.getWidth() * bmp.getHeight()];
+            final Bitmap bmp = QrCodeGenerator.encodeQrCode(googleUrl, 320);
+            final int[] intArray = new int[bmp.getWidth() * bmp.getHeight()];
             bmp.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight());
             LuminanceSource source = new RGBLuminanceSource(bmp.getWidth(), bmp.getHeight(),
                     intArray);
-
-            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+            final BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
             mCamera.decodeImage(bitmap);
+            bmp.recycle();
         } catch (WriterException e) {
         }
 
         assertThat(mQrCode).isEqualTo(googleUrl);
     }
-
-    private Bitmap encodeQrCode(String qrCode, int size) throws WriterException {
-        BitMatrix qrBits = null;
-        try {
-            qrBits =
-                    new MultiFormatWriter().encode(qrCode, BarcodeFormat.QR_CODE, size, size, null);
-        } catch (IllegalArgumentException iae) {
-            // Should never reach here.
-        }
-        assertThat(qrBits).isNotNull();
-
-        Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565);
-        for (int x = 0; x < size; ++x) {
-            for (int y = 0; y < size; ++y) {
-                bitmap.setPixel(x, y, qrBits.get(x, y) ? Color.BLACK : Color.WHITE);
-            }
-        }
-        return bitmap;
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index 4b765e8..ef1a3b6 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -18,15 +18,24 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.nullable;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
+import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.widget.TextView;
 
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowWifiManager;
 
@@ -37,10 +46,14 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.PreferenceScreen;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {ShadowWifiManager.class})
 public class WifiTetherSettingsTest {
@@ -98,6 +111,31 @@
                 .isNotEmpty();
     }
 
+    @Test
+    public void startFragment_notAdminUser_shouldRemoveAllPreferences() {
+        final WifiTetherSettings settings = spy(new WifiTetherSettings());
+        final FragmentActivity activity = mock(FragmentActivity.class);
+        when(settings.getActivity()).thenReturn(activity);
+        when(settings.getContext()).thenReturn(mContext);
+        final Resources.Theme theme = mContext.getTheme();
+        when(activity.getTheme()).thenReturn(theme);
+        when(activity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        doNothing().when(settings)
+            .onCreatePreferences(any(Bundle.class), nullable(String.class));
+        final FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
+        ReflectionHelpers.setField(settings, "mDashboardFeatureProvider",
+            fakeFeatureFactory.dashboardFeatureProvider);
+        final TextView emptyTextView = mock(TextView.class);
+        ReflectionHelpers.setField(settings, "mEmptyTextView", emptyTextView);
+        final PreferenceScreen screen = mock(PreferenceScreen.class);
+        doReturn(screen).when(settings).getPreferenceScreen();
+        settings.onCreate(Bundle.EMPTY);
+
+        settings.onStart();
+
+        verify(screen).removeAll();
+    }
+
     private void setupIsTetherAvailable(boolean returnValue) {
         when(mConnectivityManager.isTetheringSupported()).thenReturn(true);