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, & 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();
}
}