Snap for 5271441 from 6b3db61e53 to qt-release

Change-Id: I16f7be6708c90be69f434640ba74c0ccab58cd58
This commit is contained in:
android-build-team Robot
2019-01-31 04:11:19 +00:00
91 changed files with 975 additions and 1223 deletions

View File

@@ -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

View 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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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)

View File

@@ -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 :

View File

@@ -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";

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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"

View File

@@ -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);
}
}

View File

@@ -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>

View File

@@ -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);
}
}

View File

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

View File

@@ -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() {

View File

@@ -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.

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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,

View File

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

View File

@@ -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;

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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];
}
}

View File

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

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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) {

View 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;
}
}
}

View File

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

View File

@@ -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);

View File

@@ -1,4 +1,4 @@
# Default reviewers for this and subdirectories.
asc@google.com
dsandler@google.com
dsandler@android.com
juliacr@google.com

View File

@@ -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;
}
}

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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}.

View File

@@ -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);
}

View File

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

View File

@@ -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()) {

View File

@@ -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);
}
}
}
}
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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)) {

View File

@@ -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);
}
}

View File

@@ -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);

View File

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

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -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);
}
}
}

View File

@@ -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,

View File

@@ -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);

View File

@@ -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:

View File

@@ -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}")) {

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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;
}
});
});
}
}

View File

@@ -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 \

View File

@@ -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>

View File

@@ -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 -->

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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);

View File

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

View File

@@ -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 */));

View File

@@ -1,4 +1,4 @@
# Default reviewers for this and subdirectories.
asc@google.com
dsandler@google.com
dsandler@android.com
juliacr@google.com

View File

@@ -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);
}
**/
}

View File

@@ -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 */);

View File

@@ -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;
}
}
}

View File

@@ -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
}
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -1,4 +1,4 @@
# Default reviewers for this and subdirectories.
asc@google.com
dsandler@google.com
dsandler@android.com
juliacr@google.com