Merge "Migrate emegency default app to role manager."
diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml
index 67e742c..64ddb6d 100644
--- a/res/layout/search_bar.xml
+++ b/res/layout/search_bar.xml
@@ -39,10 +39,11 @@
     </Toolbar>
     <ImageView
         android:id="@+id/account_avatar"
-        android:layout_marginStart="@dimen/search_bar_avatar_start_margin"
-        android:layout_marginEnd="@dimen/search_bar_avatar_end_margin"
-        android:layout_width="@dimen/search_bar_avatar_size"
-        android:layout_height="@dimen/search_bar_avatar_size"
-        android:layout_gravity="end|center_vertical"
+        android:paddingEnd="@dimen/search_bar_avatar_end_padding"
+        android:paddingTop="@dimen/search_bar_avatar_top_bottom_padding"
+        android:paddingBottom="@dimen/search_bar_avatar_top_bottom_padding"
+        android:layout_width="@dimen/search_bar_avatar_width"
+        android:layout_height="@dimen/search_bar_height"
+        android:layout_gravity="end"
         android:contentDescription="@string/search_bar_account_avatar_content_description"/>
 </com.google.android.material.card.MaterialCardView>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 963d19f..763d8f5 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -105,9 +105,11 @@
     <dimen name="search_bar_text_size">16dp</dimen>
     <dimen name="search_bar_card_elevation">2dp</dimen>
     <dimen name="search_bar_content_inset">64dp</dimen>
-    <dimen name="search_bar_avatar_size">32dp</dimen>
-    <dimen name="search_bar_avatar_start_margin">4dp</dimen>
-    <dimen name="search_bar_avatar_end_margin">16dp</dimen>
+    <dimen name="search_bar_avatar_end_padding">16dp</dimen>
+    <!-- 32dp (avatar size) + 16 dp (search_bar_avatar_end_padding) -->
+    <dimen name="search_bar_avatar_width">48dp</dimen>
+    <!-- (search_bar_height 48dp - avatar size 32dp) / 2  -->
+    <dimen name="search_bar_avatar_top_bottom_padding">8dp</dimen>
 
     <!-- Dimensions for Wifi Assistant Card -->
     <dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 10fc7d3..1b260f8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -728,7 +728,7 @@
     <string name="date_and_time_settings_title_setup_wizard">Set date and time</string>
     <!-- Main Settings screen setting option summary text for the item to go into the date and time settings. -->
     <string name="date_and_time_settings_summary">Set date, time, time zone, &amp; formats</string>
-    <!-- Date & time setting screen setting check box title if the date and time should be determined automatically [CHAR LIMIT=30] -->
+    <!-- Date & time setting screen setting check box title if the date and time should be determined automatically [CHAR LIMIT=100] -->
     <string name="date_time_auto">Use network-provided time</string>
     <!-- Date & time setting screen setting option text when Automatic time zone check box is selected (that is, when date and time should be determined automatically)
         [CHAR LIMIT=100]  -->
@@ -10658,7 +10658,7 @@
     <string name="permission_bar_chart_title">Most-used permissions in last 24 hours</string>
 
     <!-- Text for permission bar chart details in Privacy page.  [CHAR LIMIT=NONE] -->
-    <string name="permission_bar_chart_details">See all usage</string>
+    <string name="permission_bar_chart_details">View Permissions Dashboard</string>
 
     <!-- Title for the accessibility usage preference in the Privacy page.  [CHAR LIMIT=NONE] -->
     <string name="accessibility_usage_title">Accessibility usage</string>
diff --git a/src/com/android/settings/SmsDefaultDialog.java b/src/com/android/settings/SmsDefaultDialog.java
index c25961d..e856897 100644
--- a/src/com/android/settings/SmsDefaultDialog.java
+++ b/src/com/android/settings/SmsDefaultDialog.java
@@ -67,6 +67,7 @@
     protected void onStart() {
         super.onStart();
         getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+        android.util.EventLog.writeEvent(0x534e4554, "120484087", -1, "");
     }
 
     @Override
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 0032989..ec74cd8 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -97,6 +97,7 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.account_sync_settings);
+        getPreferenceScreen().setOrderingAsAdded(false);
         setAccessibilityTitle();
     }
 
@@ -127,6 +128,7 @@
                 .setLabel(mAccount.name)
                 .setSummary(getLabelForType(mAccount.type))
                 .done(activity, getPrefContext());
+        pref.setOrder(0);
         getPreferenceScreen().addPreference(pref);
     }
 
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
index 24b4dcd..6cd72f7 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
@@ -45,7 +45,8 @@
     static final Intent BROWSE_PROBE = new Intent()
             .setAction(Intent.ACTION_VIEW)
             .addCategory(Intent.CATEGORY_BROWSABLE)
-            .setData(Uri.parse("http:"));
+            .setData(Uri.parse("http:"))
+            .addFlags(Intent.FLAG_IGNORE_EPHEMERAL);
 
     public DefaultBrowserPreferenceController(Context context) {
         super(context);
@@ -112,11 +113,13 @@
         final List<ResolveInfo> candidates = new ArrayList<>();
         // Resolve that intent and check that the handleAllWebDataURI boolean is set
         final List<ResolveInfo> list = packageManager.queryIntentActivitiesAsUser(
-            BROWSE_PROBE, 0 /* flags */, userId);
+            BROWSE_PROBE, PackageManager.MATCH_ALL, userId);
         if (list != null) {
             final Set<String> addedPackages = new ArraySet<>();
             for (ResolveInfo info : list) {
-                if (info.activityInfo == null || !info.handleAllWebDataURI) {
+                if (!info.handleAllWebDataURI || info.activityInfo == null
+                        || !info.activityInfo.enabled
+                        || !info.activityInfo.applicationInfo.enabled) {
                     continue;
                 }
                 final String packageName = info.activityInfo.packageName;
diff --git a/src/com/android/settings/development/OemUnlockPreferenceController.java b/src/com/android/settings/development/OemUnlockPreferenceController.java
index 2a397f1..f12d835 100644
--- a/src/com/android/settings/development/OemUnlockPreferenceController.java
+++ b/src/com/android/settings/development/OemUnlockPreferenceController.java
@@ -21,11 +21,13 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.service.oemlock.OemLockManager;
 import android.telephony.TelephonyManager;
+import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -41,6 +43,7 @@
         Preference.OnPreferenceChangeListener, PreferenceControllerMixin, OnActivityResultListener {
 
     private static final String PREFERENCE_KEY = "oem_unlock_enable";
+    private static final String TAG = "OemUnlockPreferenceController";
 
     private final OemLockManager mOemLockManager;
     private final UserManager mUserManager;
@@ -52,7 +55,16 @@
     public OemUnlockPreferenceController(Context context, Activity activity,
             DevelopmentSettingsDashboardFragment fragment) {
         super(context);
-        mOemLockManager = (OemLockManager) context.getSystemService(Context.OEM_LOCK_SERVICE);
+
+        if (context.getPackageManager().hasSystemFeature(PackageManager
+                    .FEATURE_TELEPHONY_CARRIERLOCK)) {
+            mOemLockManager = (OemLockManager) context.getSystemService(Context.OEM_LOCK_SERVICE);
+        } else {
+            mOemLockManager = null;
+            Log.i(TAG, "Missing FEATURE_TELEPHONY_CARRIERLOCK, OemUnlock Preference" +
+                    " Controller disabled.");
+        }
+
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
         mFragment = fragment;
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 7a0eb0f..b9b2a1c 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -16,20 +16,13 @@
 
 package com.android.settings.homepage.contextualcards;
 
-import static android.app.slice.Slice.HINT_ERROR;
-
-import static androidx.slice.widget.SliceLiveData.SUPPORTED_SPECS;
-
 import static com.android.settings.slices.CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI;
 import static com.android.settings.slices.CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI;
 import static com.android.settings.slices.CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI;
 
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.database.Cursor;
-import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
 import android.text.format.DateUtils;
@@ -37,7 +30,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
-import androidx.slice.Slice;
 
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
@@ -45,7 +37,12 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>> {
 
@@ -55,7 +52,9 @@
     static final long CARD_CONTENT_LOADER_TIMEOUT_MS = DateUtils.SECOND_IN_MILLIS * 3;
 
     private static final String TAG = "ContextualCardLoader";
+    private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 250;
 
+    private final ExecutorService mExecutorService;
     private final ContentObserver mObserver = new ContentObserver(
             new Handler(Looper.getMainLooper())) {
         @Override
@@ -71,6 +70,7 @@
     ContextualCardLoader(Context context) {
         super(context);
         mContext = context.getApplicationContext();
+        mExecutorService = Executors.newCachedThreadPool();
     }
 
     @Override
@@ -169,43 +169,27 @@
 
     @VisibleForTesting
     List<ContextualCard> filterEligibleCards(List<ContextualCard> candidates) {
-        return candidates.stream().filter(card -> isCardEligibleToDisplay(card))
-                .collect(Collectors.toList());
-    }
+        final List<ContextualCard> cards = new ArrayList<>();
+        final List<Future<ContextualCard>> eligibleCards = new ArrayList<>();
 
-    @VisibleForTesting
-    boolean isCardEligibleToDisplay(ContextualCard card) {
-        final long startTime = System.currentTimeMillis();
-        if (card.isCustomCard()) {
-            return true;
+        for (ContextualCard card : candidates) {
+            final EligibleCardChecker future = new EligibleCardChecker(mContext, card);
+            eligibleCards.add(mExecutorService.submit(future));
         }
-
-        final Uri uri = card.getSliceUri();
-
-        if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
-            return false;
+        // Collect future and eligible cards
+        for (Future<ContextualCard> cardFuture : eligibleCards) {
+            try {
+                //TODO(b/124492762): Log latency and timeout occurrence.
+                final ContextualCard card = cardFuture.get(ELIGIBILITY_CHECKER_TIMEOUT_MS,
+                        TimeUnit.MILLISECONDS);
+                if (card != null) {
+                    cards.add(card);
+                }
+            } catch (ExecutionException | InterruptedException | TimeoutException e) {
+                Log.w(TAG, "Failed to get eligible state for card, likely timeout. Skipping", e);
+            }
         }
-
-        //check if the uri has a provider associated with.
-        final ContentProviderClient provider =
-                mContext.getContentResolver().acquireContentProviderClient(uri);
-        if (provider == null) {
-            return false;
-        }
-        //release contentProviderClient to prevent from memory leak.
-        provider.release();
-
-        final Slice slice = Slice.bindSlice(mContext, uri, SUPPORTED_SPECS);
-        //TODO(b/123668403): remove the log here once we do the change with FutureTask
-        final long bindTime = System.currentTimeMillis() - startTime;
-        Log.d(TAG, "Binding time for " + uri + " = " + bindTime);
-
-        if (slice == null || slice.hasHint(HINT_ERROR)) {
-            Log.w(TAG, "Failed to bind slice, not eligible for display " + uri);
-            return false;
-        }
-
-        return true;
+        return cards;
     }
 
     private int getNumberOfLargeCard(List<ContextualCard> cards) {
diff --git a/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java b/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
new file mode 100644
index 0000000..5423ce3
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2019 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;
+
+import static android.app.slice.Slice.HINT_ERROR;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.Uri;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.slice.Slice;
+import androidx.slice.SliceViewManager;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class EligibleCardChecker implements Callable<ContextualCard> {
+
+    private static final String TAG = "EligibleCardChecker";
+    private static final long LATCH_TIMEOUT_MS = 200;
+
+    private final Context mContext;
+    private final ContextualCard mCard;
+
+    EligibleCardChecker(Context context, ContextualCard card) {
+        mContext = context;
+        mCard = card;
+    }
+
+    @Override
+    public ContextualCard call() throws Exception {
+        return isCardEligibleToDisplay(mCard) ? mCard : null;
+    }
+
+    @VisibleForTesting
+    boolean isCardEligibleToDisplay(ContextualCard card) {
+        if (card.isCustomCard()) {
+            return true;
+        }
+
+        final Uri uri = card.getSliceUri();
+        if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+            return false;
+        }
+
+        final Slice slice = bindSlice(uri);
+        if (slice == null || slice.hasHint(HINT_ERROR)) {
+            Log.w(TAG, "Failed to bind slice, not eligible for display " + uri);
+            return false;
+        }
+        return true;
+    }
+
+    @VisibleForTesting
+    Slice bindSlice(Uri uri) {
+        final SliceViewManager manager = SliceViewManager.getInstance(mContext);
+        final Slice[] returnSlice = new Slice[1];
+        final CountDownLatch latch = new CountDownLatch(1);
+        final SliceViewManager.SliceCallback callback =
+                new SliceViewManager.SliceCallback() {
+                    @Override
+                    public void onSliceUpdated(Slice slice) {
+                        try {
+                            // We are just making sure the existence of the slice, so ignore
+                            // slice loading state here.
+                            returnSlice[0] = slice;
+                            latch.countDown();
+                        } catch (Exception e) {
+                            Log.w(TAG, uri + " cannot be indexed", e);
+                        } finally {
+                            manager.unregisterSliceCallback(uri, this);
+                        }
+                    }
+                };
+        // Register a callback until we get a loaded slice.
+        manager.registerSliceCallback(uri, callback);
+        // Trigger the binding.
+        callback.onSliceUpdated(manager.bindSlice(uri));
+        try {
+            latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            Log.w(TAG, "Error waiting for slice binding for uri" + uri, e);
+            manager.unregisterSliceCallback(uri, callback);
+        }
+        return returnSlice[0];
+    }
+}
diff --git a/src/com/android/settings/wifi/AddNetworkFragment.java b/src/com/android/settings/wifi/AddNetworkFragment.java
index 656f8ef..1a64e2f 100644
--- a/src/com/android/settings/wifi/AddNetworkFragment.java
+++ b/src/com/android/settings/wifi/AddNetworkFragment.java
@@ -61,6 +61,7 @@
             Bundle savedInstanceState) {
         final View rootView = inflater.inflate(R.layout.wifi_add_network_view, container, false);
 
+        rootView.findViewById(android.R.id.button3).setVisibility(View.GONE);
         mSubmitBtn = rootView.findViewById(SUBMIT_BUTTON_ID);
         mCancelBtn = rootView.findViewById(CANCEL_BUTTON_ID);
         final ImageButton scannerButton = rootView.findViewById(SCANNER_BUTTON_ID);
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 8e72f65..7be441a 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -27,6 +27,9 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.drawable.Drawable;
+import android.hardware.biometrics.BiometricPrompt;
+import android.os.CancellationSignal;
+import android.os.Looper;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
 import android.net.LinkAddress;
@@ -578,21 +581,43 @@
         if (keyguardManager.isKeyguardSecure()) {
             // Show authentication screen to confirm credentials (pin, pattern or password) for
             // the current user of the device.
+            final String title = mContext.getString(
+                    R.string.lockpassword_confirm_your_pattern_header);
             final String description = String.format(
                     mContext.getString(R.string.wifi_sharing_message),
                     mAccessPoint.getSsidStr());
-            final Intent intent = keyguardManager.createConfirmDeviceCredentialIntent(
-                    mContext.getString(R.string.lockpassword_confirm_your_pattern_header),
-                    description);
-            if (intent != null) {
-                mFragment.startActivityForResult(intent,
-                        WifiNetworkDetailsFragment.REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
+
+            final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(mContext)
+                    .setTitle(title)
+                    .setDescription(description);
+
+            if (keyguardManager.isDeviceSecure()) {
+                builder.setAllowDeviceCredential(true);
             }
+
+            final BiometricPrompt bp = builder.build();
+            final Handler handler = new Handler(Looper.getMainLooper());
+            bp.authenticate(new CancellationSignal(),
+                    runnable -> handler.post(runnable),
+                    mAuthenticationCallback);
         } else {
             launchWifiDppConfiguratorActivity();
         }
     }
 
+    private BiometricPrompt.AuthenticationCallback mAuthenticationCallback =
+            new BiometricPrompt.AuthenticationCallback() {
+        @Override
+        public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
+            launchWifiDppConfiguratorActivity();
+        }
+
+        @Override
+        public void onAuthenticationError(int errorCode, CharSequence errString) {
+            //Do nothing
+        }
+    };
+
     /**
      * Sign in to the captive portal found on this wifi network associated with this preference.
      */
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index 225ddbc..ab470bf 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -17,11 +17,9 @@
 
 import static com.android.settings.wifi.WifiSettings.WIFI_DIALOG_ID;
 
-import android.app.Activity;
 import android.app.Dialog;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.content.Intent;
 import android.net.ConnectivityManager;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
@@ -53,8 +51,6 @@
 
     private static final String TAG = "WifiNetworkDetailsFrg";
 
-    public static final int REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS = 1;
-
     private AccessPoint mAccessPoint;
     private WifiDetailPreferenceController mWifiDetailPreferenceController;
 
@@ -146,14 +142,4 @@
 
         return controllers;
     }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-
-        if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS
-                && resultCode == Activity.RESULT_OK) {
-            mWifiDetailPreferenceController.launchWifiDppConfiguratorActivity();
-        }
-    }
 }
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index b6fc17c..b4b94e1 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -93,8 +93,7 @@
         final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
                 null /* actionTitle */, isWifiEnabled);
 
-        final ListBuilder listBuilder = new ListBuilder(mContext, WIFI_SLICE_URI,
-                ListBuilder.INFINITY)
+        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
                 .addRow(new ListBuilder.RowBuilder()
                         .setTitle(title)
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java
index 03b3867..1aa9f9d 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java
@@ -181,11 +181,11 @@
     }
 
     @Test
-    public void getCandidates_shouldQueryActivityWithFlagsEquals0() {
+    public void getCandidates_shouldQueryActivityWithMatchAll() {
         DefaultBrowserPreferenceController.getCandidates(mPackageManager, 0 /* userId */);
 
         verify(mPackageManager).queryIntentActivitiesAsUser(
-            any(Intent.class), eq(0) /* flags */, eq(0) /* userId */);
+            any(Intent.class), eq(PackageManager.MATCH_ALL), eq(0) /* userId */);
     }
 
     @Test
@@ -221,6 +221,7 @@
         info.handleAllWebDataURI = true;
         info.activityInfo = new ActivityInfo();
         info.activityInfo.packageName = packageName;
+        info.activityInfo.applicationInfo = createApplicationInfo(packageName);
         return info;
     }
 
diff --git a/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java
index 08502dd..0d6fbd1 100644
--- a/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java
@@ -30,6 +30,7 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.os.UserManager;
 import android.service.oemlock.OemLockManager;
@@ -60,6 +61,8 @@
     @Mock
     private RestrictedSwitchPreference mPreference;
     @Mock
+    private PackageManager mPackageManager;
+    @Mock
     private PreferenceScreen mPreferenceScreen;
     @Mock
     private OemLockManager mOemLockManager;
@@ -74,6 +77,9 @@
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mContext.getPackageManager().hasSystemFeature(PackageManager
+                    .FEATURE_TELEPHONY_CARRIERLOCK)).thenReturn(true);
         when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenReturn(mOemLockManager);
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
@@ -87,6 +93,16 @@
     }
 
     @Test
+    public void OemUnlockPreferenceController_shouldNotCrashWhenMissingFEATURE_TELEPHONY_CARRIERLOCK() {
+        when(mContext.getPackageManager().hasSystemFeature(PackageManager
+                    .FEATURE_TELEPHONY_CARRIERLOCK)).thenReturn(false);
+        when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenThrow
+            (new RuntimeException());
+
+        new OemUnlockPreferenceController(mContext, mActivity, mFragment);
+    }
+
+    @Test
     public void isAvailable_shouldReturnTrueWhenOemLockManagerIsNotNull() {
         boolean returnValue = mController.isAvailable();
 
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
index f04008b..18aa1c4 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.homepage.contextualcards;
 
+import static android.app.slice.Slice.HINT_ERROR;
+
 import static com.android.settings.homepage.contextualcards.ContextualCardLoader.DEFAULT_CARD_COUNT;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -27,6 +29,8 @@
 import android.content.Context;
 import android.net.Uri;
 
+import androidx.slice.Slice;
+
 import com.android.settings.R;
 import com.android.settings.slices.CustomSliceRegistry;
 
@@ -43,13 +47,18 @@
 @RunWith(RobolectricTestRunner.class)
 public class ContextualCardLoaderTest {
 
+    private static final String TEST_SLICE_URI = "content://test/test";
+
     private Context mContext;
     private ContextualCardLoader mContextualCardLoader;
+    private EligibleCardChecker mEligibleCardChecker;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mContextualCardLoader = spy(new ContextualCardLoader(mContext));
+        mEligibleCardChecker =
+                spy(new EligibleCardChecker(mContext, getContextualCard(TEST_SLICE_URI)));
     }
 
     @Test
@@ -61,25 +70,33 @@
                 .setSummaryText("custom_summary")
                 .build();
 
-        assertThat(mContextualCardLoader.isCardEligibleToDisplay(customCard)).isTrue();
+        assertThat(mEligibleCardChecker.isCardEligibleToDisplay(customCard)).isTrue();
     }
 
     @Test
     public void isCardEligibleToDisplay_invalidScheme_returnFalse() {
         final String sliceUri = "contet://com.android.settings.slices/action/flashlight";
 
-        assertThat(
-                mContextualCardLoader.isCardEligibleToDisplay(
-                        getContextualCard(sliceUri))).isFalse();
+        assertThat(mEligibleCardChecker.isCardEligibleToDisplay(getContextualCard(sliceUri)))
+                .isFalse();
     }
 
     @Test
-    public void isCardEligibleToDisplay_noProvider_returnFalse() {
-        final String sliceUri = "content://com.android.settings.test.slices/action/flashlight";
+    public void isCardEligibleToDisplay_nullSlice_returnFalse() {
+        doReturn(null).when(mEligibleCardChecker).bindSlice(Uri.parse(TEST_SLICE_URI));
 
-        assertThat(
-                mContextualCardLoader.isCardEligibleToDisplay(
-                        getContextualCard(sliceUri))).isFalse();
+        assertThat(mEligibleCardChecker.isCardEligibleToDisplay(getContextualCard(TEST_SLICE_URI)))
+                .isFalse();
+    }
+
+    @Test
+    public void isCardEligibleToDisplay_errorSlice_returnFalse() {
+        final Slice slice = new Slice.Builder(Uri.parse(TEST_SLICE_URI))
+                .addHints(HINT_ERROR).build();
+        doReturn(slice).when(mEligibleCardChecker).bindSlice(Uri.parse(TEST_SLICE_URI));
+
+        assertThat(mEligibleCardChecker.isCardEligibleToDisplay(getContextualCard(TEST_SLICE_URI)))
+                .isFalse();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
index f9913f6..f664f4f 100644
--- a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
@@ -33,6 +33,7 @@
 import android.os.UserManager;
 import android.permission.RuntimePermissionUsageInfo;
 import android.provider.DeviceConfig;
+import android.view.accessibility.AccessibilityManager;
 
 import androidx.preference.PreferenceScreen;
 
@@ -55,6 +56,7 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAccessibilityManager;
 import org.robolectric.shadows.androidx.fragment.FragmentController;
 
 import java.util.ArrayList;
@@ -80,6 +82,9 @@
         final Context context = RuntimeEnvironment.application;
         final UserManager userManager = context.getSystemService(UserManager.class);
         final ShadowUserManager shadowUserManager = Shadow.extract(userManager);
+        final ShadowAccessibilityManager accessibilityManager = Shadow.extract(
+                AccessibilityManager.getInstance(context));
+        accessibilityManager.setEnabledAccessibilityServiceList(new ArrayList<>());
         shadowUserManager.addProfile(new UserInfo(123, null, 0));
         when(FakeFeatureFactory.setupForTest().securityFeatureProvider.getLockPatternUtils(
                 any(Context.class))).thenReturn(mLockPatternUtils);
diff --git a/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java
index 161c39a..482eaeb 100644
--- a/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java
@@ -29,6 +29,7 @@
 import android.os.UserManager;
 import android.permission.PermissionControllerManager;
 import android.view.View;
+import android.view.accessibility.AccessibilityManager;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.testutils.FakeFeatureFactory;
@@ -44,8 +45,11 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAccessibilityManager;
 import org.robolectric.shadows.androidx.fragment.FragmentController;
 
+import java.util.ArrayList;
+
 
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowUserManager.class, ShadowPermissionControllerManager.class})
@@ -65,6 +69,9 @@
         mContext = RuntimeEnvironment.application;
         final UserManager userManager = mContext.getSystemService(UserManager.class);
         final ShadowUserManager shadowUserManager = Shadow.extract(userManager);
+        final ShadowAccessibilityManager accessibilityManager = Shadow.extract(
+                AccessibilityManager.getInstance(mContext));
+        accessibilityManager.setEnabledAccessibilityServiceList(new ArrayList<>());
         shadowUserManager.addProfile(new UserInfo(123, null, 0));
         when(FakeFeatureFactory.setupForTest().securityFeatureProvider.getLockPatternUtils(
                 any(Context.class))).thenReturn(mLockPatternUtils);
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
index b7f713d..d681afe 100644
--- a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
@@ -35,6 +35,7 @@
 import androidx.slice.widget.SliceLiveData;
 
 import com.android.settings.R;
+import com.android.settings.slices.CustomSliceRegistry;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -97,4 +98,13 @@
                 R.drawable.ic_settings_wireless);
         assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedToggleIcon.toString());
     }
+
+    @Test
+    public void getWifiSlice_contextualWifiSlice_shouldReturnContextualWifiSliceUri() {
+        mWifiSlice.mPreviouslyDisplayed = true;
+
+        final Slice wifiSlice = mWifiSlice.getSlice();
+
+        assertThat(wifiSlice.getUri()).isEqualTo(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI);
+    }
 }
diff --git a/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
index 82fcd7d..447e2b4 100644
--- a/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -21,9 +21,12 @@
 import android.content.Context;
 import android.net.Uri;
 
+import androidx.slice.Slice;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.settings.slices.CustomSliceRegistry;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,36 +37,57 @@
 @RunWith(AndroidJUnit4.class)
 public class ContextualCardLoaderTest {
 
+    private static final Uri TEST_URI = Uri.parse("content://test/test");
+
     private Context mContext;
     private ContextualCardLoader mContextualCardLoader;
+    private EligibleCardChecker mEligibleCardChecker;
 
     @Before
     public void setUp() {
         mContext = InstrumentationRegistry.getTargetContext();
         mContextualCardLoader = new ContextualCardLoader(mContext);
+        mEligibleCardChecker = new EligibleCardChecker(mContext, getContextualCard(TEST_URI));
     }
 
     @Test
-    public void filter_twoInvalidCards_shouldReturnOneCard() {
+    public void filterEligibleCards_twoInvalidCards_shouldReturnOneCard() {
         final String sliceUri1 = "content://com.android.settings.slices/action/flashlight"; //valid
         final String sliceUri2 = "content://com.android.settings.test.slices/action/flashlight";
         final String sliceUri3 = "cotent://com.android.settings.slices/action/flashlight";
 
         final List<ContextualCard> cards = new ArrayList<>();
-        cards.add(getContextualCard(sliceUri1));
-        cards.add(getContextualCard(sliceUri2));
-        cards.add(getContextualCard(sliceUri3));
+        cards.add(getContextualCard(Uri.parse(sliceUri1)));
+        cards.add(getContextualCard(Uri.parse(sliceUri2)));
+        cards.add(getContextualCard(Uri.parse(sliceUri3)));
 
         final List<ContextualCard> result = mContextualCardLoader.filterEligibleCards(cards);
 
         assertThat(result).hasSize(1);
     }
 
-    private ContextualCard getContextualCard(String sliceUri) {
+    @Test
+    public void bindSlice_flashlightUri_shouldReturnFlashlightSlice() {
+        final Slice loadedSlice =
+                mEligibleCardChecker.bindSlice(CustomSliceRegistry.FLASHLIGHT_SLICE_URI);
+
+        assertThat(loadedSlice.getUri()).isEqualTo(CustomSliceRegistry.FLASHLIGHT_SLICE_URI);
+    }
+
+    @Test
+    public void bindSlice_noProvider_shouldReturnNull() {
+        final String sliceUri = "content://com.android.settings.test.slices/action/flashlight";
+
+        final Slice loadedSlice = mEligibleCardChecker.bindSlice(Uri.parse(sliceUri));
+
+        assertThat(loadedSlice).isNull();
+    }
+
+    private ContextualCard getContextualCard(Uri sliceUri) {
         return new ContextualCard.Builder()
                 .setName("test_card")
                 .setCardType(ContextualCard.CardType.SLICE)
-                .setSliceUri(Uri.parse(sliceUri))
+                .setSliceUri(sliceUri)
                 .build();
     }
 }