Snap for 5335706 from cf6757a72f to qt-release

Change-Id: I2ec9aa7bb9f65ba27288f618247c5410fdeb0331
This commit is contained in:
android-build-team Robot
2019-02-26 04:01:07 +00:00
50 changed files with 624 additions and 779 deletions

View File

@@ -1,103 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/sim_content_padding">
<TextView
style="@style/device_info_dialog_label"
android:id="@+id/firmware_version_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/firmware_version"/>
<TextView
style="@style/device_info_dialog_value"
android:id="@+id/firmware_version_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
style="@style/device_info_dialog_label"
android:id="@+id/security_patch_level_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/security_patch"/>
<TextView
style="@style/device_info_dialog_value"
android:id="@+id/security_patch_level_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:textColor="?android:attr/colorAccent"/>
<TextView
style="@style/device_info_dialog_label"
android:id="@+id/module_version_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/module_version"/>
<TextView
style="@style/device_info_dialog_value"
android:id="@+id/module_version_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
style="@style/device_info_dialog_label"
android:id="@+id/baseband_version_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/baseband_version"/>
<TextView
style="@style/device_info_dialog_value"
android:id="@+id/baseband_version_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
style="@style/device_info_dialog_label"
android:id="@+id/kernel_version_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/kernel_version"/>
<TextView
style="@style/device_info_dialog_value"
android:id="@+id/kernel_version_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
style="@style/device_info_dialog_label"
android:id="@+id/build_number_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/build_number"/>
<TextView
style="@style/device_info_dialog_value"
android:id="@+id/build_number_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>

View File

@@ -19,6 +19,8 @@
android:id="@+id/button_icon" android:id="@+id/button_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minWidth="@dimen/min_tap_target_size"
android:minHeight="@dimen/min_tap_target_size"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@null" android:background="@null"
android:visibility="gone" android:visibility="gone"

View File

@@ -65,9 +65,10 @@
android:id="@+id/ssid_scanner_button" android:id="@+id/ssid_scanner_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minWidth="@dimen/min_tap_target_size"
android:minHeight="@dimen/min_tap_target_size"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_margin="5dp"
android:background="@null" android:background="@null"
android:src="@drawable/ic_scan_24dp" android:src="@drawable/ic_scan_24dp"
android:contentDescription="@string/wifi_add_network" /> android:contentDescription="@string/wifi_add_network" />
@@ -300,9 +301,10 @@
android:id="@+id/password_scanner_button" android:id="@+id/password_scanner_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minWidth="@dimen/min_tap_target_size"
android:minHeight="@dimen/min_tap_target_size"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_margin="5dp"
android:background="@null" android:background="@null"
android:src="@drawable/ic_scan_24dp" android:src="@drawable/ic_scan_24dp"
android:contentDescription="@string/wifi_add_network" /> android:contentDescription="@string/wifi_add_network" />

View File

@@ -27,7 +27,6 @@
android:paddingStart="8dp" android:paddingStart="8dp"
android:paddingEnd="8dp"> android:paddingEnd="8dp">
<Button <Button
style="@android:style/@Widget.Material.Button.Colored"
android:id="@+id/forget_button" android:id="@+id/forget_button"
android:text="@string/forget" android:text="@string/forget"
android:layout_width="0dp" android:layout_width="0dp"

View File

@@ -171,9 +171,6 @@
<!-- Email address for the homepage contextual cards feedback --> <!-- Email address for the homepage contextual cards feedback -->
<string name="config_contextual_card_feedback_email" translatable="false"></string> <string name="config_contextual_card_feedback_email" translatable="false"></string>
<!-- Uri that represents extra bluetooth settings -->
<string name="config_bluetooth_device_settings_uri" translatable="false">content://com.google.android.gms.nearby.fastpair/settings_slice?addr=<xliff:g id="mac_address">%1$s</xliff:g></string>
<!-- ComponentName to launch a vendor-specific enrollment activity if available --> <!-- ComponentName to launch a vendor-specific enrollment activity if available -->
<string name="config_face_enroll" translatable="false"></string> <string name="config_face_enroll" translatable="false"></string>

View File

@@ -2927,8 +2927,6 @@
<!-- About phone screen, status item label [CHAR LIMIT=40] --> <!-- About phone screen, status item label [CHAR LIMIT=40] -->
<string name="firmware_version">Android version</string> <string name="firmware_version">Android version</string>
<!-- About phone screen, dialog title for showing device software information such as android version, security patch level, etc [CHAR LIMIT=60] -->
<string name="firmware_title">Android</string>
<!-- About phone screen, status item label [CHAR LIMIT=60] --> <!-- About phone screen, status item label [CHAR LIMIT=60] -->
<string name="security_patch">Android security patch level</string> <string name="security_patch">Android security patch level</string>
<!-- About phone screen, status item label [CHAR LIMIT=40] --> <!-- About phone screen, status item label [CHAR LIMIT=40] -->

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="firmware_version_screen"
android:title="@string/firmware_version"
settings:keywords="@string/keywords_android_version">
<!-- Android version -->
<Preference
android:key="os_firmware_version"
android:title="@string/firmware_version"
android:summary="@string/summary_placeholder"
settings:enableCopying="true"
settings:allowDynamicSummaryInSlice="true"
settings:controller="com.android.settings.deviceinfo.firmwareversion.FirmwareVersionDetailPreferenceController"/>
<!-- Security patch -->
<Preference
android:key="security_key"
android:title="@string/security_patch"
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelPreferenceController"/>
<!-- Mainline module version -->
<Preference
android:key="module_version"
android:title="@string/module_version"
android:summary="@string/summary_placeholder"
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreferenceController"/>
<!-- Baseband -->
<Preference
android:key="base_band"
android:title="@string/baseband_version"
android:summary="@string/summary_placeholder"
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.firmwareversion.BasebandVersionPreferenceController"/>
<!-- Kernel -->
<Preference
android:key="kernel_version"
android:title="@string/kernel_version"
android:summary="@string/summary_placeholder"
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.firmwareversion.KernelVersionPreferenceController"/>
<!-- Build -->
<Preference
android:key="os_build_number"
android:title="@string/build_number"
android:summary="@string/summary_placeholder"
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.firmwareversion.SimpleBuildNumberPreferenceController"/>
</PreferenceScreen>

View File

@@ -121,11 +121,10 @@
android:key="firmware_version" android:key="firmware_version"
android:order="32" android:order="32"
android:title="@string/firmware_version" android:title="@string/firmware_version"
settings:keywords="@string/keywords_android_version"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
settings:allowDynamicSummaryInSlice="true" settings:allowDynamicSummaryInSlice="true"
settings:controller= android:fragment="com.android.settings.deviceinfo.firmwareversion.FirmwareVersionSettings"
"com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController"/> settings:controller="com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController"/>
<!--IP address --> <!--IP address -->
<Preference <Preference

View File

@@ -16,6 +16,7 @@
package com.android.settings.bluetooth; package com.android.settings.bluetooth;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@@ -23,6 +24,8 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@@ -59,9 +62,25 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
@VisibleForTesting @VisibleForTesting
final Map<String, Bitmap> mIconCache; final Map<String, Bitmap> mIconCache;
private CachedBluetoothDevice mCachedDevice; private CachedBluetoothDevice mCachedDevice;
@VisibleForTesting
BluetoothAdapter mBluetoothAdapter;
@VisibleForTesting
Handler mHandler = new Handler(Looper.getMainLooper());
@VisibleForTesting
final BluetoothAdapter.MetadataListener mMetadataListener =
new BluetoothAdapter.MetadataListener() {
@Override
public void onMetadataChanged(BluetoothDevice device, int key, String value) {
super.onMetadataChanged(device, key, value);
Log.i(TAG, String.format("Metadata updated in Device %s: %d = %s.", device, key,
value));
refresh();
}
};
public AdvancedBluetoothDetailsHeaderController(Context context, String prefKey) { public AdvancedBluetoothDetailsHeaderController(Context context, String prefKey) {
super(context, prefKey); super(context, prefKey);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mIconCache = new HashMap<>(); mIconCache = new HashMap<>();
} }
@@ -84,11 +103,14 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
@Override @Override
public void onStart() { public void onStart() {
mCachedDevice.registerCallback(this::onDeviceAttributesChanged); mCachedDevice.registerCallback(this::onDeviceAttributesChanged);
mBluetoothAdapter.registerMetadataListener(mCachedDevice.getDevice(), mMetadataListener,
mHandler);
} }
@Override @Override
public void onStop() { public void onStop() {
mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged); mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged);
mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice());
// Destroy icon bitmap associated with this header // Destroy icon bitmap associated with this header
for (Bitmap bitmap : mIconCache.values()) { for (Bitmap bitmap : mIconCache.values()) {

View File

@@ -121,7 +121,7 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
FeatureFlags.SLICE_INJECTION); FeatureFlags.SLICE_INJECTION);
use(BlockingSlicePrefController.class).setSliceUri(injectionEnabled use(BlockingSlicePrefController.class).setSliceUri(injectionEnabled
? featureProvider.getBluetoothDeviceSettingsUri(mDeviceAddress) ? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice())
: null); : null);
} }

View File

@@ -16,6 +16,7 @@
package com.android.settings.bluetooth; package com.android.settings.bluetooth;
import android.bluetooth.BluetoothDevice;
import android.net.Uri; import android.net.Uri;
/** /**
@@ -25,8 +26,8 @@ public interface BluetoothFeatureProvider {
/** /**
* Get the {@link Uri} that represents extra settings for a specific bluetooth device * Get the {@link Uri} that represents extra settings for a specific bluetooth device
* @param macAddress Bluetooth mac address * @param bluetoothDevice bluetooth device
* @return {@link Uri} for extra settings * @return {@link Uri} for extra settings
*/ */
Uri getBluetoothDeviceSettingsUri(String macAddress); Uri getBluetoothDeviceSettingsUri(BluetoothDevice bluetoothDevice);
} }

View File

@@ -16,11 +16,10 @@
package com.android.settings.bluetooth; package com.android.settings.bluetooth;
import android.bluetooth.BluetoothDevice;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import com.android.settings.R;
/** /**
* Impl of {@link BluetoothFeatureProvider} * Impl of {@link BluetoothFeatureProvider}
*/ */
@@ -33,9 +32,9 @@ public class BluetoothFeatureProviderImpl implements BluetoothFeatureProvider {
} }
@Override @Override
public Uri getBluetoothDeviceSettingsUri(String macAddress) { public Uri getBluetoothDeviceSettingsUri(BluetoothDevice bluetoothDevice) {
final String uriString = mContext.getString(R.string.config_bluetooth_device_settings_uri, final String uriString = bluetoothDevice.getMetadata(
macAddress); BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI);
return Uri.parse(uriString); return uriString != null ? Uri.parse(uriString) : null;
} }
} }

View File

@@ -49,9 +49,9 @@ import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminSe
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails; import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails;
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings; import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings;
import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings; 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.PrivacySettings;
import com.android.settings.backup.ToggleBackupSettingFragment; import com.android.settings.backup.ToggleBackupSettingFragment;
import com.android.settings.backup.UserBackupSettingsActivity;
import com.android.settings.biometrics.face.FaceSettings; import com.android.settings.biometrics.face.FaceSettings;
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment; import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment; import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
@@ -68,6 +68,7 @@ import com.android.settings.deviceinfo.PublicVolumeSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment; import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings; import com.android.settings.deviceinfo.StorageSettings;
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionSettings;
import com.android.settings.display.NightDisplaySettings; import com.android.settings.display.NightDisplaySettings;
import com.android.settings.dream.DreamSettings; import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings; import com.android.settings.enterprise.EnterprisePrivacySettings;
@@ -166,6 +167,7 @@ public class SettingsGateway {
DisplaySettings.class.getName(), DisplaySettings.class.getName(),
MyDeviceInfoFragment.class.getName(), MyDeviceInfoFragment.class.getName(),
ManageApplications.class.getName(), ManageApplications.class.getName(),
FirmwareVersionSettings.class.getName(),
ManageAssist.class.getName(), ManageAssist.class.getName(),
ProcessStatsUi.class.getName(), ProcessStatsUi.class.getName(),
NotificationStation.class.getName(), NotificationStation.class.getName(),

View File

@@ -63,7 +63,8 @@ public class FileEncryptionPreferenceController extends DeveloperOptionsPreferen
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
if (!TextUtils.equals("file", CryptoProperties.type().orElse("none"))) { if (CryptoProperties.type().orElse(CryptoProperties.type_values.NONE) !=
CryptoProperties.type_values.FILE) {
return; return;
} }

View File

@@ -77,7 +77,6 @@ public class MyDeviceInfoFragment extends DashboardFragment
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
use(FirmwareVersionPreferenceController.class).setHost(this /* parent */);
use(DeviceModelPreferenceController.class).setHost(this /* parent */); use(DeviceModelPreferenceController.class).setHost(this /* parent */);
use(ImeiInfoPreferenceController.class).setHost(this /* parent */); use(ImeiInfoPreferenceController.class).setHost(this /* parent */);
use(DeviceNamePreferenceController.class).setHost(this /* parent */); use(DeviceNamePreferenceController.class).setHost(this /* parent */);

View File

@@ -1,56 +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.deviceinfo.firmwareversion;
import android.content.Context;
import android.os.SystemProperties;
import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.Utils;
public class BasebandVersionDialogController {
@VisibleForTesting
static final int BASEBAND_VERSION_LABEL_ID = R.id.baseband_version_label;
@VisibleForTesting
static final int BASEBAND_VERSION_VALUE_ID = R.id.baseband_version_value;
@VisibleForTesting
static final String BASEBAND_PROPERTY = "gsm.version.baseband";
private final FirmwareVersionDialogFragment mDialog;
public BasebandVersionDialogController(FirmwareVersionDialogFragment dialog) {
mDialog = dialog;
}
/**
* Updates the baseband version field of the dialog.
*/
public void initialize() {
final Context context = mDialog.getContext();
if (Utils.isWifiOnly(context)) {
mDialog.removeSettingFromScreen(BASEBAND_VERSION_LABEL_ID);
mDialog.removeSettingFromScreen(BASEBAND_VERSION_VALUE_ID);
return;
}
mDialog.setText(BASEBAND_VERSION_VALUE_ID, SystemProperties.get(BASEBAND_PROPERTY,
context.getString(R.string.device_info_default)));
}
}

View File

@@ -0,0 +1,47 @@
/*
* 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.deviceinfo.firmwareversion;
import android.content.Context;
import android.os.SystemProperties;
import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
public class BasebandVersionPreferenceController extends BasePreferenceController {
@VisibleForTesting
static final String BASEBAND_PROPERTY = "gsm.version.baseband";
public BasebandVersionPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@Override
public int getAvailabilityStatus() {
return !Utils.isWifiOnly(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
public CharSequence getSummary() {
return SystemProperties.get(BASEBAND_PROPERTY,
mContext.getString(R.string.device_info_default));
}
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -22,42 +22,61 @@ import android.os.Build;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.slices.Copyable;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
public class FirmwareVersionDialogController implements View.OnClickListener { public class FirmwareVersionDetailPreferenceController extends BasePreferenceController implements
Copyable {
private static final String TAG = "firmwareDialogCtrl"; private static final String TAG = "firmwareDialogCtrl";
private static final int DELAY_TIMER_MILLIS = 500; private static final int DELAY_TIMER_MILLIS = 500;
private static final int ACTIVITY_TRIGGER_COUNT = 3; private static final int ACTIVITY_TRIGGER_COUNT = 3;
@VisibleForTesting
static final int FIRMWARE_VERSION_VALUE_ID = R.id.firmware_version_value;
@VisibleForTesting
static final int FIRMWARE_VERSION_LABEL_ID = R.id.firmware_version_label;
private final FirmwareVersionDialogFragment mDialog;
private final Context mContext;
private final UserManager mUserManager; private final UserManager mUserManager;
private final long[] mHits = new long[ACTIVITY_TRIGGER_COUNT]; private final long[] mHits = new long[ACTIVITY_TRIGGER_COUNT];
private RestrictedLockUtils.EnforcedAdmin mFunDisallowedAdmin; private RestrictedLockUtils.EnforcedAdmin mFunDisallowedAdmin;
private boolean mFunDisallowedBySystem; private boolean mFunDisallowedBySystem;
public FirmwareVersionDialogController(FirmwareVersionDialogFragment dialog) { public FirmwareVersionDetailPreferenceController(Context context, String key) {
mDialog = dialog; super(context, key);
mContext = dialog.getContext();
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
initializeAdminPermissions();
} }
@Override @Override
public void onClick(View v) { public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public boolean isSliceable() {
return true;
}
@Override
public CharSequence getSummary() {
return Build.VERSION.RELEASE;
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
return false;
}
if (Utils.isMonkeyRunning()) {
return false;
}
arrayCopy(); arrayCopy();
mHits[mHits.length - 1] = SystemClock.uptimeMillis(); mHits[mHits.length - 1] = SystemClock.uptimeMillis();
if (mHits[0] >= (SystemClock.uptimeMillis() - DELAY_TIMER_MILLIS)) { if (mHits[0] >= (SystemClock.uptimeMillis() - DELAY_TIMER_MILLIS)) {
@@ -67,7 +86,7 @@ public class FirmwareVersionDialogController implements View.OnClickListener {
mFunDisallowedAdmin); mFunDisallowedAdmin);
} }
Log.d(TAG, "Sorry, no fun for you!"); Log.d(TAG, "Sorry, no fun for you!");
return; return true;
} }
final Intent intent = new Intent(Intent.ACTION_MAIN) final Intent intent = new Intent(Intent.ACTION_MAIN)
@@ -79,21 +98,7 @@ public class FirmwareVersionDialogController implements View.OnClickListener {
Log.e(TAG, "Unable to start activity " + intent.toString()); Log.e(TAG, "Unable to start activity " + intent.toString());
} }
} }
} return true;
/**
* Populates the Android version field in the dialog and registers click listeners.
*/
public void initialize() {
initializeAdminPermissions();
registerClickListeners();
mDialog.setText(FIRMWARE_VERSION_VALUE_ID, Build.VERSION.RELEASE);
}
private void registerClickListeners() {
mDialog.registerClickListener(FIRMWARE_VERSION_LABEL_ID, this /* listener */);
mDialog.registerClickListener(FIRMWARE_VERSION_VALUE_ID, this /* listener */);
} }
/** /**
@@ -111,4 +116,10 @@ public class FirmwareVersionDialogController implements View.OnClickListener {
mFunDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction( mFunDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
mContext, UserManager.DISALLOW_FUN, UserHandle.myUserId()); mContext, UserManager.DISALLOW_FUN, UserHandle.myUserId());
} }
@Override
public void copy() {
Copyable.setCopyContent(mContext, getSummary(),
mContext.getText(R.string.firmware_version));
}
} }

View File

@@ -1,95 +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.deviceinfo.firmwareversion;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment {
private static final String TAG = "firmwareVersionDialog";
private View mRootView;
public static void show(Fragment host) {
final FragmentManager manager = host.getChildFragmentManager();
if (manager.findFragmentByTag(TAG) == null) {
final FirmwareVersionDialogFragment dialog = new FirmwareVersionDialogFragment();
dialog.show(manager, TAG);
}
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DIALOG_FIRMWARE_VERSION;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setTitle(R.string.firmware_title)
.setPositiveButton(android.R.string.ok, null /* listener */);
mRootView = LayoutInflater.from(getActivity()).inflate(
R.layout.dialog_firmware_version, null /* parent */);
initializeControllers();
return builder.setView(mRootView).create();
}
public void setText(int viewId, CharSequence text) {
final TextView view = mRootView.findViewById(viewId);
if (view != null) {
view.setText(text);
}
}
public void removeSettingFromScreen(int viewId) {
final View view = mRootView.findViewById(viewId);
if (view != null) {
view.setVisibility(View.GONE);
}
}
public void registerClickListener(int viewId, View.OnClickListener listener) {
final View view = mRootView.findViewById(viewId);
if (view != null) {
view.setOnClickListener(listener);
}
}
private void initializeControllers() {
new FirmwareVersionDialogController(this).initialize();
new SecurityPatchLevelDialogController(this).initialize();
new BasebandVersionDialogController(this).initialize();
new KernelVersionDialogController(this).initialize();
new BuildNumberDialogController(this).initialize();
new ModuleVersionDialogController(this).initialize();
}
}

View File

@@ -18,56 +18,22 @@ package com.android.settings.deviceinfo.firmwareversion;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.text.TextUtils;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.slices.Copyable;
public class FirmwareVersionPreferenceController extends BasePreferenceController implements public class FirmwareVersionPreferenceController extends BasePreferenceController {
Copyable {
private Fragment mFragment;
public FirmwareVersionPreferenceController(Context context, String key) { public FirmwareVersionPreferenceController(Context context, String key) {
super(context, key); super(context, key);
} }
public void setHost(Fragment fragment) {
mFragment = fragment;
}
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
return AVAILABLE; return AVAILABLE_UNSEARCHABLE;
} }
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
return Build.VERSION.RELEASE; return Build.VERSION.RELEASE;
} }
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (!TextUtils.equals(preference.getKey(), mPreferenceKey)) {
return false;
}
FirmwareVersionDialogFragment.show(mFragment);
return true;
}
@Override
public boolean isSliceable() {
return true;
}
@Override
public void copy() {
Copyable.setCopyContent(mContext, getSummary(),
mContext.getText(R.string.firmware_version));
}
} }

View File

@@ -0,0 +1,64 @@
/*
* 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.deviceinfo.firmwareversion;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.SearchIndexableResource;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
@SearchIndexable
public class FirmwareVersionSettings extends DashboardFragment {
@Override
protected int getPreferenceScreenResId() {
return R.xml.firmware_version;
}
@Override
protected String getLogTag() {
return "FirmwareVersionSettings";
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DIALOG_FIRMWARE_VERSION;
}
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
final ArrayList<SearchIndexableResource> result = new ArrayList<>();
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.firmware_version;
result.add(sir);
return result;
}
};
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,27 +16,24 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import androidx.annotation.VisibleForTesting; import android.content.Context;
import com.android.settings.R; import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.DeviceInfoUtils; import com.android.settingslib.DeviceInfoUtils;
public class KernelVersionDialogController { public class KernelVersionPreferenceController extends BasePreferenceController {
@VisibleForTesting public KernelVersionPreferenceController(Context context, String preferenceKey) {
static int KERNEL_VERSION_VALUE_ID = R.id.kernel_version_value; super(context, preferenceKey);
private final FirmwareVersionDialogFragment mDialog;
public KernelVersionDialogController(FirmwareVersionDialogFragment dialog) {
mDialog = dialog;
} }
/** @Override
* Updates kernel version to the dialog. public int getAvailabilityStatus() {
*/ return AVAILABLE;
public void initialize() { }
mDialog.setText(KERNEL_VERSION_VALUE_ID,
DeviceInfoUtils.getFormattedKernelVersion(mDialog.getContext())); @Override
public CharSequence getSummary() {
return DeviceInfoUtils.getFormattedKernelVersion(mContext);
} }
} }

View File

@@ -22,51 +22,51 @@ import android.text.TextUtils;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import android.util.Log; import android.util.Log;
import com.android.settings.R; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.FeatureFlags; import com.android.settings.core.FeatureFlags;
import androidx.annotation.VisibleForTesting; public class MainlineModuleVersionPreferenceController extends BasePreferenceController {
public class ModuleVersionDialogController {
private static final String TAG = "MainlineModuleControl"; private static final String TAG = "MainlineModuleControl";
@VisibleForTesting
static final int MODULE_VERSION_LABEL_ID = R.id.module_version_label;
@VisibleForTesting
static final int MODULE_VERSION_VALUE_ID = R.id.module_version_value;
private final FirmwareVersionDialogFragment mDialog;
private final Context mContext;
private final PackageManager mPackageManager; private final PackageManager mPackageManager;
public ModuleVersionDialogController(FirmwareVersionDialogFragment dialog) { private String mModuleVersion;
mDialog = dialog;
mContext = mDialog.getContext(); public MainlineModuleVersionPreferenceController(Context context, String key) {
super(context, key);
mPackageManager = mContext.getPackageManager(); mPackageManager = mContext.getPackageManager();
initModules();
} }
/** @Override
* Updates the mainline module version field of the dialog. public int getAvailabilityStatus() {
*/ if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MAINLINE_MODULE)) {
public void initialize() { return UNSUPPORTED_ON_DEVICE;
}
return !TextUtils.isEmpty(mModuleVersion) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
private void initModules() {
if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MAINLINE_MODULE)) { if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MAINLINE_MODULE)) {
mDialog.removeSettingFromScreen(MODULE_VERSION_LABEL_ID);
mDialog.removeSettingFromScreen(MODULE_VERSION_VALUE_ID);
return; return;
} }
final String moduleProvider = mContext.getString( final String moduleProvider = mContext.getString(
com.android.internal.R.string.config_defaultModuleMetadataProvider); com.android.internal.R.string.config_defaultModuleMetadataProvider);
if (!TextUtils.isEmpty(moduleProvider)) { if (!TextUtils.isEmpty(moduleProvider)) {
try { try {
mDialog.setText(MODULE_VERSION_VALUE_ID, mModuleVersion =
mPackageManager.getPackageInfo(moduleProvider, 0 /* flags */).versionName); mPackageManager.getPackageInfo(moduleProvider, 0 /* flags */).versionName;
return; return;
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Failed to get mainline version.", e); Log.e(TAG, "Failed to get mainline version.", e);
mModuleVersion = null;
} }
} }
mDialog.removeSettingFromScreen(MODULE_VERSION_LABEL_ID); }
mDialog.removeSettingFromScreen(MODULE_VERSION_VALUE_ID);
@Override
public CharSequence getSummary() {
return mModuleVersion;
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -22,66 +22,54 @@ import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View;
import androidx.annotation.VisibleForTesting; import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.DeviceInfoUtils; import com.android.settingslib.DeviceInfoUtils;
public class SecurityPatchLevelDialogController implements View.OnClickListener { public class SecurityPatchLevelPreferenceController extends BasePreferenceController {
private static final String TAG = "SecurityPatchCtrl"; private static final String TAG = "SecurityPatchCtrl";
private static final Uri INTENT_URI_DATA = Uri.parse( private static final Uri INTENT_URI_DATA = Uri.parse(
"https://source.android.com/security/bulletin/"); "https://source.android.com/security/bulletin/");
@VisibleForTesting
static final int SECURITY_PATCH_VALUE_ID = R.id.security_patch_level_value;
@VisibleForTesting
static final int SECURITY_PATCH_LABEL_ID = R.id.security_patch_level_label;
private final FirmwareVersionDialogFragment mDialog;
private final Context mContext;
private final PackageManager mPackageManager; private final PackageManager mPackageManager;
private final String mCurrentPatch; private final String mCurrentPatch;
public SecurityPatchLevelDialogController(FirmwareVersionDialogFragment dialog) { public SecurityPatchLevelPreferenceController(Context context, String key) {
mDialog = dialog; super(context, key);
mContext = dialog.getContext();
mPackageManager = mContext.getPackageManager(); mPackageManager = mContext.getPackageManager();
mCurrentPatch = DeviceInfoUtils.getSecurityPatch(); mCurrentPatch = DeviceInfoUtils.getSecurityPatch();
} }
@Override @Override
public void onClick(View v) { public int getAvailabilityStatus() {
return !TextUtils.isEmpty(mCurrentPatch)
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public CharSequence getSummary() {
return mCurrentPatch;
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
return false;
}
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW); intent.setAction(Intent.ACTION_VIEW);
intent.setData(INTENT_URI_DATA); intent.setData(INTENT_URI_DATA);
if (mPackageManager.queryIntentActivities(intent, 0).isEmpty()) { if (mPackageManager.queryIntentActivities(intent, 0).isEmpty()) {
// Don't send out the intent to stop crash // Don't send out the intent to stop crash
Log.w(TAG, "Stop click action on " + SECURITY_PATCH_VALUE_ID + ": " Log.w(TAG, "queryIntentActivities() returns empty");
+ "queryIntentActivities() returns empty"); return true;
return;
} }
mContext.startActivity(intent); mContext.startActivity(intent);
} return true;
/**
* Populates the security patch level field in the dialog and registers click listeners.
*/
public void initialize() {
if (TextUtils.isEmpty(mCurrentPatch)) {
mDialog.removeSettingFromScreen(SECURITY_PATCH_LABEL_ID);
mDialog.removeSettingFromScreen(SECURITY_PATCH_VALUE_ID);
return;
}
registerListeners();
mDialog.setText(SECURITY_PATCH_VALUE_ID, mCurrentPatch);
}
private void registerListeners() {
mDialog.registerClickListener(SECURITY_PATCH_LABEL_ID, this /* listener */);
mDialog.registerClickListener(SECURITY_PATCH_VALUE_ID, this /* listener */);
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,29 +16,26 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import android.content.Context;
import android.os.Build; import android.os.Build;
import android.text.BidiFormatter; import android.text.BidiFormatter;
import androidx.annotation.VisibleForTesting; import com.android.settings.core.BasePreferenceController;
import com.android.settings.R; public class SimpleBuildNumberPreferenceController extends BasePreferenceController {
public class BuildNumberDialogController { public SimpleBuildNumberPreferenceController(Context context,
String preferenceKey) {
@VisibleForTesting super(context, preferenceKey);
static final int BUILD_NUMBER_VALUE_ID = R.id.build_number_value;
private final FirmwareVersionDialogFragment mDialog;
public BuildNumberDialogController(FirmwareVersionDialogFragment dialog) {
mDialog = dialog;
} }
/** @Override
* Updates the build number to the dialog. public int getAvailabilityStatus() {
*/ return AVAILABLE;
public void initialize() { }
mDialog.setText(BUILD_NUMBER_VALUE_ID,
BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY)); @Override
public CharSequence getSummary() {
return BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY);
} }
} }

View File

@@ -80,7 +80,7 @@ public class BatteryFixSlice implements CustomSliceable {
public Slice getSlice() { public Slice getSlice() {
final ListBuilder sliceBuilder = final ListBuilder sliceBuilder =
new ListBuilder(mContext, BATTERY_FIX_SLICE_URI, ListBuilder.INFINITY) new ListBuilder(mContext, BATTERY_FIX_SLICE_URI, ListBuilder.INFINITY)
.setAccentColor(-1); .setAccentColor(COLOR_NOT_TINTED);
// TipType.SUMMARY is battery good // TipType.SUMMARY is battery good
if (UNIMPORTANT_BATTERY_TIPS.contains(readBatteryTipAvailabilityCache(mContext))) { if (UNIMPORTANT_BATTERY_TIPS.contains(readBatteryTipAvailabilityCache(mContext))) {

View File

@@ -142,7 +142,8 @@ public class NotificationChannelSlice implements CustomSliceable {
@Override @Override
public Slice getSlice() { public Slice getSlice() {
final ListBuilder listBuilder = final ListBuilder listBuilder =
new ListBuilder(mContext, getUri(), ListBuilder.INFINITY).setAccentColor(-1); new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
.setAccentColor(COLOR_NOT_TINTED);
/** /**
* Get package which is satisfied with: * Get package which is satisfied with:
* 1. Recently installed. * 1. Recently installed.

View File

@@ -238,8 +238,8 @@ public class ChooseLockGeneric extends SettingsActivity {
UserManager.get(getActivity()), UserManager.get(getActivity()),
getArguments(), getArguments(),
getActivity().getIntent().getExtras()).getIdentifier(); getActivity().getIntent().getExtras()).getIdentifier();
mController = mController = new ChooseLockGenericController(
new ChooseLockGenericController(getContext(), mUserId, mRequestedMinComplexity); getContext(), mUserId, mRequestedMinComplexity, mLockPatternUtils);
if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction) if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction)
&& UserManager.get(getActivity()).isManagedProfile(mUserId) && UserManager.get(getActivity()).isManagedProfile(mUserId)
&& mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) { && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {

View File

@@ -27,6 +27,7 @@ import android.os.UserHandle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R; import com.android.settings.R;
import java.util.ArrayList; import java.util.ArrayList;
@@ -43,12 +44,14 @@ public class ChooseLockGenericController {
@PasswordComplexity private final int mRequestedMinComplexity; @PasswordComplexity private final int mRequestedMinComplexity;
private ManagedLockPasswordProvider mManagedPasswordProvider; private ManagedLockPasswordProvider mManagedPasswordProvider;
private DevicePolicyManager mDpm; private DevicePolicyManager mDpm;
private final LockPatternUtils mLockPatternUtils;
public ChooseLockGenericController(Context context, int userId) { public ChooseLockGenericController(Context context, int userId) {
this( this(
context, context,
userId, userId,
PASSWORD_COMPLEXITY_NONE); PASSWORD_COMPLEXITY_NONE,
new LockPatternUtils(context));
} }
/** /**
@@ -56,13 +59,14 @@ public class ChooseLockGenericController {
* when determining the available screen lock types * when determining the available screen lock types
*/ */
public ChooseLockGenericController(Context context, int userId, public ChooseLockGenericController(Context context, int userId,
@PasswordComplexity int requestedMinComplexity) { @PasswordComplexity int requestedMinComplexity, LockPatternUtils lockPatternUtils) {
this( this(
context, context,
userId, userId,
requestedMinComplexity, requestedMinComplexity,
context.getSystemService(DevicePolicyManager.class), context.getSystemService(DevicePolicyManager.class),
ManagedLockPasswordProvider.get(context, userId)); ManagedLockPasswordProvider.get(context, userId),
lockPatternUtils);
} }
@VisibleForTesting @VisibleForTesting
@@ -71,12 +75,14 @@ public class ChooseLockGenericController {
int userId, int userId,
@PasswordComplexity int requestedMinComplexity, @PasswordComplexity int requestedMinComplexity,
DevicePolicyManager dpm, DevicePolicyManager dpm,
ManagedLockPasswordProvider managedLockPasswordProvider) { ManagedLockPasswordProvider managedLockPasswordProvider,
LockPatternUtils lockPatternUtils) {
mContext = context; mContext = context;
mUserId = userId; mUserId = userId;
mRequestedMinComplexity = requestedMinComplexity; mRequestedMinComplexity = requestedMinComplexity;
mManagedPasswordProvider = managedLockPasswordProvider; mManagedPasswordProvider = managedLockPasswordProvider;
mDpm = dpm; mDpm = dpm;
mLockPatternUtils = lockPatternUtils;
} }
/** /**
@@ -105,6 +111,12 @@ public class ChooseLockGenericController {
&& !managedProfile; // Swipe doesn't make sense for profiles. && !managedProfile; // Swipe doesn't make sense for profiles.
case MANAGED: case MANAGED:
return mManagedPasswordProvider.isManagedPasswordChoosable(); return mManagedPasswordProvider.isManagedPasswordChoosable();
case PIN:
case PATTERN:
case PASSWORD:
// Hide the secure lock screen options if the device doesn't support the secure lock
// screen feature.
return mLockPatternUtils.hasSecureLockScreen();
} }
return true; return true;
} }

View File

@@ -54,6 +54,11 @@ import java.lang.reflect.InvocationTargetException;
*/ */
public interface CustomSliceable extends Sliceable { public interface CustomSliceable extends Sliceable {
/**
* The color representing not to be tinted for the slice.
*/
int COLOR_NOT_TINTED = -1;
/** /**
* @return an complete instance of the {@link Slice}. * @return an complete instance of the {@link Slice}.
*/ */

View File

@@ -371,9 +371,6 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
// Update whether the forget button should be displayed. // Update whether the forget button should be displayed.
mButtonsPref.setButton1Visible(canForgetNetwork()); mButtonsPref.setButton1Visible(canForgetNetwork());
// TODO(b/124700405): Check if showing share button is fine to added for saved network
mButtonsPref.setButton3Visible(false);
} }
private void updateLiveNetworkInfo() { private void updateLiveNetworkInfo() {

View File

@@ -16,26 +16,17 @@
package com.android.settings.wifi.slice; package com.android.settings.wifi.slice;
import android.annotation.ColorInt;
import android.content.Context; import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.net.NetworkInfo.State;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiSsid; import android.net.wifi.WifiSsid;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice; import androidx.slice.Slice;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceRegistry;
import com.android.settings.slices.CustomSliceable; import com.android.settings.slices.CustomSliceable;
import com.android.settingslib.wifi.AccessPoint;
/** /**
* {@link CustomSliceable} for Wi-Fi, used by contextual homepage. * {@link CustomSliceable} for Wi-Fi, used by contextual homepage.
@@ -65,36 +56,6 @@ public class ContextualWifiSlice extends WifiSlice {
// keep showing this card to keep UI stable, even if wifi connects to a network later. // keep showing this card to keep UI stable, even if wifi connects to a network later.
mPreviouslyDisplayed = true; mPreviouslyDisplayed = true;
// Reload theme for switching dark mode on/off
mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
return super.getSlice(); return super.getSlice();
} }
@Override
protected IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) {
final Drawable d = mContext.getDrawable(
com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel()));
@ColorInt int color;
if (accessPoint.isActive()) {
final State state = accessPoint.getNetworkInfo().getState();
if (state == State.CONNECTED) {
color = Utils.getColorAccentDefaultColor(mContext);
} else { // connecting
color = Utils.getDisabled(mContext, Utils.getColorAttrDefaultColor(mContext,
android.R.attr.colorControlNormal));
}
} else {
color = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal);
}
d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
return Utils.createIconWithDrawable(d);
}
@Override
protected int getSliceAccentColor() {
return -1;
}
} }

View File

@@ -26,12 +26,21 @@ import android.app.PendingIntent;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.net.wifi.WifiSsid; import android.net.wifi.WifiSsid;
import android.os.Bundle; import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.IconCompat;
@@ -79,13 +88,15 @@ public class WifiSlice implements CustomSliceable {
@Override @Override
public Slice getSlice() { public Slice getSlice() {
// Reload theme for switching dark mode on/off
mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
final boolean isWifiEnabled = isWifiEnabled(); final boolean isWifiEnabled = isWifiEnabled();
final IconCompat icon = IconCompat.createWithResource(mContext, final IconCompat icon = IconCompat.createWithResource(mContext,
R.drawable.ic_settings_wireless); R.drawable.ic_settings_wireless);
final String title = mContext.getString(R.string.wifi_settings); final String title = mContext.getString(R.string.wifi_settings);
final CharSequence summary = getSummary(); final CharSequence summary = getSummary();
@ColorInt final int color = getSliceAccentColor();
final PendingIntent toggleAction = getBroadcastIntent(mContext); final PendingIntent toggleAction = getBroadcastIntent(mContext);
final PendingIntent primaryAction = getPrimaryAction(); final PendingIntent primaryAction = getPrimaryAction();
final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon, final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
@@ -94,7 +105,7 @@ public class WifiSlice implements CustomSliceable {
null /* actionTitle */, isWifiEnabled); null /* actionTitle */, isWifiEnabled);
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY) final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
.setAccentColor(color) .setAccentColor(COLOR_NOT_TINTED)
.addRow(new ListBuilder.RowBuilder() .addRow(new ListBuilder.RowBuilder()
.setTitle(title) .setTitle(title)
.setSubtitle(summary) .setSubtitle(summary)
@@ -118,8 +129,7 @@ public class WifiSlice implements CustomSliceable {
if (i < apCount) { if (i < apCount) {
listBuilder.addRow(getAccessPointRow(results.get(i))); listBuilder.addRow(getAccessPointRow(results.get(i)));
} else if (needLoadingRow) { } else if (needLoadingRow) {
listBuilder.addRow(new ListBuilder.RowBuilder() listBuilder.addRow(getLoadingRow());
.setTitle(mContext.getText(R.string.wifi_empty_list_wifi_on)));
needLoadingRow = false; needLoadingRow = false;
} else { } else {
listBuilder.addRow(new ListBuilder.RowBuilder() listBuilder.addRow(new ListBuilder.RowBuilder()
@@ -130,11 +140,11 @@ public class WifiSlice implements CustomSliceable {
} }
private ListBuilder.RowBuilder getAccessPointRow(AccessPoint accessPoint) { private ListBuilder.RowBuilder getAccessPointRow(AccessPoint accessPoint) {
final CharSequence title = accessPoint.getConfigName(); final CharSequence title = getAccessPointName(accessPoint);
final IconCompat levelIcon = getAccessPointLevelIcon(accessPoint); final IconCompat levelIcon = getAccessPointLevelIcon(accessPoint);
final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
.setTitleItem(levelIcon, ListBuilder.ICON_IMAGE) .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE)
.setTitle(title) .setSubtitle(title)
.setPrimaryAction(SliceAction.create( .setPrimaryAction(SliceAction.create(
getAccessPointAction(accessPoint), levelIcon, ListBuilder.ICON_IMAGE, getAccessPointAction(accessPoint), levelIcon, ListBuilder.ICON_IMAGE,
title)); title));
@@ -146,14 +156,35 @@ public class WifiSlice implements CustomSliceable {
return rowBuilder; return rowBuilder;
} }
protected IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) { private CharSequence getAccessPointName(AccessPoint accessPoint) {
return IconCompat.createWithResource(mContext, final CharSequence name = accessPoint.getConfigName();
com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); final Spannable span = new SpannableString(name);
@ColorInt final int color = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorPrimary);
span.setSpan(new ForegroundColorSpan(color), 0, name.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return span;
} }
@ColorInt private IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) {
protected int getSliceAccentColor() { final Drawable d = mContext.getDrawable(
return Utils.getColorAccentDefaultColor(mContext); com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel()));
@ColorInt int color;
if (accessPoint.isActive()) {
final NetworkInfo.State state = accessPoint.getNetworkInfo().getState();
if (state == NetworkInfo.State.CONNECTED) {
color = Utils.getColorAccentDefaultColor(mContext);
} else { // connecting
color = Utils.getDisabled(mContext, Utils.getColorAttrDefaultColor(mContext,
android.R.attr.colorControlNormal));
}
} else {
color = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal);
}
d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
return Utils.createIconWithDrawable(d);
} }
private IconCompat getEndIcon(AccessPoint accessPoint) { private IconCompat getEndIcon(AccessPoint accessPoint) {
@@ -190,6 +221,18 @@ public class WifiSlice implements CustomSliceable {
intent, 0 /* flags */); intent, 0 /* flags */);
} }
private ListBuilder.RowBuilder getLoadingRow() {
final CharSequence title = mContext.getText(R.string.wifi_empty_list_wifi_on);
// for aligning to the Wi-Fi AP's name
final IconCompat emptyIcon = Utils.createIconWithDrawable(
new ColorDrawable(Color.TRANSPARENT));
return new ListBuilder.RowBuilder()
.setTitleItem(emptyIcon, ListBuilder.ICON_IMAGE)
.setSubtitle(title);
}
/** /**
* Update the current wifi status to the boolean value keyed by * Update the current wifi status to the boolean value keyed by
* {@link android.app.slice.Slice#EXTRA_TOGGLE_STATE} on {@param intent}. * {@link android.app.slice.Slice#EXTRA_TOGGLE_STATE} on {@param intent}.

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@@ -65,6 +66,8 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
private ImageView mImageView; private ImageView mImageView;
@Mock @Mock
private CachedBluetoothDevice mCachedDevice; private CachedBluetoothDevice mCachedDevice;
@Mock
private BluetoothAdapter mBluetoothAdapter;
private AdvancedBluetoothDetailsHeaderController mController; private AdvancedBluetoothDetailsHeaderController mController;
private LayoutPreference mLayoutPreference; private LayoutPreference mLayoutPreference;
@@ -78,6 +81,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
mLayoutPreference = new LayoutPreference(mContext, mLayoutPreference = new LayoutPreference(mContext,
LayoutInflater.from(mContext).inflate(R.layout.advanced_bt_entity_header, null)); LayoutInflater.from(mContext).inflate(R.layout.advanced_bt_entity_header, null));
mController.mLayoutPreference = mLayoutPreference; mController.mLayoutPreference = mLayoutPreference;
mController.mBluetoothAdapter = mBluetoothAdapter;
when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice); when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice);
} }
@@ -159,6 +163,21 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
verify(mImageView).setImageBitmap(mBitmap); verify(mImageView).setImageBitmap(mBitmap);
} }
@Test
public void onStart_registerCallback() {
mController.onStart();
verify(mBluetoothAdapter).registerMetadataListener(mBluetoothDevice,
mController.mMetadataListener, mController.mHandler);
}
@Test
public void onStop_unregisterCallback() {
mController.onStop();
verify(mBluetoothAdapter).unregisterMetadataListener(mBluetoothDevice);
}
private void assertBatteryLevel(LinearLayout linearLayout, int batteryLevel) { private void assertBatteryLevel(LinearLayout linearLayout, int batteryLevel) {
final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary); final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary);
assertThat(textView.getText().toString()).isEqualTo( assertThat(textView.getText().toString()).isEqualTo(

View File

@@ -17,30 +17,40 @@ package com.android.settings.bluetooth;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.bluetooth.BluetoothDevice;
import android.net.Uri; import android.net.Uri;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class BluetoothFeatureProviderImplTest { public class BluetoothFeatureProviderImplTest {
private static final String PARAMETER_KEY = "addr"; private static final String SETTINGS_URI = "content://test.provider/settings_uri";
private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C";
private BluetoothFeatureProvider mBluetoothFeatureProvider; private BluetoothFeatureProvider mBluetoothFeatureProvider;
@Mock
private BluetoothDevice mBluetoothDevice;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mBluetoothFeatureProvider = new BluetoothFeatureProviderImpl( mBluetoothFeatureProvider = new BluetoothFeatureProviderImpl(
RuntimeEnvironment.application); RuntimeEnvironment.application);
} }
@Test @Test
public void getBluetoothDeviceSettingsUri_containCorrectMacAddress() { public void getBluetoothDeviceSettingsUri_containCorrectMacAddress() {
final Uri uri = mBluetoothFeatureProvider.getBluetoothDeviceSettingsUri(MAC_ADDRESS); when(mBluetoothDevice.getMetadata(
assertThat(uri.getQueryParameterNames()).containsExactly(PARAMETER_KEY); BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI)).thenReturn(SETTINGS_URI);
assertThat(uri.getQueryParameter(PARAMETER_KEY)).isEqualTo(MAC_ADDRESS); final Uri uri = mBluetoothFeatureProvider.getBluetoothDeviceSettingsUri(mBluetoothDevice);
assertThat(uri.toString()).isEqualTo(SETTINGS_URI);
} }
} }

View File

@@ -92,7 +92,7 @@ public class FileEncryptionPreferenceControllerTest {
ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager); ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager);
when(mStorageManager.isConvertibleToFBE()).thenReturn(true); when(mStorageManager.isConvertibleToFBE()).thenReturn(true);
mController.displayPreference(mPreferenceScreen); mController.displayPreference(mPreferenceScreen);
CryptoProperties.type("foobar"); CryptoProperties.type(CryptoProperties.type_values.NONE);
mController.updateState(mPreference); mController.updateState(mPreference);
@@ -106,7 +106,7 @@ public class FileEncryptionPreferenceControllerTest {
ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager); ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager);
when(mStorageManager.isConvertibleToFBE()).thenReturn(true); when(mStorageManager.isConvertibleToFBE()).thenReturn(true);
mController.displayPreference(mPreferenceScreen); mController.displayPreference(mPreferenceScreen);
CryptoProperties.type("file"); CryptoProperties.type(CryptoProperties.type_values.FILE);
mController.updateState(mPreference); mController.updateState(mPreference);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,15 +16,12 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController import static com.android.settings.core.BasePreferenceController.AVAILABLE;
.BASEBAND_PROPERTY; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionPreferenceController.BASEBAND_PROPERTY;
.BASEBAND_VERSION_LABEL_ID;
import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController import static com.google.common.truth.Truth.assertThat;
.BASEBAND_VERSION_VALUE_ID;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.shadow.api.Shadow.extract; import static org.robolectric.shadow.api.Shadow.extract;
import android.content.Context; import android.content.Context;
@@ -36,7 +33,6 @@ import com.android.settings.testutils.shadow.ShadowConnectivityManager;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@@ -44,44 +40,35 @@ import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowConnectivityManager.class) @Config(shadows = ShadowConnectivityManager.class)
public class BasebandVersionDialogControllerTest { public class BasebandVersionPreferenceControllerTest {
@Mock
private FirmwareVersionDialogFragment mDialog;
private Context mContext; private Context mContext;
private BasebandVersionDialogController mController; private BasebandVersionPreferenceController mController;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
when(mDialog.getContext()).thenReturn(mContext); mController = new BasebandVersionPreferenceController(mContext, "key");
mController = new BasebandVersionDialogController(mDialog);
} }
@Test @Test
public void initialize_wifiOnly_shouldRemoveSettingFromDialog() { public void getAvailability_wifiOnly_unavailable() {
ShadowConnectivityManager connectivityManager = final ShadowConnectivityManager connectivityManager =
extract(mContext.getSystemService(ConnectivityManager.class)); extract(mContext.getSystemService(ConnectivityManager.class));
connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, false); connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, false);
mController.initialize(); assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
verify(mDialog).removeSettingFromScreen(BASEBAND_VERSION_LABEL_ID);
verify(mDialog).removeSettingFromScreen(BASEBAND_VERSION_VALUE_ID);
} }
@Test @Test
public void initialize_hasMobile_shouldSetDialogTextToBasebandVersion() { public void getAvailability_hasMobile_available() {
final String text = "test"; final String text = "test";
SystemProperties.set(BASEBAND_PROPERTY, text); SystemProperties.set(BASEBAND_PROPERTY, text);
ShadowConnectivityManager connectivityManager = ShadowConnectivityManager connectivityManager =
extract(mContext.getSystemService(ConnectivityManager.class)); extract(mContext.getSystemService(ConnectivityManager.class));
connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, true); connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, true);
mController.initialize(); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
verify(mDialog).setText(BASEBAND_VERSION_VALUE_ID, text);
} }
} }

View File

@@ -1,55 +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.deviceinfo.firmwareversion;
import static com.android.settings.deviceinfo.firmwareversion.BuildNumberDialogController
.BUILD_NUMBER_VALUE_ID;
import static org.mockito.Mockito.verify;
import android.os.Build;
import android.text.BidiFormatter;
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;
@RunWith(RobolectricTestRunner.class)
public class BuildNumberDialogControllerTest {
@Mock
private FirmwareVersionDialogFragment mDialog;
private BuildNumberDialogController mController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mController = new BuildNumberDialogController(mDialog);
}
@Test
public void initialize_shouldUpdateBuildNumberToDialog() {
mController.initialize();
verify(mDialog)
.setText(BUILD_NUMBER_VALUE_ID, BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY));
}
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,13 +16,9 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import static com.android.settings.deviceinfo.firmwareversion.FirmwareVersionDialogController import static com.google.common.truth.Truth.assertThat;
.FIRMWARE_VERSION_LABEL_ID;
import static com.android.settings.deviceinfo.firmwareversion.FirmwareVersionDialogController
.FIRMWARE_VERSION_VALUE_ID;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@@ -32,7 +28,8 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.UserManager; import android.os.UserManager;
import android.view.View;
import androidx.preference.Preference;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -44,36 +41,30 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class FirmwareVersionDialogControllerTest { public class FirmwareVersionDetailPreferenceControllerTest {
@Mock @Mock
private UserManager mUserManager; private UserManager mUserManager;
@Mock
private FirmwareVersionDialogFragment mDialog;
@Mock
private View mView;
private Preference mPreference;
private Context mContext; private Context mContext;
private FirmwareVersionDialogController mController; private FirmwareVersionDetailPreferenceController mController;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
when(mDialog.getContext()).thenReturn(mContext); mController = spy(new TestController(mContext, "key"));
mController = spy(new FirmwareVersionDialogController(mDialog));
ReflectionHelpers.setField(mController, "mUserManager", mUserManager); ReflectionHelpers.setField(mController, "mUserManager", mUserManager);
doNothing().when(mController).arrayCopy();
doNothing().when(mController).initializeAdminPermissions(); mPreference = new Preference(mContext);
mPreference.setKey(mController.getPreferenceKey());
} }
@Test @Test
public void initialize_shouldRegisterListenersAndSetBuildVersion() { public void getSummary_shouldGetBuildVersion() {
mController.initialize(); assertThat(mController.getSummary()).isEqualTo(Build.VERSION.RELEASE);
verify(mDialog).registerClickListener(eq(FIRMWARE_VERSION_VALUE_ID), any());
verify(mDialog).registerClickListener(eq(FIRMWARE_VERSION_LABEL_ID), any());
verify(mDialog).setText(FIRMWARE_VERSION_VALUE_ID, Build.VERSION.RELEASE);
} }
@Test @Test
@@ -82,7 +73,7 @@ public class FirmwareVersionDialogControllerTest {
hits[0] = Long.MAX_VALUE; hits[0] = Long.MAX_VALUE;
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)).thenReturn(true); when(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)).thenReturn(true);
mController.onClick(mView); mController.handlePreferenceTreeClick(mPreference);
verify(mContext, never()).startActivity(any()); verify(mContext, never()).startActivity(any());
} }
@@ -93,8 +84,19 @@ public class FirmwareVersionDialogControllerTest {
hits[0] = Long.MAX_VALUE; hits[0] = Long.MAX_VALUE;
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)).thenReturn(false); when(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)).thenReturn(false);
mController.onClick(mView); mController.handlePreferenceTreeClick(mPreference);
verify(mContext).startActivity(any()); verify(mContext).startActivity(any());
} }
private static class TestController extends FirmwareVersionDetailPreferenceController {
public TestController(Context context, String key) {
super(context, key);
}
@Override
void initializeAdminPermissions() {
}
}
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,42 +16,29 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import static android.content.Context.CLIPBOARD_SERVICE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class FirmwareVersionPreferenceControllerTest { public class FirmwareVersionPreferenceControllerTest {
private static final String KEY = "firmware_version"; private static final String KEY = "firmware_version";
@Mock
private Fragment mFragment;
private Preference mPreference; private Preference mPreference;
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
private FirmwareVersionPreferenceController mController; private FirmwareVersionPreferenceController mController;
@@ -62,22 +49,16 @@ public class FirmwareVersionPreferenceControllerTest {
final Context context = RuntimeEnvironment.application; final Context context = RuntimeEnvironment.application;
final PreferenceManager preferenceManager = new PreferenceManager(context); final PreferenceManager preferenceManager = new PreferenceManager(context);
mController = new FirmwareVersionPreferenceController(context, KEY); mController = new FirmwareVersionPreferenceController(context, KEY);
mController.setHost(mFragment);
mPreference = new Preference(context); mPreference = new Preference(context);
mPreference.setKey(KEY); mPreference.setKey(KEY);
mScreen = preferenceManager.createPreferenceScreen(context); mScreen = preferenceManager.createPreferenceScreen(context);
mScreen.addPreference(mPreference); mScreen.addPreference(mPreference);
} }
@After
public void tearDown() {
ShadowFirmwareVersionDialogFragment.reset();
}
@Test @Test
public void firmwareVersion_shouldAlwaysBeShown() { public void firmwareVersion_shouldAlwaysBeShown() {
assertThat(mController.getAvailabilityStatus()).isEqualTo( assertThat(mController.getAvailabilityStatus())
BasePreferenceController.AVAILABLE); .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
} }
@Test @Test
@@ -86,55 +67,4 @@ public class FirmwareVersionPreferenceControllerTest {
assertThat(mPreference.getSummary()).isEqualTo(Build.VERSION.RELEASE); assertThat(mPreference.getSummary()).isEqualTo(Build.VERSION.RELEASE);
} }
@Test
@Config(shadows = ShadowFirmwareVersionDialogFragment.class)
public void handlePreferenceTreeClick_samePreferenceKey_shouldStartDialogFragment() {
final boolean result = mController.handlePreferenceTreeClick(mPreference);
assertThat(ShadowFirmwareVersionDialogFragment.isShowing).isTrue();
assertThat(result).isTrue();
}
@Test
public void handlePreferenceTreeClick_unknownPreferenceKey_shouldDoNothingAndReturnFalse() {
mPreference.setKey("foobar");
final boolean result = mController.handlePreferenceTreeClick(mPreference);
assertThat(ShadowFirmwareVersionDialogFragment.isShowing).isFalse();
assertThat(result).isFalse();
}
@Test
public void isSliceable_shouldBeTrue() {
assertThat(mController.isSliceable()).isTrue();
}
@Test
public void copy_shouldCopyVersionNumberToClipboard() {
mController.copy();
final Context context = RuntimeEnvironment.application;
final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(
CLIPBOARD_SERVICE);
final CharSequence data = clipboard.getPrimaryClip().getItemAt(0).getText();
assertThat(data.toString()).isEqualTo(Build.VERSION.RELEASE);
}
@Implements(FirmwareVersionDialogFragment.class)
public static class ShadowFirmwareVersionDialogFragment {
private static boolean isShowing = false;
@Implementation
public static void show(Fragment fragemnt) {
isShowing = true;
}
@Resetter
public static void reset() {
isShowing = false;
}
}
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,11 +16,7 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import static com.android.settings.deviceinfo.firmwareversion.KernelVersionDialogController import static com.google.common.truth.Truth.assertThat;
.KERNEL_VERSION_VALUE_ID;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
@@ -29,33 +25,27 @@ import com.android.settingslib.DeviceInfoUtils;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class KernelVersionDialogControllerTest { public class KernelVersionPreferenceControllerTest {
@Mock
private FirmwareVersionDialogFragment mDialog;
private Context mContext; private Context mContext;
private KernelVersionDialogController mController; private KernelVersionPreferenceController mController;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
when(mDialog.getContext()).thenReturn(mContext); mController = new KernelVersionPreferenceController(mContext, "key");
mController = new KernelVersionDialogController(mDialog);
} }
@Test @Test
public void initialize_shouldUpdateKernelVersionToDialog() { public void getSummary_shouldGetKernalVersion() {
mController.initialize(); assertThat(mController.getSummary()).isEqualTo(
DeviceInfoUtils.getFormattedKernelVersion(mContext));
verify(mDialog)
.setText(KERNEL_VERSION_VALUE_ID, DeviceInfoUtils.getFormattedKernelVersion(mContext));
} }
} }

View File

@@ -16,10 +16,14 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
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 static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
@@ -38,78 +42,75 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class ModuleVersionDialogControllerTest { public class MainlineModuleVersionPreferenceControllerTest {
@Mock
private FirmwareVersionDialogFragment mDialog;
@Mock @Mock
private PackageManager mPackageManager; private PackageManager mPackageManager;
private Context mContext; private Context mContext;
private ModuleVersionDialogController mController;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
when(mDialog.getContext()).thenReturn(mContext);
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
mController = new ModuleVersionDialogController(mDialog);
FeatureFlagUtils.setEnabled(mContext, FeatureFlags.MAINLINE_MODULE, true); FeatureFlagUtils.setEnabled(mContext, FeatureFlags.MAINLINE_MODULE, true);
} }
@Test @Test
public void initialize_featureDisabled_shouldRemoveSettingFromDialog() { public void getAvailabilityStatus_featureDisabled_unavailable() {
FeatureFlagUtils.setEnabled(mContext, FeatureFlags.MAINLINE_MODULE, false); FeatureFlagUtils.setEnabled(mContext, FeatureFlags.MAINLINE_MODULE, false);
mController.initialize(); final MainlineModuleVersionPreferenceController controller =
new MainlineModuleVersionPreferenceController(mContext, "key");
verify(mDialog).removeSettingFromScreen(mController.MODULE_VERSION_LABEL_ID); assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
verify(mDialog).removeSettingFromScreen(mController.MODULE_VERSION_VALUE_ID);
} }
@Test @Test
public void initialize_noMainlineModuleProvider_shouldRemoveSettingFromDialog() { public void getAvailabilityStatus_noMainlineModuleProvider_unavailable() {
when(mContext.getString( when(mContext.getString(
com.android.internal.R.string.config_defaultModuleMetadataProvider)).thenReturn(null); com.android.internal.R.string.config_defaultModuleMetadataProvider)).thenReturn(
null);
mController.initialize(); final MainlineModuleVersionPreferenceController controller =
new MainlineModuleVersionPreferenceController(mContext, "key");
verify(mDialog).removeSettingFromScreen(mController.MODULE_VERSION_LABEL_ID); assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
verify(mDialog).removeSettingFromScreen(mController.MODULE_VERSION_VALUE_ID);
} }
@Test @Test
public void initialize_noMainlineModulePackageInfo_shouldRemoveSettingFromDialog() public void getAvailabilityStatus_noMainlineModulePackageInfo_unavailable() throws Exception {
throws PackageManager.NameNotFoundException {
final String provider = "test.provider"; final String provider = "test.provider";
when(mContext.getString( when(mContext.getString(
com.android.internal.R.string.config_defaultModuleMetadataProvider)) com.android.internal.R.string.config_defaultModuleMetadataProvider))
.thenReturn(provider); .thenReturn(provider);
when(mPackageManager.getPackageInfo(eq(provider), anyInt())) when(mPackageManager.getPackageInfo(eq(provider), anyInt()))
.thenThrow(new PackageManager.NameNotFoundException()); .thenThrow(new PackageManager.NameNotFoundException());
mController.initialize(); final MainlineModuleVersionPreferenceController controller =
new MainlineModuleVersionPreferenceController(mContext, "key");
verify(mDialog).removeSettingFromScreen(mController.MODULE_VERSION_LABEL_ID); assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
verify(mDialog).removeSettingFromScreen(mController.MODULE_VERSION_VALUE_ID);
} }
@Test @Test
public void initialize_hasMainlineModulePackageInfo_shouldshouldSetDialogTextToMainlineVersion() public void getAvailabilityStatus_hasMainlineModulePackageInfo_available() throws Exception {
throws PackageManager.NameNotFoundException {
final String provider = "test.provider"; final String provider = "test.provider";
final String version = "test version 123"; final String version = "test version 123";
final PackageInfo info = new PackageInfo(); final PackageInfo info = new PackageInfo();
info.versionName = version; info.versionName = version;
when(mContext.getString( when(mContext.getString(
com.android.internal.R.string.config_defaultModuleMetadataProvider)) com.android.internal.R.string.config_defaultModuleMetadataProvider))
.thenReturn(provider); .thenReturn(provider);
when(mPackageManager.getPackageInfo(eq(provider), anyInt())).thenReturn(info); when(mPackageManager.getPackageInfo(eq(provider), anyInt())).thenReturn(info);
mController.initialize(); final MainlineModuleVersionPreferenceController controller =
new MainlineModuleVersionPreferenceController(mContext, "key");
verify(mDialog).setText(mController.MODULE_VERSION_VALUE_ID, version); assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,14 +16,13 @@
package com.android.settings.deviceinfo.firmwareversion; package com.android.settings.deviceinfo.firmwareversion;
import static com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelDialogController import static com.android.settings.core.BasePreferenceController.AVAILABLE;
.SECURITY_PATCH_LABEL_ID; import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
import static com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelDialogController
.SECURITY_PATCH_VALUE_ID; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -33,7 +32,8 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.view.View;
import androidx.preference.Preference;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -47,55 +47,47 @@ import org.robolectric.util.ReflectionHelpers;
import java.util.Collections; import java.util.Collections;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class SecurityPatchLevelDialogControllerTest { public class SecurityPatchLevelPreferenceControllerTest {
@Mock @Mock
private PackageManager mPackageManager; private PackageManager mPackageManager;
@Mock
private FirmwareVersionDialogFragment mDialog;
@Mock
private View mView;
private Context mContext; private Context mContext;
private SecurityPatchLevelDialogController mController; private SecurityPatchLevelPreferenceController mController;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(Robolectric.setupActivity(Activity.class)); mContext = spy(Robolectric.setupActivity(Activity.class));
when(mDialog.getContext()).thenReturn(mContext);
} }
@Test @Test
public void initialize_noPatchInfo_shouldRemoveSettingFromDialog() { public void getAvailabilityStatus_noPatchInfo_unavailable() {
ReflectionHelpers.setStaticField(Build.VERSION.class, "SECURITY_PATCH", ""); ReflectionHelpers.setStaticField(Build.VERSION.class, "SECURITY_PATCH", "");
mController = new SecurityPatchLevelDialogController(mDialog); mController = new SecurityPatchLevelPreferenceController(mContext, "key");
mController.initialize(); assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
verify(mDialog).removeSettingFromScreen(SECURITY_PATCH_VALUE_ID);
verify(mDialog).removeSettingFromScreen(SECURITY_PATCH_LABEL_ID);
} }
@Test @Test
public void initialize_patchInfoAvailable_shouldRegisterListeners() { public void getAvailabilityStatus_hasPatchInfo_available() {
ReflectionHelpers.setStaticField(Build.VERSION.class, "SECURITY_PATCH", "foobar"); ReflectionHelpers.setStaticField(Build.VERSION.class, "SECURITY_PATCH", "foobar");
mController = new SecurityPatchLevelDialogController(mDialog); mController = new SecurityPatchLevelPreferenceController(mContext, "key");
mController.initialize(); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
verify(mDialog).registerClickListener(eq(SECURITY_PATCH_LABEL_ID), any());
verify(mDialog).registerClickListener(eq(SECURITY_PATCH_VALUE_ID), any());
} }
@Test @Test
public void onClick_noActivityIntent_shouldDoNothing() { public void onClick_noActivityIntent_shouldDoNothing() {
when(mPackageManager.queryIntentActivities(any(), anyInt())) when(mPackageManager.queryIntentActivities(any(), anyInt()))
.thenReturn(Collections.emptyList()); .thenReturn(Collections.emptyList());
mController = new SecurityPatchLevelDialogController(mDialog); mController = new SecurityPatchLevelPreferenceController(mContext, "key");
ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager); ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager);
mController.onClick(mView); final Preference pref = new Preference(mContext);
pref.setKey(mController.getPreferenceKey());
mController.handlePreferenceTreeClick(pref);
verify(mContext, never()).startActivity(any()); verify(mContext, never()).startActivity(any());
} }
@@ -104,10 +96,14 @@ public class SecurityPatchLevelDialogControllerTest {
public void onClick_activityIntentFound_shouldStartActivity() { public void onClick_activityIntentFound_shouldStartActivity() {
when(mPackageManager.queryIntentActivities(any(), anyInt())) when(mPackageManager.queryIntentActivities(any(), anyInt()))
.thenReturn(Collections.singletonList(null)); .thenReturn(Collections.singletonList(null));
mController = new SecurityPatchLevelDialogController(mDialog);
mController = new SecurityPatchLevelPreferenceController(mContext, "key");
ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager); ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager);
mController.onClick(mView); final Preference pref = new Preference(mContext);
pref.setKey(mController.getPreferenceKey());
mController.handlePreferenceTreeClick(pref);
verify(mContext).startActivity(any()); verify(mContext).startActivity(any());
} }

View File

@@ -34,6 +34,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.admin.DevicePolicyManager.PasswordComplexity;
import android.content.ComponentName; import android.content.ComponentName;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
@@ -61,10 +62,14 @@ public class ChooseLockGenericControllerTest {
@Mock @Mock
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
@Mock
private LockPatternUtils mLockPatternUtils;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mLockPatternUtils.hasSecureLockScreen()).thenReturn(true);
mController = createController(PASSWORD_COMPLEXITY_NONE); mController = createController(PASSWORD_COMPLEXITY_NONE);
SettingsShadowResources.overrideResource(R.bool.config_hide_none_security_option, false); SettingsShadowResources.overrideResource(R.bool.config_hide_none_security_option, false);
SettingsShadowResources.overrideResource(R.bool.config_hide_swipe_security_option, false); SettingsShadowResources.overrideResource(R.bool.config_hide_swipe_security_option, false);
@@ -266,6 +271,7 @@ public class ChooseLockGenericControllerTest {
0 /* userId */, 0 /* userId */,
minPasswordComplexity, minPasswordComplexity,
mDevicePolicyManager, mDevicePolicyManager,
mManagedLockPasswordProvider); mManagedLockPasswordProvider,
mLockPatternUtils);
} }
} }

View File

@@ -33,6 +33,7 @@ import androidx.fragment.app.FragmentActivity;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener; import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -43,7 +44,7 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.androidx.fragment.FragmentController; import org.robolectric.shadows.androidx.fragment.FragmentController;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowAlertDialogCompat.class) @Config(shadows = {ShadowAlertDialogCompat.class, ShadowLockPatternUtils.class})
public class ChooseLockTypeDialogFragmentTest { public class ChooseLockTypeDialogFragmentTest {
private Context mContext; private Context mContext;

View File

@@ -34,6 +34,7 @@ import com.android.settings.password.ChooseLockPassword.IntentBuilder;
import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment; import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settings.widget.ScrollToParentEditText; import com.android.settings.widget.ScrollToParentEditText;
@@ -57,7 +58,13 @@ import java.util.Collections;
import java.util.List; import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {SettingsShadowResources.class, ShadowUtils.class, ShadowAlertDialogCompat.class}) @Config(
shadows = {
SettingsShadowResources.class,
ShadowLockPatternUtils.class,
ShadowUtils.class,
ShadowAlertDialogCompat.class
})
public class SetupChooseLockPasswordTest { public class SetupChooseLockPasswordTest {
@Before @Before

View File

@@ -38,6 +38,7 @@ import com.android.settings.SetupRedactionInterstitial;
import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment; import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment;
import com.android.settings.password.ChooseLockPattern.IntentBuilder; import com.android.settings.password.ChooseLockPattern.IntentBuilder;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settings.testutils.shadow.ShadowUtils;
import com.google.android.setupcompat.PartnerCustomizationLayout; import com.google.android.setupcompat.PartnerCustomizationLayout;
@@ -57,7 +58,7 @@ import org.robolectric.util.ReflectionHelpers.ClassParameter;
import java.util.Arrays; import java.util.Arrays;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class}) @Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class, ShadowLockPatternUtils.class})
public class SetupChooseLockPatternTest { public class SetupChooseLockPatternTest {
private SetupChooseLockPattern mActivity; private SetupChooseLockPattern mActivity;

View File

@@ -238,22 +238,38 @@ public class SliceTester {
* @param title Title for asserting. * @param title Title for asserting.
*/ */
public static void assertAnySliceItemContainsTitle(List<SliceItem> sliceItems, String title) { public static void assertAnySliceItemContainsTitle(List<SliceItem> sliceItems, String title) {
boolean hasTitle = false; assertThat(hasText(sliceItems, title, HINT_TITLE)).isTrue();
}
/**
* Assert any slice item contains subtitle.
*
* @param sliceItems All slice items of a Slice.
* @param subtitle Subtitle for asserting.
*/
public static void assertAnySliceItemContainsSubtitle(List<SliceItem> sliceItems,
String subtitle) {
// Subtitle has no hints
assertThat(hasText(sliceItems, subtitle, null /* hints */)).isTrue();
}
private static boolean hasText(List<SliceItem> sliceItems, String text, String hints) {
boolean hasText = false;
for (SliceItem item : sliceItems) { for (SliceItem item : sliceItems) {
List<SliceItem> titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, List<SliceItem> textItems = SliceQuery.findAll(item, FORMAT_TEXT, hints,
null /* non-hints */); null /* non-hints */);
if (titleItems == null) { if (textItems == null) {
continue; continue;
} }
for (SliceItem subTitleItem : titleItems) { for (SliceItem textItem : textItems) {
if (TextUtils.equals(subTitleItem.getText(), title)) { if (TextUtils.equals(textItem.getText(), text)) {
hasTitle = true; hasText = true;
break; break;
} }
} }
} }
assertThat(hasTitle).isTrue(); return hasText;
} }
private static void assertKeywords(SliceMetadata metadata, SliceData data) { private static void assertKeywords(SliceMetadata metadata, SliceData data) {

View File

@@ -31,6 +31,11 @@ public class ShadowLockPatternUtils {
private static boolean sDeviceEncryptionEnabled; private static boolean sDeviceEncryptionEnabled;
@Implementation
protected boolean hasSecureLockScreen() {
return true;
}
@Implementation @Implementation
protected boolean isSecure(int id) { protected boolean isSecure(int id) {
return true; return true;

View File

@@ -118,7 +118,7 @@ public class WifiSliceTest {
// All AP rows + title row // All AP rows + title row
assertThat(rows).isEqualTo(DEFAULT_EXPANDED_ROW_COUNT + 1); assertThat(rows).isEqualTo(DEFAULT_EXPANDED_ROW_COUNT + 1);
// Has scanning text // Has scanning text
SliceTester.assertAnySliceItemContainsTitle(sliceItems, SliceTester.assertAnySliceItemContainsSubtitle(sliceItems,
mContext.getString(R.string.wifi_empty_list_wifi_on)); mContext.getString(R.string.wifi_empty_list_wifi_on));
} }