Snap for 5271441 from 6b3db61e53 to qt-release
Change-Id: I16f7be6708c90be69f434640ba74c0ccab58cd58
This commit is contained in:
@@ -2776,13 +2776,17 @@
|
||||
android:value="com.android.settings.webview.WebViewAppPicker" />
|
||||
</activity-alias>
|
||||
|
||||
<activity android:name=".backup.BackupSettingsActivity"
|
||||
<provider
|
||||
android:name=".backup.BackupSettingsContentProvider"
|
||||
android:authorities="com.android.settings.backup.BackupSettingsContentProvider"
|
||||
android:exported="true">
|
||||
</provider>
|
||||
|
||||
<activity android:name=".backup.UserBackupSettingsActivity"
|
||||
android:label="@string/privacy_settings_title"
|
||||
android:icon="@drawable/ic_settings_backup"
|
||||
android:parentActivityName="Settings">
|
||||
android:icon="@drawable/ic_settings_backup">
|
||||
<intent-filter android:priority="1">
|
||||
<action android:name="android.settings.PRIVACY_SETTINGS" />
|
||||
<action android:name="android.settings.BACKUP_AND_RESET_SETTINGS" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
@@ -2790,10 +2794,16 @@
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.VOICE_LAUNCH" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="com.android.settings.summary"
|
||||
android:resource="@string/summary_empty"/>
|
||||
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
||||
android:value="true" />
|
||||
<!-- Mark the activity as a dynamic setting -->
|
||||
<intent-filter>
|
||||
<action android:name="com.android.settings.action.IA_SETTINGS" />
|
||||
</intent-filter>
|
||||
<!-- Tell Settings app which category it belongs to -->
|
||||
<meta-data android:name="com.android.settings.category"
|
||||
android:value="com.android.settings.category.ia.system" />
|
||||
<meta-data android:name="com.android.settings.summary_uri"
|
||||
android:value="content://com.android.settings.backup.BackupSettingsContentProvider/summary" />
|
||||
<meta-data android:name="com.android.settings.order" android:value="-60"/>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
|
||||
30
res/drawable/ic_devices_check_circle_green.xml
Normal file
30
res/drawable/ic_devices_check_circle_green.xml
Normal file
@@ -0,0 +1,30 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<layer-list
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:drawable="@drawable/ic_devices_other_opaque_black"
|
||||
android:width="@dimen/wifi_dpp_fragment_icon_width_height"
|
||||
android:height="@dimen/wifi_dpp_fragment_icon_width_height"
|
||||
android:gravity="center"/>
|
||||
|
||||
<item
|
||||
android:drawable="@drawable/ic_check_circle_green"
|
||||
android:top="28dp"
|
||||
android:left="44dp"
|
||||
android:gravity="center"/>
|
||||
|
||||
</layer-list>
|
||||
@@ -15,26 +15,20 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/ContextualCardStyle">
|
||||
android:layout_height="@dimen/homepage_condition_footer_height"
|
||||
android:contentDescription="@string/homepage_condition_footer_content_description"
|
||||
android:gravity="end"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="@dimen/homepage_condition_footer_padding_top"
|
||||
android:paddingEnd="@dimen/homepage_condition_footer_padding_end">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/homepage_condition_footer_height"
|
||||
android:contentDescription="@string/homepage_condition_footer_content_description"
|
||||
android:gravity="end"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="@dimen/homepage_condition_footer_padding_top"
|
||||
android:paddingEnd="@dimen/homepage_condition_footer_padding_end">
|
||||
<ImageView
|
||||
android:id="@+id/collapse_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_expand_less"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/collapse_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_expand_less" />
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</LinearLayout>
|
||||
@@ -28,9 +28,9 @@
|
||||
settings:layout_behavior="com.android.settings.widget.FloatingAppBarScrollingViewBehavior">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/content_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/app_bar_height">
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/list_container"
|
||||
|
||||
@@ -28,8 +28,16 @@
|
||||
|
||||
<ImageView
|
||||
android:id="@android:id/icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_width="@dimen/wifi_dpp_fragment_icon_width_height"
|
||||
android:layout_height="@dimen/wifi_dpp_fragment_icon_width_height"
|
||||
android:scaleType="fitCenter"/>
|
||||
|
||||
<!-- Special header icon only for ic_devices_check_circle_green -->
|
||||
<ImageView
|
||||
android:id="@+id/devices_check_circle_green_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_devices_check_circle_green"
|
||||
android:scaleType="fitCenter"/>
|
||||
|
||||
<TextView
|
||||
|
||||
@@ -41,10 +41,6 @@
|
||||
<!-- Whether to show Camera laser sensor switch in Developer Options -->
|
||||
<bool name="config_show_camera_laser_sensor">false</bool>
|
||||
|
||||
<!-- Whether to show Connected MAC Randomization in Developer Options
|
||||
as not all devices can support dynamic MAC address change. -->
|
||||
<bool name="config_wifi_support_connected_mac_randomization">false</bool>
|
||||
|
||||
<!-- Fully-qualified class name for the implementation of the FeatureFactory to be instantiated. -->
|
||||
<string name="config_featureFactory" translatable="false">com.android.settings.overlay.FeatureFactoryImpl</string>
|
||||
|
||||
|
||||
@@ -385,6 +385,9 @@
|
||||
<dimen name="qrcode_size">264dp</dimen>
|
||||
<dimen name="qrcode_preview_size">360dp</dimen>
|
||||
|
||||
<!-- Wi-Fi DPP fragment icon size -->
|
||||
<dimen name="wifi_dpp_fragment_icon_width_height">48dp</dimen>
|
||||
|
||||
<!-- Height for slice preference, which contains 6 items at most -->
|
||||
<dimen name="slice_preference_group_height">360dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -1871,6 +1871,11 @@
|
||||
<!-- Dialog content for NFC disclaimer: telling user NFC can exchange data when device is nearby other devices (for example: payment terminals, badge reader etc). [CHAR_LIMIT=NONE]-->
|
||||
<string name="nfc_disclaimer_content">NFC exchanges data between this device and other nearby devices or targets, such as payment terminals, access readers, and interactive ads or tags.</string>
|
||||
|
||||
<!-- Used in the settings screen to secure NFC [CHAR LIMIT=NONE] -->
|
||||
<string name="nfc_secure_settings_title">Secure NFC</string>
|
||||
<!-- Description of Secure NFC in the 1st level settings screen. [CHAR LIMIT=NONE] -->
|
||||
<string name="nfc_secure_toggle_summary" product="default">Allow NFC Payment and Transit use only when screen is unlocked</string>
|
||||
|
||||
<!-- Used to enter the Android Beam sharing preferences screen. This phrase is a trademark. [CHAR LIMIT=32] -->
|
||||
<string name="android_beam_settings_title">Android Beam</string>
|
||||
<!-- Used to describe the on state of the Android Beam feature [CHAR LIMIT=NONE] -->
|
||||
@@ -1878,7 +1883,7 @@
|
||||
<!-- Used to describe the off state of the Android Beam feature [CHAR LIMIT=NONE] -->
|
||||
<string name="android_beam_off_summary">Off</string>
|
||||
<!-- Used to describe the enabled state of the Android Beam feature when NFC, which it relies on, is turned off [CHAR LIMIT=NONE] -->
|
||||
<string name="android_beam_disabled_summary">Unavailable because NFC is turned off</string>
|
||||
<string name="nfc_disabled_summary">Unavailable because NFC is turned off</string>
|
||||
<!-- Used in the Android Beam sharing preferences screen. This phrase is a trademark. [CHAR LIMIT=32] -->
|
||||
<string name="android_beam_label">Android Beam</string>
|
||||
<!-- Explanation of the Android Beam feature in the Android Beam settings panel. The use of "beam" here is as a verb and not considered trademarked. [CHAR LIMIT=NONE] -->
|
||||
@@ -7402,12 +7407,6 @@
|
||||
<!-- Do not disturb: Label for button that will turn off zen mode. [CHAR LIMIT=30] -->
|
||||
<string name="zen_mode_button_turn_off">Turn off now</string>
|
||||
|
||||
<!-- Setting title for controlling how caption text display in real time [CHAR LIMIT=40]-->
|
||||
<string name="live_captions_title">Live Caption</string>
|
||||
|
||||
<!-- Setting summary for controlling how caption text display in real time [CHAR LIMIT=NONE]-->
|
||||
<string name="live_captions_summary">Auto-convert on-device audio to captions</string>
|
||||
|
||||
<!-- [CHAR LIMIT=110] Zen mode settings footer: Footer showing end time of DND -->
|
||||
<string name="zen_mode_settings_dnd_manual_end_time">Do Not Disturb is on until <xliff:g id="formatted_time" example="7:00 AM">%s</xliff:g></string>
|
||||
|
||||
@@ -7592,6 +7591,12 @@
|
||||
<!-- Configure Notifications: Work profile section header [CHAR LIMIT=30] -->
|
||||
<string name="profile_section_header">Work notifications</string>
|
||||
|
||||
<!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
|
||||
<string name="hide_silent_icons_title">Hide silent notification status icons</string>
|
||||
|
||||
<!-- Configure Notifications: setting summary [CHAR LIMIT=NONE] -->
|
||||
<string name="hide_silent_icons_summary">Hide icons for silent notifications in the status bar</string>
|
||||
|
||||
<!-- Configure Notifications: Title for the notification badging option. [CHAR LIMIT=30 BACKUP_MESSAGE_ID=5125022693565388760] -->
|
||||
<string name="notification_badging_title">Allow notification dots</string>
|
||||
|
||||
|
||||
@@ -124,12 +124,6 @@
|
||||
android:key="audio_and_captions_category"
|
||||
android:title="@string/audio_and_captions_category_title">
|
||||
|
||||
<Preference
|
||||
android:key="live_caption"
|
||||
android:title="@string/live_captions_title"
|
||||
android:summary="@string/live_captions_summary"
|
||||
settings:controller="com.android.settings.accessibility.LiveCaptionPreferenceController"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="toggle_master_mono"
|
||||
android:title="@string/accessibility_toggle_master_mono_title"
|
||||
|
||||
@@ -26,6 +26,12 @@
|
||||
android:summary="@string/summary_placeholder"
|
||||
settings:searchable="false"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="hide_silent_icons"
|
||||
android:title="@string/hide_silent_icons_title"
|
||||
android:summary="@string/hide_silent_icons_summary"
|
||||
settings:controller="com.android.settings.notification.SilentStatusBarPreferenceController" />
|
||||
|
||||
<!-- Notification badging -->
|
||||
<SwitchPreference
|
||||
android:key="notification_badging"
|
||||
|
||||
@@ -44,6 +44,14 @@
|
||||
android:icon="@drawable/ic_android"
|
||||
android:order="-6"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="nfc_secure_settings"
|
||||
android:title="@string/nfc_secure_settings_title"
|
||||
settings:controller="com.android.settings.nfc.SecureNfcPreferenceController"
|
||||
android:icon="@drawable/ic_nfc"
|
||||
android:summary="@string/nfc_secure_toggle_summary"
|
||||
android:order="-7"/>
|
||||
|
||||
<com.android.settingslib.RestrictedPreference
|
||||
android:key="connected_device_printing"
|
||||
android:title="@string/print_settings"
|
||||
|
||||
@@ -221,11 +221,6 @@
|
||||
android:title="@string/wifi_verbose_logging"
|
||||
android:summary="@string/wifi_verbose_logging_summary" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="wifi_connected_mac_randomization"
|
||||
android:title="@string/wifi_connected_mac_randomization"
|
||||
android:summary="@string/wifi_connected_mac_randomization_summary" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="mobile_data_always_on"
|
||||
android:title="@string/mobile_data_always_on"
|
||||
|
||||
@@ -29,17 +29,6 @@
|
||||
android:fragment="com.android.settings.gestures.GestureSettings"
|
||||
settings:controller="com.android.settings.gestures.GesturesSettingPreferenceController"/>
|
||||
|
||||
<!-- Backup -->
|
||||
<Preference
|
||||
android:key="backup_settings"
|
||||
android:title="@string/privacy_settings_title"
|
||||
android:summary="@string/summary_placeholder"
|
||||
android:icon="@drawable/ic_settings_backup"
|
||||
android:order="-60"
|
||||
settings:controller="com.android.settings.backup.BackupSettingsActivityPreferenceController">
|
||||
<intent android:action="android.settings.BACKUP_AND_RESET_SETTINGS" />
|
||||
</Preference>
|
||||
|
||||
<Preference
|
||||
android:key="reset_dashboard"
|
||||
android:title="@string/reset_dashboard_title"
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.settings;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
@@ -51,7 +52,6 @@ import androidx.preference.PreferenceManager;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.settings.Settings.WifiSettingsActivity;
|
||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||
import com.android.settings.backup.BackupSettingsActivity;
|
||||
import com.android.settings.core.OnActivityResultListener;
|
||||
import com.android.settings.core.SettingsBaseActivity;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
@@ -287,7 +287,7 @@ public class SettingsActivity extends SettingsBaseActivity
|
||||
final Toolbar toolbar = findViewById(R.id.search_action_bar);
|
||||
setActionBar(toolbar);
|
||||
FeatureFactory.getFactory(this).getSearchFeatureProvider()
|
||||
.initSearchToolbar(this, toolbar);
|
||||
.initSearchToolbar(this, toolbar, SettingsEnums.SETTINGS_HOMEPAGE);
|
||||
}
|
||||
|
||||
ActionBar actionBar = getActionBar();
|
||||
@@ -651,11 +651,6 @@ public class SettingsActivity extends SettingsBaseActivity
|
||||
showDev, isAdmin)
|
||||
|| somethingChanged;
|
||||
|
||||
// Enable/disable backup settings depending on whether the user is admin.
|
||||
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
|
||||
BackupSettingsActivity.class.getName()), true, isAdmin)
|
||||
|| somethingChanged;
|
||||
|
||||
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
|
||||
Settings.WifiDisplaySettingsActivity.class.getName()),
|
||||
WifiDisplaySettings.isAvailable(this), isAdmin)
|
||||
|
||||
@@ -21,6 +21,8 @@ import static android.content.pm.PackageManager.GET_META_DATA;
|
||||
import static android.content.pm.PackageManager.GET_RESOLVED_FILTER;
|
||||
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
@@ -51,14 +53,13 @@ public class SettingsInitialize extends BroadcastReceiver {
|
||||
private static final String TAG = "Settings";
|
||||
private static final String PRIMARY_PROFILE_SETTING =
|
||||
"com.android.settings.PRIMARY_PROFILE_CONTROLLED";
|
||||
private static final String SETTINGS_PACKAGE = "com.android.settings";
|
||||
private static final String WEBVIEW_IMPLEMENTATION_ACTIVITY = ".WebViewImplementation";
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent broadcast) {
|
||||
final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||
UserInfo userInfo = um.getUserInfo(UserHandle.myUserId());
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
managedProfileSetup(context, pm, broadcast, userInfo);
|
||||
webviewSettingSetup(context, pm, userInfo);
|
||||
refreshExistingShortcuts(context);
|
||||
@@ -91,7 +92,7 @@ public class SettingsInitialize extends BroadcastReceiver {
|
||||
PRIMARY_PROFILE_SETTING);
|
||||
if (shouldForward) {
|
||||
pm.addCrossProfileIntentFilter(info.filter, userInfo.id,
|
||||
userInfo.profileGroupId, PackageManager.SKIP_CURRENT_PROFILE);
|
||||
userInfo.profileGroupId, PackageManager.SKIP_CURRENT_PROFILE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -113,7 +114,8 @@ public class SettingsInitialize extends BroadcastReceiver {
|
||||
return;
|
||||
}
|
||||
ComponentName settingsComponentName =
|
||||
new ComponentName(SETTINGS_PACKAGE, SETTINGS_PACKAGE + WEBVIEW_IMPLEMENTATION_ACTIVITY);
|
||||
new ComponentName(SETTINGS_PACKAGE_NAME,
|
||||
SETTINGS_PACKAGE_NAME + WEBVIEW_IMPLEMENTATION_ACTIVITY);
|
||||
pm.setComponentEnabledSetting(settingsComponentName,
|
||||
userInfo.isAdmin() ?
|
||||
PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
|
||||
|
||||
@@ -111,16 +111,7 @@ public final class Utils extends com.android.settingslib.Utils {
|
||||
*/
|
||||
public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1;
|
||||
|
||||
/**
|
||||
* Color spectrum to use to indicate badness. 0 is completely transparent (no data),
|
||||
* 1 is most bad (red), the last value is least bad (green).
|
||||
*/
|
||||
public static final int[] BADNESS_COLORS = new int[] {
|
||||
0x00000000, 0xffc43828, 0xffe54918, 0xfff47b00,
|
||||
0xfffabf2c, 0xff679e37, 0xff0a7f42
|
||||
};
|
||||
|
||||
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
|
||||
public static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
|
||||
|
||||
public static final String OS_PKG = "os";
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
private static final String CATEGORY_EXPERIMENTAL = "experimental_category";
|
||||
private static final String CATEGORY_DOWNLOADED_SERVICES = "user_installed_services_category";
|
||||
|
||||
private static final String[] CATEGORIES = new String[]{
|
||||
private static final String[] CATEGORIES = new String[] {
|
||||
CATEGORY_SCREEN_READER, CATEGORY_AUDIO_AND_CAPTIONS, CATEGORY_DISPLAY,
|
||||
CATEGORY_INTERACTION_CONTROL, CATEGORY_EXPERIMENTAL, CATEGORY_DOWNLOADED_SERVICES
|
||||
};
|
||||
@@ -133,8 +133,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
"accessibility_content_timeout_preference_fragment";
|
||||
private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE =
|
||||
"accessibility_control_timeout_preference_fragment";
|
||||
private static final String LIVE_CAPTION_PREFERENCE_KEY =
|
||||
"live_caption";
|
||||
|
||||
|
||||
// Extras passed to sub-fragments.
|
||||
static final String EXTRA_PREFERENCE_KEY = "preference_key";
|
||||
@@ -234,11 +233,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
private Preference mDisplayDaltonizerPreferenceScreen;
|
||||
private Preference mHearingAidPreference;
|
||||
private Preference mVibrationPreferenceScreen;
|
||||
private Preference mLiveCaptionPreference;
|
||||
private SwitchPreference mToggleInversionPreference;
|
||||
private ColorInversionPreferenceController mInversionPreferenceController;
|
||||
private AccessibilityHearingAidPreferenceController mHearingAidPreferenceController;
|
||||
private LiveCaptionPreferenceController mLiveCaptionPreferenceController;
|
||||
|
||||
private int mLongPressTimeoutDefault;
|
||||
|
||||
@@ -297,9 +294,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
(context, HEARING_AID_PREFERENCE);
|
||||
mHearingAidPreferenceController.setFragmentManager(getFragmentManager());
|
||||
getLifecycle().addObserver(mHearingAidPreferenceController);
|
||||
|
||||
mLiveCaptionPreferenceController = new LiveCaptionPreferenceController(context,
|
||||
LIVE_CAPTION_PREFERENCE_KEY);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -488,10 +482,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
// Captioning.
|
||||
mCaptioningPreferenceScreen = findPreference(CAPTIONING_PREFERENCE_SCREEN);
|
||||
|
||||
// Live caption
|
||||
mLiveCaptionPreference = findPreference(LIVE_CAPTION_PREFERENCE_KEY);
|
||||
mLiveCaptionPreferenceController.displayPreference(getPreferenceScreen());
|
||||
|
||||
// Display magnification.
|
||||
mDisplayMagnificationPreferenceScreen = findPreference(
|
||||
DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN);
|
||||
@@ -727,8 +717,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
|
||||
mHearingAidPreferenceController.updateState(mHearingAidPreference);
|
||||
|
||||
mLiveCaptionPreferenceController.updateState(mLiveCaptionPreference);
|
||||
|
||||
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,
|
||||
mCaptioningPreferenceScreen);
|
||||
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
|
||||
@@ -749,6 +737,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
}
|
||||
|
||||
void updateAccessibilityTimeoutSummary(ContentResolver resolver, Preference pref) {
|
||||
|
||||
String[] timeoutSummarys = getResources().getStringArray(
|
||||
R.array.accessibility_timeout_summaries);
|
||||
int[] timeoutValues = getResources().getIntArray(
|
||||
@@ -817,7 +806,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
pref.setSummary(entries[index]);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
void updateVibrationSummary(Preference pref) {
|
||||
final Context context = getContext();
|
||||
final Vibrator vibrator = context.getSystemService(Vibrator.class);
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* 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.accessibility;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class LiveCaptionPreferenceController extends BasePreferenceController {
|
||||
|
||||
@VisibleForTesting
|
||||
static final Intent LIVE_CAPTION_INTENT = new Intent(
|
||||
"com.android.settings.action.live_caption");
|
||||
|
||||
private final PackageManager mPackageManager;
|
||||
|
||||
public LiveCaptionPreferenceController(Context context, String preferenceKey) {
|
||||
super(context, preferenceKey);
|
||||
mPackageManager = context.getPackageManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
final List<ResolveInfo> resolved =
|
||||
mPackageManager.queryIntentActivities(LIVE_CAPTION_INTENT, 0 /* flags */);
|
||||
return resolved != null && !resolved.isEmpty()
|
||||
? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
preference.setIntent(LIVE_CAPTION_INTENT);
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.applications;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.app.Application;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.app.usage.UsageStats;
|
||||
@@ -91,7 +93,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
|
||||
SKIP_SYSTEM_PACKAGES.addAll(Arrays.asList(
|
||||
"android",
|
||||
"com.android.phone",
|
||||
"com.android.settings",
|
||||
SETTINGS_PACKAGE_NAME,
|
||||
"com.android.systemui",
|
||||
"com.android.providers.calendar",
|
||||
"com.android.providers.media"
|
||||
|
||||
@@ -14,27 +14,15 @@
|
||||
|
||||
package com.android.settings.applications.appinfo;
|
||||
|
||||
import android.app.role.RoleManager;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
|
||||
|
||||
public class DefaultPhoneShortcutPreferenceController
|
||||
extends DefaultAppShortcutPreferenceControllerBase {
|
||||
|
||||
private static final String KEY = "default_phone_app";
|
||||
|
||||
public DefaultPhoneShortcutPreferenceController(Context context, String packageName) {
|
||||
super(context, KEY, packageName);
|
||||
super(context, KEY, RoleManager.ROLE_DIALER, packageName);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasAppCapability() {
|
||||
return DefaultPhonePreferenceController.hasPhonePreference(mPackageName, mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDefaultApp() {
|
||||
return DefaultPhonePreferenceController.isPhoneDefault(mPackageName, mContext);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -185,7 +185,6 @@ public class ManageApplications extends InstrumentedFragment
|
||||
private ApplicationsAdapter mApplications;
|
||||
|
||||
private View mLoadingContainer;
|
||||
|
||||
private View mListContainer;
|
||||
private RecyclerView mRecyclerView;
|
||||
private SearchView mSearchView;
|
||||
@@ -216,10 +215,15 @@ public class ManageApplications extends InstrumentedFragment
|
||||
LIST_TYPE_MAIN,
|
||||
LIST_TYPE_STORAGE));
|
||||
|
||||
@VisibleForTesting
|
||||
View mSpinnerHeader;
|
||||
@VisibleForTesting
|
||||
FilterSpinnerAdapter mFilterAdapter;
|
||||
@VisibleForTesting
|
||||
View mContentContainer;
|
||||
|
||||
private View mRootView;
|
||||
private View mSpinnerHeader;
|
||||
private Spinner mFilterSpinner;
|
||||
private FilterSpinnerAdapter mFilterAdapter;
|
||||
private IUsageStatsManager mUsageStatsManager;
|
||||
private UserManager mUserManager;
|
||||
private NotificationBackend mNotificationBackend;
|
||||
@@ -326,6 +330,7 @@ public class ManageApplications extends InstrumentedFragment
|
||||
Bundle savedInstanceState) {
|
||||
mRootView = inflater.inflate(R.layout.manage_applications_apps, null);
|
||||
mLoadingContainer = mRootView.findViewById(R.id.loading_container);
|
||||
mContentContainer = mRootView.findViewById(R.id.content_container);
|
||||
mListContainer = mRootView.findViewById(R.id.list_container);
|
||||
if (mListContainer != null) {
|
||||
// Create adapter and list view here
|
||||
@@ -794,8 +799,7 @@ public class ManageApplications extends InstrumentedFragment
|
||||
}
|
||||
mFilterOptions.add(filter);
|
||||
Collections.sort(mFilterOptions);
|
||||
mManageApplications.mSpinnerHeader.setVisibility(
|
||||
mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
|
||||
updateFilterView(mFilterOptions.size() > 1);
|
||||
notifyDataSetChanged();
|
||||
if (mFilterOptions.size() == 1) {
|
||||
if (DEBUG) {
|
||||
@@ -826,14 +830,13 @@ public class ManageApplications extends InstrumentedFragment
|
||||
filter.getTitle()));
|
||||
}
|
||||
Collections.sort(mFilterOptions);
|
||||
mManageApplications.mSpinnerHeader.setVisibility(
|
||||
mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
|
||||
updateFilterView(mFilterOptions.size() > 1);
|
||||
notifyDataSetChanged();
|
||||
if (mManageApplications.mFilter == filter) {
|
||||
if (mFilterOptions.size() > 0) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0)
|
||||
+ mContext.getText(mFilterOptions.get(0).getTitle()));
|
||||
+ mContext.getText(mFilterOptions.get(0).getTitle()));
|
||||
}
|
||||
mManageApplications.mFilterSpinner.setSelection(0);
|
||||
mManageApplications.onItemSelected(null, null, 0, 0);
|
||||
@@ -850,6 +853,26 @@ public class ManageApplications extends InstrumentedFragment
|
||||
public CharSequence getItem(int position) {
|
||||
return mContext.getText(mFilterOptions.get(position).getTitle());
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void updateFilterView(boolean hasFilter) {
|
||||
// If we need to add a floating filter in this screen, we should have an extra top
|
||||
// padding for putting floating filter view. Otherwise, the content of list will be
|
||||
// overlapped by floating filter.
|
||||
if (hasFilter) {
|
||||
mManageApplications.mSpinnerHeader.setVisibility(View.VISIBLE);
|
||||
mManageApplications.mContentContainer.setPadding(0 /* left */,
|
||||
mContext.getResources().getDimensionPixelSize(
|
||||
R.dimen.app_bar_height) /* top */,
|
||||
0 /* right */,
|
||||
0 /* bottom */);
|
||||
} else {
|
||||
mManageApplications.mSpinnerHeader.setVisibility(View.GONE);
|
||||
mManageApplications.mContentContainer.setPadding(0 /* left */, 0 /* top */,
|
||||
0 /* right */,
|
||||
0 /* bottom */);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class ApplicationsAdapter extends RecyclerView.Adapter<ApplicationViewHolder>
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.backup;
|
||||
|
||||
import android.app.backup.BackupManager;
|
||||
import android.content.Context;
|
||||
import android.os.UserManager;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
public class BackupSettingsActivityPreferenceController extends BasePreferenceController {
|
||||
private static final String TAG = "BackupSettingActivityPC";
|
||||
|
||||
|
||||
private final UserManager mUm;
|
||||
private final BackupManager mBackupManager;
|
||||
|
||||
public BackupSettingsActivityPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||
mBackupManager = new BackupManager(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return mUm.isAdminUser()
|
||||
? AVAILABLE_UNSEARCHABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
final boolean backupEnabled = mBackupManager.isBackupEnabled();
|
||||
|
||||
return backupEnabled
|
||||
? mContext.getText(R.string.backup_summary_state_on)
|
||||
: mContext.getText(R.string.backup_summary_state_off);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* 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.backup;
|
||||
|
||||
import android.content.ContentProvider;
|
||||
import android.content.ContentValues;
|
||||
import android.content.UriMatcher;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
|
||||
|
||||
/** Provider stores and manages user interaction feedback for homepage contextual cards. */
|
||||
public class BackupSettingsContentProvider extends ContentProvider {
|
||||
private static final String AUTHORITY =
|
||||
"com.android.settings.backup.BackupSettingsContentProvider";
|
||||
private static final String SUMMARY = "summary";
|
||||
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
|
||||
static {
|
||||
URI_MATCHER.addURI(AUTHORITY, SUMMARY, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bundle call(String method, String uri, Bundle extras) {
|
||||
if (!SUMMARY.equals(method)) {
|
||||
return null;
|
||||
}
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(META_DATA_PREFERENCE_SUMMARY,
|
||||
new BackupSettingsHelper(getContext()).getSummary());
|
||||
return bundle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType(Uri uri) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Uri insert(Uri uri, ContentValues values) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int delete(Uri uri, String selection, String[] selectionArgs) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,7 @@ public class BackupSettingsFragment extends DashboardFragment {
|
||||
return controllers;
|
||||
}
|
||||
|
||||
// The intention is to index {@link BackupSettingsActivity} instead of the fragments,
|
||||
// The intention is to index {@link UserBackupSettingsActivity} instead of the fragments,
|
||||
// therefore leaving this index provider empty.
|
||||
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider() {
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.content.Intent;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -34,7 +35,7 @@ import com.android.settings.Settings.PrivacySettingsActivity;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
/**
|
||||
* Helper class for {@link BackupSettingsActivity} that interacts with {@link IBackupManager}.
|
||||
* Helper class for {@link UserBackupSettingsActivity} that interacts with {@link IBackupManager}.
|
||||
*/
|
||||
public class BackupSettingsHelper {
|
||||
private static final String TAG = "BackupSettingsHelper";
|
||||
@@ -48,6 +49,24 @@ public class BackupSettingsHelper {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* If there is only one profile, show whether the backup is on or off.
|
||||
* Otherwise, show nothing.
|
||||
*/
|
||||
String getSummary() {
|
||||
UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
|
||||
if (userManager.getUserProfiles().size() == 1) {
|
||||
try {
|
||||
int resId = mBackupManager.isBackupEnabled() ? R.string.backup_summary_state_on
|
||||
: R.string.backup_summary_state_off;
|
||||
return mContext.getText(resId).toString();
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Error getting isBackupEnabled", e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an intent to launch backup settings from backup transport if the intent was provided
|
||||
* by the transport. Otherwise returns the intent to launch the default backup settings screen.
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -40,9 +39,14 @@ import java.util.List;
|
||||
/**
|
||||
* The activity used to launch the configured Backup activity or the preference screen
|
||||
* if the manufacturer provided their backup settings.
|
||||
* Pre-Q, BackupSettingsActivity was disabled for non-system users. Therefore, for phones which
|
||||
* upgrade to Q, BackupSettingsActivity is disabled for those users. However, we cannot simply
|
||||
* enable it in Q since component enable can only be done by the user itself; which is not
|
||||
* enough in Q we want it to be enabled for all profile users of the user.
|
||||
* Therefore, as a simple workaround, we use a new class which is enabled by default.
|
||||
*/
|
||||
@SearchIndexable
|
||||
public class BackupSettingsActivity extends FragmentActivity implements Indexable {
|
||||
public class UserBackupSettingsActivity extends FragmentActivity implements Indexable {
|
||||
private static final String TAG = "BackupSettingsActivity";
|
||||
private FragmentManager mFragmentManager;
|
||||
|
||||
@@ -108,29 +112,13 @@ public class BackupSettingsActivity extends FragmentActivity implements Indexabl
|
||||
data.screenTitle = context.getString(R.string.settings_label);
|
||||
data.keywords = context.getString(R.string.keywords_backup);
|
||||
data.intentTargetPackage = context.getPackageName();
|
||||
data.intentTargetClass = BackupSettingsActivity.class.getName();
|
||||
data.intentTargetClass = com.android.settings.backup.UserBackupSettingsActivity.class.getName();
|
||||
data.intentAction = Intent.ACTION_MAIN;
|
||||
data.key = BACKUP_SEARCH_INDEX_KEY;
|
||||
result.add(data);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getNonIndexableKeys(Context context) {
|
||||
final List<String> keys = super.getNonIndexableKeys(context);
|
||||
|
||||
// For non-primary user, no backup is available, so don't show it in search
|
||||
// TODO: http://b/22388012
|
||||
if (UserHandle.myUserId() != UserHandle.USER_SYSTEM) {
|
||||
if (Log.isLoggable(TAG, Log.DEBUG)) {
|
||||
Log.d(TAG, "Not a system user, not indexing the screen");
|
||||
}
|
||||
keys.add(BACKUP_SEARCH_INDEX_KEY);
|
||||
}
|
||||
|
||||
return keys;
|
||||
}
|
||||
};
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.biometrics;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
@@ -33,8 +35,6 @@ import com.android.settings.core.InstrumentedActivity;
|
||||
*/
|
||||
public class BiometricEnrollActivity extends InstrumentedActivity {
|
||||
|
||||
private static final String SETTINGS_PACKAGE = "com.android.settings";
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@@ -44,9 +44,10 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
|
||||
|
||||
// This logic may have to be modified on devices with multiple biometrics.
|
||||
if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
|
||||
intent.setClassName(SETTINGS_PACKAGE, FingerprintEnrollIntroduction.class.getName());
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME,
|
||||
FingerprintEnrollIntroduction.class.getName());
|
||||
} else if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) {
|
||||
intent.setClassName(SETTINGS_PACKAGE, FaceEnrollIntroduction.class.getName());
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME, FaceEnrollIntroduction.class.getName());
|
||||
}
|
||||
|
||||
startActivity(intent);
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.biometrics;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
@@ -148,7 +150,7 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
|
||||
|
||||
protected Intent getFingerprintEnrollingIntent() {
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.android.settings", FingerprintEnrollEnrolling.class.getName());
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME, FingerprintEnrollEnrolling.class.getName());
|
||||
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
|
||||
if (mUserId != UserHandle.USER_NULL) {
|
||||
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.biometrics;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.UserHandle;
|
||||
@@ -114,7 +116,7 @@ public abstract class BiometricStatusPreferenceController extends BasePreference
|
||||
return false;
|
||||
}
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.android.settings", clazz);
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME, clazz);
|
||||
intent.putExtra(Intent.EXTRA_USER_ID, userId);
|
||||
context.startActivity(intent);
|
||||
return true;
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
package com.android.settings.biometrics.fingerprint;
|
||||
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
@@ -460,7 +462,7 @@ public class FingerprintSettings extends SubSettings {
|
||||
final String key = pref.getKey();
|
||||
if (KEY_FINGERPRINT_ADD.equals(key)) {
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.android.settings",
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME,
|
||||
FingerprintEnrollEnrolling.class.getName());
|
||||
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
|
||||
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
|
||||
@@ -613,7 +615,7 @@ public class FingerprintSettings extends SubSettings {
|
||||
if (!helper.launchConfirmationActivity(CONFIRM_REQUEST,
|
||||
getString(R.string.security_settings_fingerprint_preference_title),
|
||||
null, null, challenge, mUserId)) {
|
||||
intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName());
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME, ChooseLockGeneric.class.getName());
|
||||
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
|
||||
DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
|
||||
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS,
|
||||
|
||||
@@ -49,6 +49,7 @@ import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminSe
|
||||
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails;
|
||||
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings;
|
||||
import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings;
|
||||
import com.android.settings.backup.UserBackupSettingsActivity;
|
||||
import com.android.settings.backup.PrivacySettings;
|
||||
import com.android.settings.backup.ToggleBackupSettingFragment;
|
||||
import com.android.settings.biometrics.face.FaceSettings;
|
||||
@@ -298,5 +299,6 @@ public class SettingsGateway {
|
||||
Settings.DateTimeSettingsActivity.class.getName(),
|
||||
Settings.EnterprisePrivacySettingsActivity.class.getName(),
|
||||
Settings.MyDeviceInfoActivity.class.getName(),
|
||||
UserBackupSettingsActivity.class.getName(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -69,6 +69,7 @@ public class TimeZoneSettings extends DashboardFragment {
|
||||
private Locale mLocale;
|
||||
private boolean mSelectByRegion;
|
||||
private TimeZoneData mTimeZoneData;
|
||||
private Intent mPendingZonePickerRequestResult;
|
||||
|
||||
private String mSelectedTimeZoneId;
|
||||
private TimeZoneInfo.Formatter mTimeZoneInfoFormatter;
|
||||
@@ -136,12 +137,10 @@ public class TimeZoneSettings extends DashboardFragment {
|
||||
switch (requestCode) {
|
||||
case REQUEST_CODE_REGION_PICKER:
|
||||
case REQUEST_CODE_ZONE_PICKER: {
|
||||
String regionId = data.getStringExtra(RegionSearchPicker.EXTRA_RESULT_REGION_ID);
|
||||
String tzId = data.getStringExtra(RegionZonePicker.EXTRA_RESULT_TIME_ZONE_ID);
|
||||
// Ignore the result if user didn't change the region or time zone.
|
||||
if (!Objects.equals(regionId, use(RegionPreferenceController.class).getRegionId())
|
||||
|| !Objects.equals(tzId, mSelectedTimeZoneId)) {
|
||||
onRegionZoneChanged(regionId, tzId);
|
||||
if (mTimeZoneData == null) {
|
||||
mPendingZonePickerRequestResult = data;
|
||||
} else {
|
||||
onZonePickerRequestResult(mTimeZoneData, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -166,8 +165,11 @@ public class TimeZoneSettings extends DashboardFragment {
|
||||
mTimeZoneData = timeZoneData;
|
||||
setupForCurrentTimeZone();
|
||||
getActivity().invalidateOptionsMenu();
|
||||
if (mPendingZonePickerRequestResult != null) {
|
||||
onZonePickerRequestResult(timeZoneData, mPendingZonePickerRequestResult);
|
||||
mPendingZonePickerRequestResult = null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void startRegionPicker() {
|
||||
@@ -226,9 +228,17 @@ public class TimeZoneSettings extends DashboardFragment {
|
||||
updatePreferenceStates();
|
||||
}
|
||||
|
||||
private void onRegionZoneChanged(String regionId, String tzId) {
|
||||
private void onZonePickerRequestResult(TimeZoneData timeZoneData, Intent data) {
|
||||
String regionId = data.getStringExtra(RegionSearchPicker.EXTRA_RESULT_REGION_ID);
|
||||
String tzId = data.getStringExtra(RegionZonePicker.EXTRA_RESULT_TIME_ZONE_ID);
|
||||
// Ignore the result if user didn't change the region or time zone.
|
||||
if (Objects.equals(regionId, use(RegionPreferenceController.class).getRegionId())
|
||||
&& Objects.equals(tzId, mSelectedTimeZoneId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
FilteredCountryTimeZones countryTimeZones =
|
||||
mTimeZoneData.lookupCountryTimeZones(regionId);
|
||||
timeZoneData.lookupCountryTimeZones(regionId);
|
||||
if (countryTimeZones == null || !countryTimeZones.getTimeZoneIds().contains(tzId)) {
|
||||
Log.e(TAG, "Unknown time zone id is selected: " + tzId);
|
||||
return;
|
||||
|
||||
@@ -429,7 +429,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
|
||||
controllers.add(new CameraLaserSensorPreferenceController(context));
|
||||
controllers.add(new WifiDisplayCertificationPreferenceController(context));
|
||||
controllers.add(new WifiVerboseLoggingPreferenceController(context));
|
||||
controllers.add(new WifiConnectedMacRandomizationPreferenceController(context));
|
||||
controllers.add(new MobileDataAlwaysOnPreferenceController(context));
|
||||
controllers.add(new TetheringHardwareAccelPreferenceController(context));
|
||||
controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
|
||||
|
||||
@@ -19,10 +19,9 @@ package com.android.settings.development;
|
||||
import android.content.Context;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.storage.IStorageManager;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import android.sysprop.CryptoProperties;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
@@ -36,9 +35,6 @@ public class FileEncryptionPreferenceController extends DeveloperOptionsPreferen
|
||||
private static final String KEY_CONVERT_FBE = "convert_to_file_encryption";
|
||||
private static final String KEY_STORAGE_MANAGER = "mount";
|
||||
|
||||
@VisibleForTesting
|
||||
static final String FILE_ENCRYPTION_PROPERTY_KEY = "ro.crypto.type";
|
||||
|
||||
private final IStorageManager mStorageManager;
|
||||
|
||||
public FileEncryptionPreferenceController(Context context) {
|
||||
@@ -67,8 +63,7 @@ public class FileEncryptionPreferenceController extends DeveloperOptionsPreferen
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
if (!TextUtils.equals("file",
|
||||
SystemProperties.get(FILE_ENCRYPTION_PROPERTY_KEY, "none" /* default */))) {
|
||||
if (!TextUtils.equals("file", CryptoProperties.type().orElse("none"))) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.development;
|
||||
|
||||
import android.content.Context;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
|
||||
|
||||
public class WifiConnectedMacRandomizationPreferenceController extends
|
||||
DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
|
||||
PreferenceControllerMixin {
|
||||
|
||||
private static final String WIFI_CONNECTED_MAC_RANDOMIZATION_KEY =
|
||||
"wifi_connected_mac_randomization";
|
||||
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_ON = 1;
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_OFF = 0;
|
||||
|
||||
public WifiConnectedMacRandomizationPreferenceController(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return mContext.getResources().getBoolean(
|
||||
R.bool.config_wifi_support_connected_mac_randomization);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return WIFI_CONNECTED_MAC_RANDOMIZATION_KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
final boolean isEnabled = (Boolean) newValue;
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
|
||||
isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
final int enableMode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, SETTING_VALUE_OFF);
|
||||
((SwitchPreference) mPreference).setChecked(enableMode != SETTING_VALUE_OFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDeveloperOptionsSwitchDisabled() {
|
||||
super.onDeveloperOptionsSwitchDisabled();
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, SETTING_VALUE_OFF);
|
||||
((SwitchPreference) mPreference).setChecked(false);
|
||||
}
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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.fuelgauge;
|
||||
|
||||
import android.os.BatteryStats.HistoryItem;
|
||||
import android.telephony.ServiceState;
|
||||
import android.util.SparseIntArray;
|
||||
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.fuelgauge.BatteryActiveView.BatteryActiveProvider;
|
||||
|
||||
public class BatteryCellParser implements BatteryInfo.BatteryDataParser, BatteryActiveProvider {
|
||||
|
||||
private final SparseIntArray mData = new SparseIntArray();
|
||||
|
||||
private int mLastValue;
|
||||
private long mLength;
|
||||
private long mLastTime;
|
||||
|
||||
protected int getValue(HistoryItem rec) {
|
||||
int bin;
|
||||
if (((rec.states & HistoryItem.STATE_PHONE_STATE_MASK)
|
||||
>> HistoryItem.STATE_PHONE_STATE_SHIFT)
|
||||
== ServiceState.STATE_POWER_OFF) {
|
||||
bin = 0;
|
||||
} else if ((rec.states & HistoryItem.STATE_PHONE_SCANNING_FLAG) != 0) {
|
||||
bin = 1;
|
||||
} else {
|
||||
bin = (rec.states & HistoryItem.STATE_PHONE_SIGNAL_STRENGTH_MASK)
|
||||
>> HistoryItem.STATE_PHONE_SIGNAL_STRENGTH_SHIFT;
|
||||
bin += 2;
|
||||
}
|
||||
return bin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParsingStarted(long startTime, long endTime) {
|
||||
mLength = endTime - startTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataPoint(long time, HistoryItem record) {
|
||||
int value = getValue(record);
|
||||
if (value != mLastValue) {
|
||||
mData.put((int) time, value);
|
||||
mLastValue = value;
|
||||
}
|
||||
mLastTime = time;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataGap() {
|
||||
if (mLastValue != 0) {
|
||||
mData.put((int) mLastTime, 0);
|
||||
mLastValue = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParsingDone() {
|
||||
if (mLastValue != 0) {
|
||||
mData.put((int) mLastTime, 0);
|
||||
mLastValue = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getPeriod() {
|
||||
return mLength;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasData() {
|
||||
return mData.size() > 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SparseIntArray getColorArray() {
|
||||
SparseIntArray ret = new SparseIntArray();
|
||||
for (int i = 0; i < mData.size(); i++) {
|
||||
ret.put(mData.keyAt(i), getColor(mData.valueAt(i)));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private int getColor(int i) {
|
||||
return Utils.BADNESS_COLORS[i];
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batterytip.detectors;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.BatteryStats;
|
||||
import android.text.format.DateUtils;
|
||||
@@ -91,7 +93,7 @@ public class HighUsageDetector implements BatteryTipDetector {
|
||||
// When in test mode, add an app if necessary
|
||||
if (mPolicy.testHighUsageTip && mHighUsageAppList.isEmpty()) {
|
||||
mHighUsageAppList.add(new AppInfo.Builder()
|
||||
.setPackageName("com.android.settings")
|
||||
.setPackageName(SETTINGS_PACKAGE_NAME)
|
||||
.setScreenOnTimeMs(TimeUnit.HOURS.toMillis(3))
|
||||
.build());
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batterytip.detectors;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -87,7 +89,7 @@ public class RestrictAppDetector implements BatteryTipDetector {
|
||||
private BatteryTip getFakeData() {
|
||||
final List<AppInfo> highUsageApps = new ArrayList<>();
|
||||
highUsageApps.add(new AppInfo.Builder()
|
||||
.setPackageName("com.android.settings")
|
||||
.setPackageName(SETTINGS_PACKAGE_NAME)
|
||||
.build());
|
||||
return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.settings.homepage;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.FeatureFlagUtils;
|
||||
@@ -55,7 +56,7 @@ public class SettingsHomepageActivity extends SettingsBaseActivity {
|
||||
|
||||
final Toolbar toolbar = findViewById(R.id.search_action_bar);
|
||||
FeatureFactory.getFactory(this).getSearchFeatureProvider()
|
||||
.initSearchToolbar(this /* activity */, toolbar);
|
||||
.initSearchToolbar(this /* activity */, toolbar, SettingsEnums.SETTINGS_HOMEPAGE);
|
||||
|
||||
final ImageView avatarView = findViewById(R.id.account_avatar);
|
||||
final AvatarViewMixin avatarViewMixin = new AvatarViewMixin(this, avatarView);
|
||||
|
||||
@@ -53,7 +53,7 @@ public class AndroidBeamEnabler extends BaseNfcEnabler {
|
||||
switch (newState) {
|
||||
case NfcAdapter.STATE_OFF:
|
||||
mPreference.setEnabled(false);
|
||||
mPreference.setSummary(R.string.android_beam_disabled_summary);
|
||||
mPreference.setSummary(R.string.nfc_disabled_summary);
|
||||
break;
|
||||
case NfcAdapter.STATE_ON:
|
||||
if (mBeamDisallowedBySystem) {
|
||||
|
||||
60
src/com/android/settings/nfc/SecureNfcEnabler.java
Normal file
60
src/com/android/settings/nfc/SecureNfcEnabler.java
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* 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.nfc;
|
||||
|
||||
import android.content.Context;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
/**
|
||||
* SecureNfcEnabler is a helper to manage the Secure Nfc on/off checkbox preference
|
||||
* It turns on/off Secure NFC and ensures the summary of the preference reflects
|
||||
* the current state.
|
||||
*/
|
||||
public class SecureNfcEnabler extends BaseNfcEnabler {
|
||||
private final SwitchPreference mPreference;
|
||||
|
||||
public SecureNfcEnabler(Context context, SwitchPreference preference) {
|
||||
super(context);
|
||||
mPreference = preference;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleNfcStateChanged(int newState) {
|
||||
switch (newState) {
|
||||
case NfcAdapter.STATE_OFF:
|
||||
mPreference.setSummary(R.string.nfc_disabled_summary);
|
||||
mPreference.setEnabled(false);
|
||||
break;
|
||||
case NfcAdapter.STATE_ON:
|
||||
mPreference.setChecked(mPreference.isEnabled());
|
||||
mPreference.setEnabled(true);
|
||||
break;
|
||||
case NfcAdapter.STATE_TURNING_ON:
|
||||
mPreference.setEnabled(false);
|
||||
break;
|
||||
case NfcAdapter.STATE_TURNING_OFF:
|
||||
mPreference.setEnabled(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* 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.nfc;
|
||||
|
||||
import android.content.Context;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.os.SystemProperties;
|
||||
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.core.TogglePreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
||||
|
||||
public class SecureNfcPreferenceController extends TogglePreferenceController
|
||||
implements LifecycleObserver, OnResume, OnPause {
|
||||
|
||||
public static final String KEY_TOGGLE_NFC = "nfc_secure_setting";
|
||||
private final NfcAdapter mNfcAdapter;
|
||||
private SecureNfcEnabler mSecureNfcEnabler;
|
||||
|
||||
public SecureNfcPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
if (!isAvailable()) {
|
||||
mSecureNfcEnabler = null;
|
||||
return;
|
||||
}
|
||||
|
||||
final SwitchPreference switchPreference =
|
||||
(SwitchPreference) screen.findPreference(getPreferenceKey());
|
||||
|
||||
mSecureNfcEnabler = new SecureNfcEnabler(mContext, switchPreference);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mNfcAdapter.isNfcSecureEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setChecked(boolean isChecked) {
|
||||
return mNfcAdapter.setNfcSecure(isChecked);
|
||||
}
|
||||
|
||||
@Override
|
||||
@AvailabilityStatus
|
||||
public int getAvailabilityStatus() {
|
||||
if (mNfcAdapter == null) {
|
||||
return UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
return mNfcAdapter.deviceSupportsNfcSecure() ? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasAsyncUpdate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSliceable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
if (mSecureNfcEnabler != null) {
|
||||
mSecureNfcEnabler.resume();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
if (mSecureNfcEnabler != null) {
|
||||
mSecureNfcEnabler.pause();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -300,6 +300,23 @@ public class NotificationBackend {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean shouldHideSilentStatusBarIcons(Context context) {
|
||||
try {
|
||||
return sINM.shouldHideSilentStatusIcons(context.getPackageName());
|
||||
} catch (Exception e) {
|
||||
Log.w(TAG, "Error calling NoMan", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void setHideSilentStatusIcons(boolean hide) {
|
||||
try {
|
||||
sINM.setHideSilentStatusIcons(hide);
|
||||
} catch (Exception e) {
|
||||
Log.w(TAG, "Error calling NoMan", e);
|
||||
}
|
||||
}
|
||||
|
||||
protected void recordAggregatedUsageEvents(Context context, AppRow appRow) {
|
||||
long now = System.currentTimeMillis();
|
||||
long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Default reviewers for this and subdirectories.
|
||||
asc@google.com
|
||||
dsandler@google.com
|
||||
dsandler@android.com
|
||||
juliacr@google.com
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 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.notification;
|
||||
|
||||
import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.settings.core.TogglePreferenceController;
|
||||
|
||||
public class SilentStatusBarPreferenceController extends TogglePreferenceController {
|
||||
|
||||
private static final String KEY = "hide_silent_icons";
|
||||
private static final int MY_USER_ID = UserHandle.myUserId();
|
||||
private final NotificationBackend mBackend;
|
||||
|
||||
public SilentStatusBarPreferenceController(Context context) {
|
||||
super(context, KEY);
|
||||
mBackend = new NotificationBackend();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mBackend.shouldHideSilentStatusBarIcons(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setChecked(boolean isChecked) {
|
||||
mBackend.setHideSilentStatusIcons(isChecked);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return Settings.Secure.getInt(
|
||||
mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1) != 0
|
||||
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -125,7 +125,8 @@ public class BiometricFragment extends InstrumentedFragment {
|
||||
.setUseDefaultTitle() // use default title if title is null/empty
|
||||
.setSubtitle(mBundle.getString(BiometricPrompt.KEY_SUBTITLE))
|
||||
.setDescription(mBundle.getString(BiometricPrompt.KEY_DESCRIPTION))
|
||||
.setRequireConfirmation(mBundle.getBoolean(BiometricPrompt.KEY_REQUIRE_CONFIRMATION))
|
||||
.setRequireConfirmation(
|
||||
mBundle.getBoolean(BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true))
|
||||
.setNegativeButton(getResources().getString(
|
||||
R.string.confirm_device_credential_use_alternate_method),
|
||||
mClientExecutor, mNegativeButtonListener)
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.password;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.Activity;
|
||||
import android.app.KeyguardManager;
|
||||
@@ -408,7 +410,7 @@ public final class ChooseLockSettingsHelper {
|
||||
if (extras != null) {
|
||||
intent.putExtras(extras);
|
||||
}
|
||||
intent.setClassName(ConfirmDeviceCredentialBaseFragment.PACKAGE, activityClass.getName());
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME, activityClass.getName());
|
||||
if (external) {
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
|
||||
if (mFragment != null) {
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
package com.android.settings.password;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.KeyguardManager;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
@@ -62,7 +64,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
|
||||
public static Intent createIntent(CharSequence title, CharSequence details) {
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.android.settings",
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME,
|
||||
ConfirmDeviceCredentialActivity.class.getName());
|
||||
intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
|
||||
intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
|
||||
@@ -71,7 +73,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
|
||||
public static Intent createIntent(CharSequence title, CharSequence details, long challenge) {
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.android.settings",
|
||||
intent.setClassName(SETTINGS_PACKAGE_NAME,
|
||||
ConfirmDeviceCredentialActivity.class.getName());
|
||||
intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
|
||||
intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
// TODO (b/35202196): move this class out of the root of the package.
|
||||
package com.android.settings.password;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.Dialog;
|
||||
import android.app.KeyguardManager;
|
||||
@@ -55,17 +57,16 @@ import com.android.settings.core.InstrumentedFragment;
|
||||
*/
|
||||
public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFragment {
|
||||
|
||||
public static final String PACKAGE = "com.android.settings";
|
||||
public static final String TITLE_TEXT = PACKAGE + ".ConfirmCredentials.title";
|
||||
public static final String HEADER_TEXT = PACKAGE + ".ConfirmCredentials.header";
|
||||
public static final String DETAILS_TEXT = PACKAGE + ".ConfirmCredentials.details";
|
||||
public static final String DARK_THEME = PACKAGE + ".ConfirmCredentials.darkTheme";
|
||||
public static final String TITLE_TEXT = SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.title";
|
||||
public static final String HEADER_TEXT = SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.header";
|
||||
public static final String DETAILS_TEXT = SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.details";
|
||||
public static final String DARK_THEME = SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.darkTheme";
|
||||
public static final String SHOW_CANCEL_BUTTON =
|
||||
PACKAGE + ".ConfirmCredentials.showCancelButton";
|
||||
SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.showCancelButton";
|
||||
public static final String SHOW_WHEN_LOCKED =
|
||||
PACKAGE + ".ConfirmCredentials.showWhenLocked";
|
||||
SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.showWhenLocked";
|
||||
public static final String USE_FADE_ANIMATION =
|
||||
PACKAGE + ".ConfirmCredentials.useFadeAnimation";
|
||||
SETTINGS_PACKAGE_NAME + ".ConfirmCredentials.useFadeAnimation";
|
||||
|
||||
protected static final int USER_TYPE_PRIMARY = 1;
|
||||
protected static final int USER_TYPE_MANAGED_PROFILE = 2;
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.password;
|
||||
|
||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.IActivityManager;
|
||||
@@ -32,8 +34,6 @@ public final class PasswordUtils extends com.android.settingslib.Utils {
|
||||
|
||||
private static final String TAG = "Settings";
|
||||
|
||||
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
|
||||
|
||||
/**
|
||||
* Returns whether the uid which the activity with {@code activityToken} is launched from has
|
||||
* been granted the {@code permission}.
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.provider.Settings;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toolbar;
|
||||
@@ -40,7 +39,6 @@ import com.android.settingslib.search.SearchIndexableResources;
|
||||
*/
|
||||
public interface SearchFeatureProvider {
|
||||
|
||||
Intent SEARCH_UI_INTENT = new Intent(Settings.ACTION_APP_SEARCH_SETTINGS);
|
||||
int REQUEST_CODE = 0;
|
||||
|
||||
/**
|
||||
@@ -64,7 +62,7 @@ public interface SearchFeatureProvider {
|
||||
/**
|
||||
* Initializes the search toolbar.
|
||||
*/
|
||||
default void initSearchToolbar(Activity activity, Toolbar toolbar) {
|
||||
default void initSearchToolbar(Activity activity, Toolbar toolbar, int pageId) {
|
||||
if (activity == null || toolbar == null) {
|
||||
return;
|
||||
}
|
||||
@@ -87,9 +85,8 @@ public interface SearchFeatureProvider {
|
||||
navView.setBackground(null);
|
||||
|
||||
toolbar.setOnClickListener(tb -> {
|
||||
final Intent intent = SEARCH_UI_INTENT;
|
||||
intent.setPackage(getSettingsIntelligencePkgName(activity));
|
||||
final Context context = activity.getApplicationContext();
|
||||
final Intent intent = buildSearchIntent(context, pageId);
|
||||
|
||||
if (activity.getPackageManager().queryIntentActivities(intent,
|
||||
PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
|
||||
@@ -97,10 +94,12 @@ public interface SearchFeatureProvider {
|
||||
}
|
||||
|
||||
FeatureFactory.getFactory(context).getSlicesFeatureProvider()
|
||||
.indexSliceDataAsync(activity.getApplicationContext());
|
||||
.indexSliceDataAsync(context);
|
||||
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
|
||||
.action(context, SettingsEnums.ACTION_SEARCH_RESULTS);
|
||||
activity.startActivityForResult(intent, REQUEST_CODE);
|
||||
});
|
||||
}
|
||||
|
||||
Intent buildSearchIntent(Context context, int pageId);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,9 @@ package com.android.settings.search;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.android.settingslib.search.SearchIndexableResources;
|
||||
@@ -59,7 +62,22 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
|
||||
return mSearchIndexableResources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent buildSearchIntent(Context context, int pageId) {
|
||||
return new Intent(Settings.ACTION_APP_SEARCH_SETTINGS)
|
||||
.setPackage(getSettingsIntelligencePkgName(context))
|
||||
.putExtra(Intent.EXTRA_REFERRER, buildReferrer(context, pageId));
|
||||
}
|
||||
|
||||
protected boolean isSignatureWhitelisted(Context context, String callerPackage) {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static Uri buildReferrer(Context context, int pageId) {
|
||||
return new Uri.Builder()
|
||||
.scheme("android-app")
|
||||
.authority(context.getPackageName())
|
||||
.path(String.valueOf(pageId))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,11 +30,10 @@ import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.InstrumentedFragment;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.search.SearchFeatureProvider;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.ObservableFragment;
|
||||
import com.android.settingslib.core.lifecycle.ObservablePreferenceFragment;
|
||||
import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
|
||||
|
||||
public class SearchMenuController implements LifecycleObserver, OnCreateOptionsMenu {
|
||||
@@ -42,17 +41,21 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM
|
||||
public static final String NEED_SEARCH_ICON_IN_ACTION_BAR = "need_search_icon_in_action_bar";
|
||||
|
||||
private final Fragment mHost;
|
||||
private final int mPageId;
|
||||
|
||||
public static void init(@NonNull ObservablePreferenceFragment host) {
|
||||
host.getSettingsLifecycle().addObserver(new SearchMenuController(host));
|
||||
public static void init(@NonNull InstrumentedPreferenceFragment host) {
|
||||
host.getSettingsLifecycle().addObserver(
|
||||
new SearchMenuController(host, host.getMetricsCategory()));
|
||||
}
|
||||
|
||||
public static void init(@NonNull ObservableFragment host) {
|
||||
host.getSettingsLifecycle().addObserver(new SearchMenuController(host));
|
||||
public static void init(@NonNull InstrumentedFragment host) {
|
||||
host.getSettingsLifecycle().addObserver(
|
||||
new SearchMenuController(host, host.getMetricsCategory()));
|
||||
}
|
||||
|
||||
private SearchMenuController(@NonNull Fragment host) {
|
||||
private SearchMenuController(@NonNull Fragment host, int pageId) {
|
||||
mHost = host;
|
||||
mPageId = pageId;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -79,8 +82,9 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM
|
||||
searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||
|
||||
searchItem.setOnMenuItemClickListener(target -> {
|
||||
final Intent intent = SearchFeatureProvider.SEARCH_UI_INTENT;
|
||||
intent.setPackage(SettingsIntelligencePkgName);
|
||||
final Intent intent = FeatureFactory.getFactory(context)
|
||||
.getSearchFeatureProvider()
|
||||
.buildSearchIntent(context, mPageId);
|
||||
|
||||
if (context.getPackageManager().queryIntentActivities(intent,
|
||||
PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.widget;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
|
||||
/**
|
||||
* A controller that adds shadow to actionbar when content view scrolls.
|
||||
* <p/>
|
||||
* It also works on custom views acting as an actionbar.
|
||||
*/
|
||||
public class ActionBarShadowController implements LifecycleObserver, OnStart, OnStop {
|
||||
|
||||
@VisibleForTesting
|
||||
static final float ELEVATION_HIGH = 8;
|
||||
@VisibleForTesting
|
||||
static final float ELEVATION_LOW = 0;
|
||||
|
||||
@VisibleForTesting
|
||||
ScrollChangeWatcher mScrollChangeWatcher;
|
||||
private RecyclerView mRecyclerView;
|
||||
private boolean isScrollWatcherAttached;
|
||||
|
||||
public static ActionBarShadowController attachToRecyclerView(Activity activity,
|
||||
Lifecycle lifecycle, RecyclerView recyclerView) {
|
||||
return new ActionBarShadowController(activity, lifecycle, recyclerView);
|
||||
}
|
||||
|
||||
public static ActionBarShadowController attachToRecyclerView(View anchorView,
|
||||
Lifecycle lifecycle, RecyclerView recyclerView) {
|
||||
return new ActionBarShadowController(anchorView, lifecycle, recyclerView);
|
||||
}
|
||||
|
||||
private ActionBarShadowController(Activity activity, Lifecycle lifecycle,
|
||||
RecyclerView recyclerView) {
|
||||
mScrollChangeWatcher = new ScrollChangeWatcher(activity);
|
||||
mRecyclerView = recyclerView;
|
||||
attachScrollWatcher();
|
||||
lifecycle.addObserver(this);
|
||||
}
|
||||
|
||||
private ActionBarShadowController(View anchorView, Lifecycle lifecycle,
|
||||
RecyclerView recyclerView) {
|
||||
mScrollChangeWatcher = new ScrollChangeWatcher(anchorView);
|
||||
mRecyclerView = recyclerView;
|
||||
attachScrollWatcher();
|
||||
lifecycle.addObserver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
detachScrollWatcher();
|
||||
}
|
||||
|
||||
private void detachScrollWatcher() {
|
||||
mRecyclerView.removeOnScrollListener(mScrollChangeWatcher);
|
||||
isScrollWatcherAttached = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
attachScrollWatcher();
|
||||
}
|
||||
|
||||
private void attachScrollWatcher() {
|
||||
if (!isScrollWatcherAttached) {
|
||||
isScrollWatcherAttached = true;
|
||||
mRecyclerView.addOnScrollListener(mScrollChangeWatcher);
|
||||
mScrollChangeWatcher.updateDropShadow(mRecyclerView);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the drop shadow as the scrollable entity is scrolled.
|
||||
*/
|
||||
final class ScrollChangeWatcher extends RecyclerView.OnScrollListener {
|
||||
|
||||
private final Activity mActivity;
|
||||
private final View mAnchorView;
|
||||
|
||||
public ScrollChangeWatcher(Activity activity) {
|
||||
mActivity = activity;
|
||||
mAnchorView = null;
|
||||
}
|
||||
|
||||
public ScrollChangeWatcher(View anchorView) {
|
||||
mAnchorView = anchorView;
|
||||
mActivity = null;
|
||||
}
|
||||
|
||||
// RecyclerView scrolled.
|
||||
@Override
|
||||
public void onScrolled(RecyclerView view, int dx, int dy) {
|
||||
updateDropShadow(view);
|
||||
}
|
||||
|
||||
public void updateDropShadow(View view) {
|
||||
final boolean shouldShowShadow = view.canScrollVertically(-1);
|
||||
if (mAnchorView != null) {
|
||||
mAnchorView.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
|
||||
} else if (mActivity != null) { // activity can become null when running monkey
|
||||
final ActionBar actionBar = mActivity.getActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -49,6 +49,7 @@ import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.widget.ActionBarShadowController;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
|
||||
@@ -359,8 +359,16 @@ public class WifiConfigController implements TextWatcher,
|
||||
if (config != null && config.isPasspoint()) {
|
||||
providerFriendlyName = config.providerFriendlyName;
|
||||
}
|
||||
String suggestionOrSpecifierPackageName = null;
|
||||
if (config != null
|
||||
&& (config.fromWifiNetworkSpecifier
|
||||
|| config.fromWifiNetworkSuggestion)) {
|
||||
suggestionOrSpecifierPackageName = config.creatorName;
|
||||
}
|
||||
String summary = AccessPoint.getSummary(
|
||||
mConfigUi.getContext(), state, isEphemeral, providerFriendlyName);
|
||||
mConfigUi.getContext(), state, isEphemeral,
|
||||
suggestionOrSpecifierPackageName,
|
||||
providerFriendlyName);
|
||||
addRow(group, R.string.wifi_status, summary);
|
||||
}
|
||||
|
||||
|
||||
@@ -98,12 +98,11 @@ public class WifiInfoPreferenceController extends AbstractPreferenceController
|
||||
public void updateWifiInfo() {
|
||||
if (mWifiMacAddressPref != null) {
|
||||
final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
|
||||
final int macRandomizationMode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0);
|
||||
final boolean macRandomizationSupported = mContext.getResources().getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported);
|
||||
final String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
|
||||
|
||||
if (macRandomizationMode == 1
|
||||
&& WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
|
||||
if (macRandomizationSupported && WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
|
||||
mWifiMacAddressPref.setSummary(R.string.wifi_status_mac_randomized);
|
||||
} else if (TextUtils.isEmpty(macAddress)
|
||||
|| WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
|
||||
|
||||
@@ -299,7 +299,7 @@ public class WifiStatusTest extends Activity {
|
||||
WifiInfo info = mWifiManager.getConnectionInfo();
|
||||
String summary = AccessPoint.getSummary(this, info.getSSID(),
|
||||
networkInfo.getDetailedState(),
|
||||
info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID, null);
|
||||
info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID, null, null);
|
||||
mNetworkState.setText(summary);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
|
||||
@Override
|
||||
public void onConfiguratorSuccess(int code) {
|
||||
// Update success UI.
|
||||
mHeaderIcon.setImageResource(R.drawable.ic_check_circle_green);
|
||||
setHeaderIconImageResource(R.drawable.ic_devices_check_circle_green);
|
||||
mTitle.setText(R.string.wifi_dpp_wifi_shared_with_device);
|
||||
mSummary.setVisibility(View.INVISIBLE);
|
||||
mWifiApPictureView.setImageResource(R.drawable.wifi_dpp_success);
|
||||
@@ -63,7 +63,11 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
|
||||
mButtonLeft.setText(R.string.wifi_dpp_add_another_device);
|
||||
mButtonLeft.setOnClickListener(v -> getFragmentManager().popBackStack());
|
||||
mButtonRight.setText(R.string.done);
|
||||
mButtonRight.setOnClickListener(v -> getActivity().finish());
|
||||
mButtonRight.setOnClickListener(v -> {
|
||||
final Activity activity = getActivity();
|
||||
activity.setResult(Activity.RESULT_OK);
|
||||
activity.finish();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -110,7 +114,7 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
mHeaderIcon.setImageResource(R.drawable.ic_devices_other_opaque_black);
|
||||
setHeaderIconImageResource(R.drawable.ic_devices_other_opaque_black);
|
||||
|
||||
final WifiQrCode wifiQrCode = ((WifiDppConfiguratorActivity) getActivity())
|
||||
.getWifiDppQrCode();
|
||||
@@ -138,10 +142,7 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
|
||||
|
||||
mButtonLeft = view.findViewById(R.id.button_left);
|
||||
mButtonLeft.setText(R.string.cancel);
|
||||
mButtonLeft.setOnClickListener(v -> {
|
||||
getActivity().setResult(Activity.RESULT_CANCELED);
|
||||
getActivity().finish();
|
||||
});
|
||||
mButtonLeft.setOnClickListener(v -> getActivity().finish());
|
||||
|
||||
mButtonRight = view.findViewById(R.id.button_right);
|
||||
mButtonRight.setText(R.string.wifi_dpp_share_wifi);
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.settings.wifi.dpp;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
@@ -82,6 +81,8 @@ public class WifiDppChooseSavedWifiNetworkFragment extends WifiDppQrCodeBaseFrag
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
setHeaderIconImageResource(R.drawable.ic_wifi_signal_4);
|
||||
|
||||
mTitle.setText(R.string.wifi_dpp_choose_network);
|
||||
mSummary.setText(R.string.wifi_dpp_choose_network_to_connect_device);
|
||||
|
||||
@@ -98,9 +99,7 @@ public class WifiDppChooseSavedWifiNetworkFragment extends WifiDppQrCodeBaseFrag
|
||||
.ACTION_CONFIGURATOR_QR_CODE_GENERATOR.equals(action)) {
|
||||
getFragmentManager().popBackStack();
|
||||
} else {
|
||||
final Activity activity = getActivity();
|
||||
activity.setResult(Activity.RESULT_CANCELED);
|
||||
activity.finish();
|
||||
getActivity().finish();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.android.settings.wifi.dpp;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
@@ -160,7 +159,6 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
|
||||
}
|
||||
|
||||
if (cancelActivity) {
|
||||
setResult(Activity.RESULT_CANCELED);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
@@ -279,8 +277,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
|
||||
return mWifiDppQrCode;
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
protected boolean setWifiNetworkConfig(WifiNetworkConfig config) {
|
||||
@VisibleForTesting
|
||||
boolean setWifiNetworkConfig(WifiNetworkConfig config) {
|
||||
if(!WifiNetworkConfig.isValidConfig(config)) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -289,8 +287,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
protected boolean setWifiDppQrCode(WifiQrCode wifiQrCode) {
|
||||
@VisibleForTesting
|
||||
boolean setWifiDppQrCode(WifiQrCode wifiQrCode) {
|
||||
if (wifiQrCode == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -307,7 +305,6 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
|
||||
public boolean onNavigateUp() {
|
||||
Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container);
|
||||
if (fragment instanceof WifiDppQrCodeGeneratorFragment) {
|
||||
setResult(Activity.RESULT_CANCELED);
|
||||
finish();
|
||||
return true;
|
||||
} else if (fragment instanceof WifiDppQrCodeScannerFragment) {
|
||||
|
||||
@@ -117,7 +117,6 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
|
||||
break;
|
||||
default:
|
||||
Log.e(TAG, "Launch with an invalid action");
|
||||
setResult(Activity.RESULT_CANCELED);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
@@ -141,7 +140,6 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
|
||||
|
||||
@Override
|
||||
public boolean onNavigateUp(){
|
||||
setResult(Activity.RESULT_CANCELED);
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.InstrumentedFragment;
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,8 @@ import com.android.settings.core.InstrumentedFragment;
|
||||
* {@code WifiDppAddDeviceFragment}
|
||||
*/
|
||||
public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment {
|
||||
protected ImageView mHeaderIcon;
|
||||
private ImageView mHeaderIcon;
|
||||
private ImageView mDevicesCheckCircleGreenHeaderIcon;
|
||||
protected TextView mTitle;
|
||||
protected TextView mSummary;
|
||||
|
||||
@@ -42,7 +44,22 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
mHeaderIcon = view.findViewById(android.R.id.icon);
|
||||
mDevicesCheckCircleGreenHeaderIcon =
|
||||
view.findViewById(R.id.devices_check_circle_green_icon);
|
||||
mTitle = view.findViewById(android.R.id.title);
|
||||
mSummary = view.findViewById(android.R.id.summary);
|
||||
}
|
||||
|
||||
protected void setHeaderIconImageResource(int resId) {
|
||||
// ic_devices_check_circle_green is a LayerDrawable,
|
||||
// it has different size from other VectorDrawable icons
|
||||
if (resId == R.drawable.ic_devices_check_circle_green) {
|
||||
mHeaderIcon.setVisibility(View.GONE);
|
||||
mDevicesCheckCircleGreenHeaderIcon.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
mDevicesCheckCircleGreenHeaderIcon.setVisibility(View.GONE);
|
||||
mHeaderIcon.setImageResource(resId);
|
||||
mHeaderIcon.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +124,8 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
|
||||
|
||||
mQrCodeView = view.findViewById(R.id.qrcode_view);
|
||||
|
||||
mHeaderIcon.setImageResource(R.drawable.ic_qrcode_24dp);
|
||||
setHeaderIconImageResource(R.drawable.ic_qrcode_24dp);
|
||||
|
||||
final WifiNetworkConfig wifiNetworkConfig = getWifiNetworkConfigFromHostActivity();
|
||||
mTitle.setText(R.string.wifi_dpp_share_wifi);
|
||||
mSummary.setText(getString(R.string.wifi_dpp_scan_qr_code_with_another_device,
|
||||
|
||||
@@ -171,7 +171,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
|
||||
|
||||
mDecorateView = (QrDecorateView) view.findViewById(R.id.decorate_view);
|
||||
|
||||
mHeaderIcon.setImageResource(R.drawable.ic_scan_24dp);
|
||||
setHeaderIconImageResource(R.drawable.ic_scan_24dp);
|
||||
if (mIsConfiguratorMode) {
|
||||
mTitle.setText(R.string.wifi_dpp_add_device_to_network);
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ public class WifiDppUtils {
|
||||
case AccessPoint.SECURITY_WEP:
|
||||
return WifiQrCode.SECURITY_WEP;
|
||||
case AccessPoint.SECURITY_PSK:
|
||||
return WifiQrCode.SECURITY_WPA;
|
||||
return WifiQrCode.SECURITY_WPA_PSK;
|
||||
case AccessPoint.SECURITY_SAE:
|
||||
return WifiQrCode.SECURITY_SAE;
|
||||
default:
|
||||
|
||||
@@ -19,7 +19,7 @@ package com.android.settings.wifi.dpp;
|
||||
import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_NO_PASSWORD;
|
||||
import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_SAE;
|
||||
import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_WEP;
|
||||
import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_WPA;
|
||||
import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_WPA_PSK;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -53,8 +53,8 @@ public class WifiNetworkConfig {
|
||||
private boolean mHiddenSsid;
|
||||
private int mNetworkId;
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
protected WifiNetworkConfig(String security, String ssid, String preSharedKey,
|
||||
@VisibleForTesting
|
||||
WifiNetworkConfig(String security, String ssid, String preSharedKey,
|
||||
boolean hiddenSsid, int networkId) {
|
||||
mSecurity = security;
|
||||
mSsid = ssid;
|
||||
@@ -218,7 +218,7 @@ public class WifiNetworkConfig {
|
||||
}
|
||||
|
||||
// DPP 1.0 only supports SAE and PSK.
|
||||
if (SECURITY_SAE.equals(mSecurity) || SECURITY_WPA.equals(mSecurity)) {
|
||||
if (SECURITY_SAE.equals(mSecurity) || SECURITY_WPA_PSK.equals(mSecurity)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -256,7 +256,7 @@ public class WifiNetworkConfig {
|
||||
} else {
|
||||
wifiConfiguration.wepKeys[0] = addQuotationIfNeeded(mPreSharedKey);
|
||||
}
|
||||
} else if (mSecurity.startsWith(SECURITY_WPA)) {
|
||||
} else if (mSecurity.startsWith(SECURITY_WPA_PSK)) {
|
||||
wifiConfiguration.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
|
||||
|
||||
if (mPreSharedKey.matches("[0-9A-Fa-f]{64}")) {
|
||||
|
||||
@@ -235,7 +235,7 @@ public class WifiNetworkListFragment extends SettingsPreferenceFragment implemen
|
||||
if (mOnChooseNetworkListener != null) {
|
||||
mOnChooseNetworkListener.onChooseNetwork(
|
||||
new WifiNetworkConfig(
|
||||
WifiQrCode.SECURITY_WPA,
|
||||
WifiQrCode.SECURITY_WPA_PSK,
|
||||
/* ssid */ WifiNetworkConfig.FAKE_SSID,
|
||||
/* preSharedKey */ WifiNetworkConfig.FAKE_PASSWORD,
|
||||
/* hiddenSsid */ true,
|
||||
|
||||
@@ -66,7 +66,7 @@ public class WifiQrCode {
|
||||
// Ignores password if security is SECURITY_NO_PASSWORD or absent
|
||||
public static final String SECURITY_NO_PASSWORD = "nopass";
|
||||
public static final String SECURITY_WEP = "WEP";
|
||||
public static final String SECURITY_WPA = "WPA";
|
||||
public static final String SECURITY_WPA_PSK = "WPA";
|
||||
public static final String SECURITY_SAE = "WPA3";
|
||||
|
||||
private String mQrCode;
|
||||
@@ -169,8 +169,8 @@ public class WifiQrCode {
|
||||
return null;
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
protected String removeBackSlash(String input) {
|
||||
@VisibleForTesting
|
||||
String removeBackSlash(String input) {
|
||||
if (input == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -210,8 +210,8 @@ public class WifiQrCode {
|
||||
}
|
||||
|
||||
/** Available when {@code getScheme()} returns SCHEME_DPP */
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
protected String getPublicKey() {
|
||||
@VisibleForTesting
|
||||
String getPublicKey() {
|
||||
return mPublicKey;
|
||||
}
|
||||
|
||||
|
||||
@@ -85,6 +85,7 @@ public class WifiP2pSettings extends DashboardFragment
|
||||
private boolean mWifiP2pSearching;
|
||||
private int mConnectedDevices;
|
||||
private boolean mLastGroupFormed = false;
|
||||
private boolean mIsIgnoreInitConnectionInfoCallback = false;
|
||||
|
||||
private P2pPeerCategoryPreferenceController mPeerCategoryController;
|
||||
private P2pPersistentCategoryPreferenceController mPersistentCategoryController;
|
||||
@@ -131,6 +132,7 @@ public class WifiP2pSettings extends DashboardFragment
|
||||
startSearch();
|
||||
}
|
||||
mLastGroupFormed = wifip2pinfo.groupFormed;
|
||||
mIsIgnoreInitConnectionInfoCallback = true;
|
||||
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
|
||||
mThisDevice = (WifiP2pDevice) intent.getParcelableExtra(
|
||||
WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
|
||||
@@ -338,6 +340,29 @@ public class WifiP2pSettings extends DashboardFragment
|
||||
getActivity().registerReceiver(mReceiver, mIntentFilter);
|
||||
if (mWifiP2pManager != null) {
|
||||
mWifiP2pManager.requestPeers(mChannel, WifiP2pSettings.this);
|
||||
mWifiP2pManager.requestDeviceInfo(mChannel, wifiP2pDevice -> {
|
||||
if (DBG) {
|
||||
Log.d(TAG, "Get device info: " + wifiP2pDevice);
|
||||
}
|
||||
mThisDevice = wifiP2pDevice;
|
||||
mThisDevicePreferenceController.updateDeviceName(wifiP2pDevice);
|
||||
});
|
||||
mIsIgnoreInitConnectionInfoCallback = false;
|
||||
mWifiP2pManager.requestNetworkInfo(mChannel, networkInfo -> {
|
||||
mWifiP2pManager.requestConnectionInfo(mChannel, wifip2pinfo -> {
|
||||
if (!mIsIgnoreInitConnectionInfoCallback) {
|
||||
if (networkInfo.isConnected()) {
|
||||
if (DBG) {
|
||||
Log.d(TAG, "Connected");
|
||||
}
|
||||
} else if (!mLastGroupFormed) {
|
||||
// Find peers when p2p doesn't connected.
|
||||
startSearch();
|
||||
}
|
||||
mLastGroupFormed = wifip2pinfo.groupFormed;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@ LOCAL_PATH := $(call my-dir)
|
||||
SETTINGS_AOSP_PATH := packages/apps/Settings
|
||||
|
||||
#############################################################
|
||||
# Build SettingsTest.apk which includes test-only resources.#
|
||||
# Build SettingsRoboTestStub.apk which includes test-only resources.#
|
||||
#############################################################
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_PACKAGE_NAME := SettingsTest
|
||||
LOCAL_PACKAGE_NAME := SettingsRoboTestStub
|
||||
LOCAL_PRIVATE_PLATFORM_APIS := true
|
||||
LOCAL_CERTIFICATE := platform
|
||||
LOCAL_PRIVILEGED_MODULE := true
|
||||
@@ -77,7 +77,7 @@ LOCAL_JAVA_LIBRARIES := \
|
||||
mockito-robolectric-prebuilt \
|
||||
truth-prebuilt
|
||||
|
||||
LOCAL_INSTRUMENTATION_FOR := SettingsTest
|
||||
LOCAL_INSTRUMENTATION_FOR := SettingsRoboTestStub
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
@@ -100,7 +100,7 @@ LOCAL_JAVA_LIBRARIES := \
|
||||
mockito-robolectric-prebuilt \
|
||||
truth-prebuilt
|
||||
|
||||
LOCAL_TEST_PACKAGE := SettingsTest
|
||||
LOCAL_TEST_PACKAGE := SettingsRoboTestStub
|
||||
|
||||
LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src \
|
||||
frameworks/base/packages/SettingsLib/search/src \
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
<bool name="config_show_vibrate_input_devices">false</bool>
|
||||
<bool name="config_show_reset_dashboard">false</bool>
|
||||
<bool name="config_show_system_update_settings">false</bool>
|
||||
<bool name="config_wifi_support_connected_mac_randomization">false</bool>
|
||||
<bool name="config_show_device_model">false</bool>
|
||||
<bool name="config_show_top_level_battery">false</bool>
|
||||
<bool name="config_show_top_level_connected_devices">false</bool>
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
<bool name="config_show_camera_laser_sensor">true</bool>
|
||||
<bool name="config_show_connectivity_monitor">true</bool>
|
||||
<bool name="config_display_recent_apps">true</bool>
|
||||
<bool name="config_wifi_support_connected_mac_randomization">true</bool>
|
||||
|
||||
<!-- Fake dimen value for restricted icon size - needed to get around Robolectric
|
||||
issue loading framework hidden resources -->
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* 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.accessibility;
|
||||
|
||||
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
|
||||
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.pm.ResolveInfo;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.Shadows;
|
||||
import org.robolectric.shadows.ShadowPackageManager;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class LiveCaptionPreferenceControllerTest {
|
||||
|
||||
private LiveCaptionPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mController = new LiveCaptionPreferenceController(RuntimeEnvironment.application,
|
||||
"test_key");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_canResolveIntent_shouldReturnAvailable() {
|
||||
final ShadowPackageManager pm = Shadows.shadowOf(
|
||||
RuntimeEnvironment.application.getPackageManager());
|
||||
pm.addResolveInfoForIntent(LiveCaptionPreferenceController.LIVE_CAPTION_INTENT,
|
||||
new ResolveInfo());
|
||||
|
||||
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_noResolveIntent_shouldReturnUnavailable() {
|
||||
final ShadowPackageManager pm = Shadows.shadowOf(
|
||||
RuntimeEnvironment.application.getPackageManager());
|
||||
pm.setResolveInfosForIntent(LiveCaptionPreferenceController.LIVE_CAPTION_INTENT,
|
||||
Collections.emptyList());
|
||||
|
||||
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
|
||||
}
|
||||
}
|
||||
@@ -18,13 +18,8 @@ package com.android.settings.applications.appinfo;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
|
||||
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
|
||||
import android.permission.PermissionControllerManager;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -33,64 +28,30 @@ import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.annotation.Implementation;
|
||||
import org.robolectric.annotation.Implements;
|
||||
import org.robolectric.shadows.ShadowApplication;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class DefaultPhoneShortcutPreferenceControllerTest {
|
||||
|
||||
@Mock
|
||||
private PackageManager mPackageManager;
|
||||
private static final String TEST_PACKAGE_NAME = "TestPackage";
|
||||
private static final String PREFERENCE_KEY = "default_phone_app";
|
||||
|
||||
@Mock
|
||||
private PermissionControllerManager mPermissionControllerManager;
|
||||
|
||||
private Context mContext;
|
||||
private DefaultPhoneShortcutPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
when(mContext.getPackageManager()).thenReturn(mPackageManager);
|
||||
mController = new DefaultPhoneShortcutPreferenceController(mContext, "Package1");
|
||||
ShadowApplication.getInstance().setSystemService(Context.PERMISSION_CONTROLLER_SERVICE,
|
||||
mPermissionControllerManager);
|
||||
mController = new DefaultPhoneShortcutPreferenceController(RuntimeEnvironment.application,
|
||||
TEST_PACKAGE_NAME);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getPreferenceKey_shouldReturnDefaultPhone() {
|
||||
assertThat(mController.getPreferenceKey()).isEqualTo("default_phone_app");
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = ShadowDefaultPhonePreferenceController.class)
|
||||
public void hasAppCapability_hasPhoneCapability_shouldReturnTrue() {
|
||||
assertThat(mController.hasAppCapability()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void hasAppCapability_noPhoneCapability_shouldReturnFalse() {
|
||||
assertThat(mController.hasAppCapability()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = ShadowDefaultPhonePreferenceController.class)
|
||||
public void isDefaultApp_isDefaultPhone_shouldReturnTrue() {
|
||||
assertThat(mController.isDefaultApp()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isDefaultApp_notDefaultPhone_shouldReturnFalse() {
|
||||
assertThat(mController.isDefaultApp()).isFalse();
|
||||
}
|
||||
|
||||
@Implements(DefaultPhonePreferenceController.class)
|
||||
public static class ShadowDefaultPhonePreferenceController {
|
||||
@Implementation
|
||||
protected static boolean hasPhonePreference(String pkg, Context context) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Implementation
|
||||
protected static boolean isPhoneDefault(String pkg, Context context) {
|
||||
return true;
|
||||
}
|
||||
assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,8 @@ public class ManageApplicationsTest {
|
||||
private UserManager mUserManager;
|
||||
@Mock
|
||||
private PackageManager mPackageManager;
|
||||
|
||||
private Context mContext;
|
||||
private MenuItem mAppReset;
|
||||
private MenuItem mSortRecent;
|
||||
private MenuItem mSortFrequent;
|
||||
@@ -99,6 +101,7 @@ public class ManageApplicationsTest {
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mAppReset = new RoboMenuItem(R.id.reset_app_preferences);
|
||||
mSortRecent = new RoboMenuItem(R.id.sort_order_recent_notification);
|
||||
mSortFrequent = new RoboMenuItem(R.id.sort_order_frequent_notification);
|
||||
@@ -107,6 +110,7 @@ public class ManageApplicationsTest {
|
||||
when(mState.getBackgroundLooper()).thenReturn(Looper.myLooper());
|
||||
|
||||
mFragment = spy(new ManageApplications());
|
||||
when(mFragment.getContext()).thenReturn(mContext);
|
||||
when(mFragment.getActivity()).thenReturn(mActivity);
|
||||
when(mActivity.getResources()).thenReturn(mResources);
|
||||
when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
|
||||
@@ -460,6 +464,31 @@ public class ManageApplicationsTest {
|
||||
assertThat(mFragment.mSortOrder).isEqualTo(mSortFrequent.getItemId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateFilterView_hasFilterSet_shouldShowFilterAndHavePaddingTop() {
|
||||
mFragment.mContentContainer = new View(mContext);
|
||||
mFragment.mSpinnerHeader = new View(mContext);
|
||||
mFragment.mFilterAdapter = new ManageApplications.FilterSpinnerAdapter(mFragment);
|
||||
|
||||
mFragment.mFilterAdapter.updateFilterView(true);
|
||||
|
||||
assertThat(mFragment.mSpinnerHeader.getVisibility()).isEqualTo(View.VISIBLE);
|
||||
assertThat(mFragment.mContentContainer.getPaddingTop()).isEqualTo(
|
||||
mContext.getResources().getDimensionPixelSize(R.dimen.app_bar_height));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateFilterView_noFilterSet_shouldHideFilterAndNoPaddingTop() {
|
||||
mFragment.mContentContainer = new View(mContext);
|
||||
mFragment.mSpinnerHeader = new View(mContext);
|
||||
mFragment.mFilterAdapter = new ManageApplications.FilterSpinnerAdapter(mFragment);
|
||||
|
||||
mFragment.mFilterAdapter.updateFilterView(false);
|
||||
|
||||
assertThat(mFragment.mSpinnerHeader.getVisibility()).isEqualTo(View.GONE);
|
||||
assertThat(mFragment.mContentContainer.getPaddingTop()).isEqualTo(0);
|
||||
}
|
||||
|
||||
private void setUpOptionMenus() {
|
||||
when(mMenu.findItem(anyInt())).thenAnswer(invocation -> {
|
||||
final Object[] args = invocation.getArguments();
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.backup;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.backup.BackupManager;
|
||||
import android.content.Context;
|
||||
import android.os.UserManager;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.shadow.api.Shadow;
|
||||
import org.robolectric.shadows.ShadowApplication;
|
||||
import org.robolectric.shadows.ShadowUserManager;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class BackupSettingsActivityPreferenceControllerTest {
|
||||
|
||||
private static final String KEY_BACKUP_SETTINGS = "backup_settings";
|
||||
|
||||
private Context mContext;
|
||||
private BackupManager mBackupManager;
|
||||
private UserManager mUserManager;
|
||||
|
||||
@Mock
|
||||
private Preference mBackupPreference;
|
||||
|
||||
private BackupSettingsActivityPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mBackupManager = new BackupManager(mContext);
|
||||
|
||||
final ShadowApplication shadowApplication = ShadowApplication.getInstance();
|
||||
shadowApplication.grantPermissions(android.Manifest.permission.BACKUP);
|
||||
shadowApplication.setSystemService(Context.BACKUP_SERVICE, mBackupManager);
|
||||
|
||||
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
|
||||
|
||||
mController = new BackupSettingsActivityPreferenceController(mContext, KEY_BACKUP_SETTINGS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_backupOn() {
|
||||
mBackupManager.setBackupEnabled(true);
|
||||
|
||||
mController.updateState(mBackupPreference);
|
||||
String summaryString = mContext.getString(R.string.backup_summary_state_on);
|
||||
verify(mBackupPreference).setSummary(summaryString);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_backupOff() {
|
||||
mBackupManager.setBackupEnabled(false);
|
||||
|
||||
mController.updateState(mBackupPreference);
|
||||
String summaryString = mContext.getString(R.string.backup_summary_state_off);
|
||||
verify(mBackupPreference).setSummary(summaryString);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAvailable_systemUser() {
|
||||
final ShadowUserManager sum = Shadow.extract(mUserManager);
|
||||
sum.setIsAdminUser(true);
|
||||
|
||||
assertThat(mController.isAvailable()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAvailable_nonSystemUser() {
|
||||
final ShadowUserManager sum = Shadow.extract(mUserManager);
|
||||
sum.setIsAdminUser(false);
|
||||
|
||||
assertThat(mController.isAvailable()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getPreferenceKey() {
|
||||
assertThat(mController.getPreferenceKey()).isEqualTo(KEY_BACKUP_SETTINGS);
|
||||
}
|
||||
}
|
||||
@@ -31,12 +31,16 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.content.res.Resources;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import com.android.settings.R;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -47,11 +51,12 @@ import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.annotation.Implementation;
|
||||
import org.robolectric.annotation.Implements;
|
||||
import org.robolectric.shadow.api.Shadow;
|
||||
import org.robolectric.shadows.ShadowUserManager;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = BackupSettingsHelperTest.ShadowBackupManagerStub.class)
|
||||
public class BackupSettingsHelperTest {
|
||||
|
||||
private static final String DEFAULT_SETTINGS_CLASSNAME =
|
||||
"com.android.settings.Settings$PrivacySettingsActivity";
|
||||
|
||||
@@ -72,12 +77,46 @@ public class BackupSettingsHelperTest {
|
||||
@Mock
|
||||
private static IBackupManager mBackupManager;
|
||||
|
||||
private ShadowUserManager mUserManager;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
|
||||
when(mBackupManager.getCurrentTransport()).thenReturn("test_transport");
|
||||
mBackupSettingsHelper = new BackupSettingsHelper(mContext);
|
||||
mUserManager = Shadow.extract(mContext.getSystemService(Context.USER_SERVICE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSummary_backupEnabledOnlyOneProfile_showsOn() throws Exception {
|
||||
mUserManager.addUserProfile(new UserHandle(0));
|
||||
when(mBackupManager.isBackupEnabled()).thenReturn(true);
|
||||
|
||||
String backupSummary = mBackupSettingsHelper.getSummary();
|
||||
|
||||
assertThat(backupSummary).isEqualTo(mContext.getString(R.string.backup_summary_state_on));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSummary_backupDisabledOnlyOneProfile_showsOff() throws Exception {
|
||||
mUserManager.addUserProfile(new UserHandle(0));
|
||||
when(mBackupManager.isBackupEnabled()).thenReturn(false);
|
||||
|
||||
String backupSummary = mBackupSettingsHelper.getSummary();
|
||||
|
||||
assertThat(backupSummary).isEqualTo(mContext.getString(R.string.backup_summary_state_off));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSummary_TwoProfiles_returnsNull() throws Exception {
|
||||
mUserManager.addUserProfile(new UserHandle(0));
|
||||
mUserManager.addUserProfile(new UserHandle(10));
|
||||
when(mBackupManager.isBackupEnabled()).thenReturn(true);
|
||||
|
||||
String backupSummary = mBackupSettingsHelper.getSummary();
|
||||
|
||||
assertThat(backupSummary).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -35,8 +35,6 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.android.settings.search.SearchIndexableRaw;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -54,14 +52,12 @@ import org.robolectric.annotation.Implements;
|
||||
import org.robolectric.annotation.Resetter;
|
||||
import org.robolectric.shadows.ShadowPackageManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = {BackupSettingsActivityTest.ShadowBackupSettingsHelper.class,
|
||||
BackupSettingsActivityTest.ShadowUserHandle.class})
|
||||
public class BackupSettingsActivityTest {
|
||||
private ActivityController<BackupSettingsActivity> mActivityController;
|
||||
private BackupSettingsActivity mActivity;
|
||||
@Config(shadows = {UserBackupSettingsActivityTest.ShadowBackupSettingsHelper.class,
|
||||
UserBackupSettingsActivityTest.ShadowUserHandle.class})
|
||||
public class UserBackupSettingsActivityTest {
|
||||
private ActivityController<UserBackupSettingsActivity> mActivityController;
|
||||
private UserBackupSettingsActivity mActivity;
|
||||
private Application mApplication;
|
||||
private ShadowPackageManager mPackageManager;
|
||||
private static boolean mIsBackupProvidedByOEM;
|
||||
@@ -81,7 +77,7 @@ public class BackupSettingsActivityTest {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mApplication = RuntimeEnvironment.application;
|
||||
mActivityController = Robolectric.buildActivity(BackupSettingsActivity.class);
|
||||
mActivityController = Robolectric.buildActivity(UserBackupSettingsActivity.class);
|
||||
mActivity = mActivityController.get();
|
||||
mPackageManager = Shadows.shadowOf(mApplication.getPackageManager());
|
||||
when(mIntent.getComponent()).thenReturn(mComponent);
|
||||
@@ -130,9 +126,9 @@ public class BackupSettingsActivityTest {
|
||||
|
||||
@Test
|
||||
public void getNonIndexableKeys_SystemUser() {
|
||||
assertThat(BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
|
||||
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
|
||||
mApplication, true)).isNotEmpty();
|
||||
assertThat(BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
|
||||
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
|
||||
mApplication)).isEmpty();
|
||||
}
|
||||
|
||||
@@ -140,16 +136,10 @@ public class BackupSettingsActivityTest {
|
||||
public void getNonIndexableKeys_NonSystemUser() {
|
||||
ShadowUserHandle.setUid(1); // Non-SYSTEM user.
|
||||
|
||||
final List<SearchIndexableRaw> indexableRaws =
|
||||
BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
|
||||
mApplication, true);
|
||||
final List<String> nonIndexableKeys =
|
||||
BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
|
||||
mApplication);
|
||||
|
||||
assertThat(indexableRaws).isNotNull();
|
||||
assertThat(indexableRaws).isNotEmpty();
|
||||
assertThat(nonIndexableKeys).isNotEmpty();
|
||||
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
|
||||
mApplication, true)).isNotEmpty();
|
||||
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
|
||||
mApplication)).isEmpty();
|
||||
}
|
||||
|
||||
@Implements(BackupSettingsHelper.class)
|
||||
@@ -16,7 +16,11 @@
|
||||
package com.android.settings.connecteddevice;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.provider.SearchIndexableResource;
|
||||
|
||||
import com.android.settings.testutils.shadow.ShadowConnectivityManager;
|
||||
@@ -26,6 +30,7 @@ import com.android.settingslib.drawer.CategoryKey;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
@@ -40,6 +45,9 @@ public class AdvancedConnectedDeviceDashboardFragmentTest {
|
||||
|
||||
private AdvancedConnectedDeviceDashboardFragment mFragment;
|
||||
|
||||
@Mock
|
||||
private NfcAdapter mNfcAdapter;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
@@ -69,9 +77,13 @@ public class AdvancedConnectedDeviceDashboardFragmentTest {
|
||||
|
||||
@Test
|
||||
public void testSearchIndexProvider_correctNonIndexables() {
|
||||
Context context = spy(RuntimeEnvironment.application);
|
||||
when(context.getApplicationContext()).thenReturn(context);
|
||||
when(NfcAdapter.getDefaultAdapter(context)).thenReturn(mNfcAdapter);
|
||||
when(mNfcAdapter.deviceSupportsNfcSecure()).thenReturn(true);
|
||||
final List<String> niks =
|
||||
AdvancedConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
|
||||
.getNonIndexableKeys(RuntimeEnvironment.application);
|
||||
.getNonIndexableKeys(context);
|
||||
|
||||
assertThat(niks).contains(AdvancedConnectedDeviceDashboardFragment.KEY_BLUETOOTH);
|
||||
}
|
||||
|
||||
@@ -16,9 +16,6 @@
|
||||
|
||||
package com.android.settings.development;
|
||||
|
||||
import static com.android.settings.development.FileEncryptionPreferenceController
|
||||
.FILE_ENCRYPTION_PROPERTY_KEY;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
@@ -29,9 +26,8 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.storage.IStorageManager;
|
||||
|
||||
import android.sysprop.CryptoProperties;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
@@ -96,7 +92,7 @@ public class FileEncryptionPreferenceControllerTest {
|
||||
ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager);
|
||||
when(mStorageManager.isConvertibleToFBE()).thenReturn(true);
|
||||
mController.displayPreference(mPreferenceScreen);
|
||||
SystemProperties.set(FILE_ENCRYPTION_PROPERTY_KEY, "foobar");
|
||||
CryptoProperties.type("foobar");
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
@@ -110,7 +106,7 @@ public class FileEncryptionPreferenceControllerTest {
|
||||
ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager);
|
||||
when(mStorageManager.isConvertibleToFBE()).thenReturn(true);
|
||||
mController.displayPreference(mPreferenceScreen);
|
||||
SystemProperties.set(FILE_ENCRYPTION_PROPERTY_KEY, "file");
|
||||
CryptoProperties.type("file");
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.development;
|
||||
|
||||
import static com.android.settings.development.WifiConnectedMacRandomizationPreferenceController
|
||||
.SETTING_VALUE_OFF;
|
||||
import static com.android.settings.development.WifiConnectedMacRandomizationPreferenceController
|
||||
.SETTING_VALUE_ON;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class WifiConnectedMacRandomizationPreferenceControllerTest {
|
||||
|
||||
@Mock
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
|
||||
private Context mContext;
|
||||
private SwitchPreference mPreference;
|
||||
private WifiConnectedMacRandomizationPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mController = new WifiConnectedMacRandomizationPreferenceController(mContext);
|
||||
mPreference = new SwitchPreference(mContext);
|
||||
when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
|
||||
.thenReturn(mPreference);
|
||||
mController.displayPreference(mPreferenceScreen);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAvailable_trueSupportFlag_shouldReturnTrue() {
|
||||
assertThat(mController.isAvailable()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(qualifiers = "mcc999")
|
||||
public void isAvailable_falseSupportFlag_shouldReturnFalse() {
|
||||
assertThat(mController.isAvailable()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onPreferenceChange_settingEnabled_shouldEnableConnectedMacRandomization() {
|
||||
mController.onPreferenceChange(mPreference, true /* new value */);
|
||||
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, -1 /* default */);
|
||||
|
||||
assertThat(mode).isEqualTo(SETTING_VALUE_ON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onPreferenceChange_settingDisabled_shouldDisableConnectedMacRandomization() {
|
||||
mController.onPreferenceChange(mPreference, false /* new value */);
|
||||
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, -1 /* default */);
|
||||
|
||||
assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_settingEnabled_shouldEnablePreference() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, SETTING_VALUE_ON);
|
||||
mController.updateState(mPreference);
|
||||
|
||||
assertThat(mPreference.isChecked()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_settingDisabled_shouldDisablePreference() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, SETTING_VALUE_OFF);
|
||||
mController.updateState(mPreference);
|
||||
|
||||
assertThat(mPreference.isChecked()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
|
||||
mController.onDeveloperOptionsSwitchDisabled();
|
||||
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, -1 /* default */);
|
||||
|
||||
assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
|
||||
assertThat(mPreference.isChecked()).isFalse();
|
||||
assertThat(mPreference.isEnabled()).isFalse();
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,6 @@ package com.android.settings.fuelgauge.batterytip;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@@ -60,7 +59,8 @@ public class BatteryTipUtilsTest {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
FakeFeatureFactory.setupForTest();
|
||||
doReturn(RuntimeEnvironment.application).when(mFragment).getContext();
|
||||
when(mSettingsActivity.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
|
||||
when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application);
|
||||
mRestrictAppTip = spy(new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>()));
|
||||
mEarlyWarningTip = spy(
|
||||
new EarlyWarningTip(BatteryTip.StateType.NEW, true /* powerSaveModeOn */));
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Default reviewers for this and subdirectories.
|
||||
asc@google.com
|
||||
dsandler@google.com
|
||||
dsandler@android.com
|
||||
juliacr@google.com
|
||||
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* 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.notification;
|
||||
|
||||
import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class SilentStatusBarPreferenceControllerTest {
|
||||
|
||||
@Mock
|
||||
private NotificationBackend mBackend;
|
||||
@Mock
|
||||
private PreferenceScreen mScreen;
|
||||
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private Context mContext;
|
||||
private SilentStatusBarPreferenceController mController;
|
||||
private Preference mPreference;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mController = new SilentStatusBarPreferenceController(mContext);
|
||||
mPreference = new Preference(mContext);
|
||||
mPreference.setKey(mController.getPreferenceKey());
|
||||
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAvailable_featureEnabled() {
|
||||
Settings.Secure.putInt(
|
||||
mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1);
|
||||
assertThat(mController.isAvailable()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAvailable_featureDisabled() {
|
||||
Settings.Secure.putInt(
|
||||
mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 0);
|
||||
assertThat(mController.isAvailable()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isChecked_settingIsOff_false() {
|
||||
when(mBackend.shouldHideSilentStatusBarIcons(any())).thenReturn(false);
|
||||
assertThat(mController.isChecked()).isFalse();
|
||||
}
|
||||
/**
|
||||
@Test
|
||||
public void isChecked_settingIsOn_true() {
|
||||
when(mBackend.shouldHideSilentStatusBarIcons(any())).thenReturn(true);
|
||||
assertThat(mController.isChecked()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onPreferenceChange_on() {
|
||||
mController.onPreferenceChange(mPreference, true);
|
||||
|
||||
assertThat(mController.isChecked()).isTrue();
|
||||
verify(mBackend).setHideSilentStatusIcons(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onPreferenceChange_off() {
|
||||
mController.onPreferenceChange(mPreference, false);
|
||||
|
||||
assertThat(mController.isChecked()).isFalse();
|
||||
verify(mBackend).setHideSilentStatusIcons(false);
|
||||
}
|
||||
**/
|
||||
}
|
||||
|
||||
@@ -20,10 +20,12 @@ package com.android.settings.search;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.net.Uri;
|
||||
import android.provider.Settings;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
@@ -60,19 +62,19 @@ public class SearchFeatureProviderImplTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowUtils.class)
|
||||
public void initSearchToolbar_hasResolvedInfo_shouldStartCorrectIntent() {
|
||||
final Intent searchIntent = new Intent(SearchFeatureProvider.SEARCH_UI_INTENT)
|
||||
final Intent searchIntent = new Intent(Settings.ACTION_APP_SEARCH_SETTINGS)
|
||||
.setPackage(mActivity.getString(R.string.config_settingsintelligence_package_name));
|
||||
final ResolveInfo info = new ResolveInfo();
|
||||
info.activityInfo = new ActivityInfo();
|
||||
mPackageManager.addResolveInfoForIntent(searchIntent, info);
|
||||
|
||||
// Should not crash.
|
||||
mProvider.initSearchToolbar(mActivity, null);
|
||||
mProvider.initSearchToolbar(mActivity, null, SettingsEnums.TESTING);
|
||||
|
||||
final Toolbar toolbar = new Toolbar(mActivity);
|
||||
// This ensures navigationView is created.
|
||||
toolbar.setNavigationContentDescription("test");
|
||||
mProvider.initSearchToolbar(mActivity, toolbar);
|
||||
mProvider.initSearchToolbar(mActivity, toolbar, SettingsEnums.TESTING);
|
||||
|
||||
toolbar.performClick();
|
||||
|
||||
@@ -87,7 +89,7 @@ public class SearchFeatureProviderImplTest {
|
||||
final Toolbar toolbar = new Toolbar(mActivity);
|
||||
// This ensures navigationView is created.
|
||||
toolbar.setNavigationContentDescription("test");
|
||||
mProvider.initSearchToolbar(mActivity, toolbar);
|
||||
mProvider.initSearchToolbar(mActivity, toolbar, SettingsEnums.TESTING);
|
||||
|
||||
toolbar.performClick();
|
||||
|
||||
@@ -108,6 +110,15 @@ public class SearchFeatureProviderImplTest {
|
||||
assertThat(Shadows.shadowOf(mActivity).getNextStartedActivity()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildSearchIntent_shouldIncludeReferrer() {
|
||||
final Intent searchIntent = mProvider.buildSearchIntent(mActivity, SettingsEnums.TESTING);
|
||||
final Uri referrer = searchIntent.getParcelableExtra(Intent.EXTRA_REFERRER);
|
||||
|
||||
assertThat(referrer.toSafeString()).isEqualTo(
|
||||
"android-app://" + mActivity.getPackageName() + "/" + SettingsEnums.TESTING);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void verifyLaunchSearchResultPageCaller_nullCaller_shouldCrash() {
|
||||
mProvider.verifyLaunchSearchResultPageCaller(mActivity, null /* caller */);
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
package com.android.settings.search.actionbar;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings.Global;
|
||||
@@ -29,9 +29,9 @@ import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.InstrumentedFragment;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
import com.android.settingslib.core.lifecycle.ObservableFragment;
|
||||
import com.android.settingslib.core.lifecycle.ObservablePreferenceFragment;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -49,15 +49,24 @@ public class SearchMenuControllerTest {
|
||||
@Mock
|
||||
private Menu mMenu;
|
||||
private TestPreferenceFragment mPreferenceHost;
|
||||
private ObservableFragment mHost;
|
||||
private InstrumentedFragment mHost;
|
||||
private Context mContext;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mHost = spy(new ObservableFragment());
|
||||
when(mHost.getContext()).thenReturn(mContext);
|
||||
mHost = new InstrumentedFragment() {
|
||||
@Override
|
||||
public Context getContext() {
|
||||
return mContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.TESTING;
|
||||
}
|
||||
};
|
||||
mPreferenceHost = new TestPreferenceFragment();
|
||||
Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1);
|
||||
|
||||
@@ -101,7 +110,7 @@ public class SearchMenuControllerTest {
|
||||
verifyZeroInteractions(mMenu);
|
||||
}
|
||||
|
||||
private static class TestPreferenceFragment extends ObservablePreferenceFragment {
|
||||
private static class TestPreferenceFragment extends InstrumentedPreferenceFragment {
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||
}
|
||||
@@ -110,5 +119,10 @@ public class SearchMenuControllerTest {
|
||||
public Context getContext() {
|
||||
return RuntimeEnvironment.application;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.TESTING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.widget;
|
||||
|
||||
import static androidx.lifecycle.Lifecycle.Event.ON_START;
|
||||
import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ActionBarShadowControllerTest {
|
||||
|
||||
@Mock
|
||||
private RecyclerView mRecyclerView;
|
||||
@Mock
|
||||
private Activity mActivity;
|
||||
@Mock
|
||||
private ActionBar mActionBar;
|
||||
private Lifecycle mLifecycle;
|
||||
private LifecycleOwner mLifecycleOwner;
|
||||
private View mView;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
when(mActivity.getActionBar()).thenReturn(mActionBar);
|
||||
mView = new View(RuntimeEnvironment.application);
|
||||
mLifecycleOwner = () -> mLifecycle;
|
||||
mLifecycle = new Lifecycle(mLifecycleOwner);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void attachToRecyclerView_shouldAddScrollWatcherAndUpdateActionBar() {
|
||||
when(mRecyclerView.canScrollVertically(-1)).thenReturn(false);
|
||||
|
||||
ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView);
|
||||
|
||||
verify(mActionBar).setElevation(ActionBarShadowController.ELEVATION_LOW);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void attachToRecyclerView_customViewAsActionBar_shouldUpdateElevationOnScroll() {
|
||||
// Setup
|
||||
mView.setElevation(50);
|
||||
when(mRecyclerView.canScrollVertically(-1)).thenReturn(false);
|
||||
final ActionBarShadowController controller =
|
||||
ActionBarShadowController.attachToRecyclerView(mView, mLifecycle, mRecyclerView);
|
||||
assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_LOW);
|
||||
|
||||
// Scroll
|
||||
when(mRecyclerView.canScrollVertically(-1)).thenReturn(true);
|
||||
controller.mScrollChangeWatcher.onScrolled(mRecyclerView, 10 /* dx */, 10 /* dy */);
|
||||
assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_HIGH);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void attachToRecyclerView_lifecycleChange_shouldAttachDetach() {
|
||||
ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView);
|
||||
|
||||
verify(mRecyclerView).addOnScrollListener(any());
|
||||
|
||||
mLifecycle.handleLifecycleEvent(ON_START);
|
||||
mLifecycle.handleLifecycleEvent(ON_STOP);
|
||||
verify(mRecyclerView).removeOnScrollListener(any());
|
||||
|
||||
mLifecycle.handleLifecycleEvent(ON_START);
|
||||
verify(mRecyclerView, times(2)).addOnScrollListener(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onScrolled_nullAnchorViewAndActivity_shouldNotCrash() {
|
||||
final Activity activity = null;
|
||||
final ActionBarShadowController controller =
|
||||
ActionBarShadowController.attachToRecyclerView(activity, mLifecycle, mRecyclerView);
|
||||
|
||||
// Scroll
|
||||
controller.mScrollChangeWatcher.onScrolled(mRecyclerView, 10 /* dx */, 10 /* dy */);
|
||||
// no crash
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.Resources;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.provider.Settings;
|
||||
@@ -65,6 +66,8 @@ public class WifiInfoPreferenceControllerTest {
|
||||
private Preference mMacPreference;
|
||||
@Mock
|
||||
private WifiInfo mWifiInfo;
|
||||
@Mock
|
||||
private Resources mResources;
|
||||
|
||||
private Lifecycle mLifecycle;
|
||||
private LifecycleOwner mLifecycleOwner;
|
||||
@@ -82,6 +85,7 @@ public class WifiInfoPreferenceControllerTest {
|
||||
.thenReturn(mIpPreference);
|
||||
when(mWifiManager.getConnectionInfo()).thenReturn(mWifiInfo);
|
||||
when(mWifiManager.getCurrentNetwork()).thenReturn(null);
|
||||
when(mContext.getResources()).thenReturn(mResources);
|
||||
mController = new WifiInfoPreferenceController(mContext, mLifecycle, mWifiManager);
|
||||
}
|
||||
|
||||
@@ -117,8 +121,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_nullWifiInfoWithMacRandomizationOff_setMacUnavailable() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(false);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiManager.getConnectionInfo()).thenReturn(null);
|
||||
|
||||
@@ -129,8 +134,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_nullMacWithMacRandomizationOff_setMacUnavailable() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(false);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiInfo.getMacAddress()).thenReturn(null);
|
||||
|
||||
@@ -141,8 +147,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_defaultMacWithMacRandomizationOff_setMacUnavailable() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(false);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiInfo.getMacAddress()).thenReturn(WifiInfo.DEFAULT_MAC_ADDRESS);
|
||||
|
||||
@@ -153,8 +160,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_validMacWithMacRandomizationOff_setValidMac() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(false);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiInfo.getMacAddress()).thenReturn(TEST_MAC_ADDRESS);
|
||||
|
||||
@@ -165,8 +173,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_nullWifiInfoWithMacRandomizationOn_setMacUnavailable() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 1);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(true);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiManager.getConnectionInfo()).thenReturn(null);
|
||||
|
||||
@@ -177,8 +186,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_nullMacWithMacRandomizationOn_setMacUnavailable() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 1);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(true);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiInfo.getMacAddress()).thenReturn(null);
|
||||
|
||||
@@ -189,8 +199,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_defaultMacWithMacRandomizationOn_setMacRandomized() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 1);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(true);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiInfo.getMacAddress()).thenReturn(WifiInfo.DEFAULT_MAC_ADDRESS);
|
||||
|
||||
@@ -201,8 +212,9 @@ public class WifiInfoPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateWifiInfo_validMacWithMacRandomizationOn_setValidMac() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 1);
|
||||
when(mResources.getBoolean(
|
||||
com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
|
||||
.thenReturn(true);
|
||||
mController.displayPreference(mScreen);
|
||||
when(mWifiInfo.getMacAddress()).thenReturn(TEST_MAC_ADDRESS);
|
||||
|
||||
|
||||
@@ -37,12 +37,9 @@ import java.util.List;
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
@SmallTest
|
||||
public class BackupIntentTest {
|
||||
|
||||
private static final String INTENT_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
|
||||
private static final String INTENT_BACKUP_SETTINGS =
|
||||
"android.settings.BACKUP_AND_RESET_SETTINGS";
|
||||
private static final String BACKUP_SETTINGS_ACTIVITY =
|
||||
"com.android.settings.backup.BackupSettingsActivity";
|
||||
"com.android.settings.backup.UserBackupSettingsActivity";
|
||||
|
||||
private Context mContext;
|
||||
|
||||
@@ -52,17 +49,6 @@ public class BackupIntentTest {
|
||||
mContext = instrumentation.getTargetContext();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBackupSettingsIntentResolvesToOnlyOneActivity(){
|
||||
PackageManager pm = mContext.getPackageManager();
|
||||
Intent intent = new Intent(INTENT_BACKUP_SETTINGS);
|
||||
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
|
||||
assertThat(activities).isNotNull();
|
||||
assertThat(activities.size()).isEqualTo(1);
|
||||
assertThat(activities.get(0).activityInfo.getComponentName().getClassName()).
|
||||
isEqualTo(BACKUP_SETTINGS_ACTIVITY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPrivacySettingsIntentResolvesToOnlyOneActivity(){
|
||||
PackageManager pm = mContext.getPackageManager();
|
||||
@@ -73,5 +59,4 @@ public class BackupIntentTest {
|
||||
assertThat(activities.get(0).activityInfo.getComponentName().getClassName()).
|
||||
isEqualTo(BACKUP_SETTINGS_ACTIVITY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Default reviewers for this and subdirectories.
|
||||
asc@google.com
|
||||
dsandler@google.com
|
||||
dsandler@android.com
|
||||
juliacr@google.com
|
||||
Reference in New Issue
Block a user