diff --git a/res/values/strings.xml b/res/values/strings.xml index d938611fc19..65ce5a5aff3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -838,7 +838,11 @@ Use your face to unlock your phone, authorize purchases, or sign in to apps. - Allow your child to use their face to unlock their phone or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more. + Using your child\u2019s face to unlock their phone may be less secure than a strong pattern or PIN. + + Using your child\u2019s face to unlock their tablet may be less secure than a strong pattern or PIN. + + Using your child\u2019s face to unlock their device may be less secure than a strong pattern or PIN. Use your face to unlock your phone or approve purchases.\n\nNote: You can\u2019t use your face to unlock this device. For more information, contact your organization\u2019s admin. @@ -1022,7 +1026,11 @@ You and your child can delete their fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until they\u2019re deleted. - Your phone can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger. + Your phone can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger. + + Your tablet can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger. + + Your device can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger. Your child\u2019s phone can be unlocked when they don\u2019t intend to, like if someone holds it up to their finger. @@ -1163,11 +1171,11 @@ Fingerprint added - Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps + Fingerprint Unlock improves the more you use it to unlock your tablet or verify it\u2019s you in apps - Now you can use your fingerprint to unlock your device or verify it\u2019s you, like when you sign in to apps + Fingerprint Unlock improves the more you use it to unlock your device or verify it\u2019s you in apps - Now you can use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps + Fingerprint Unlock improves the more you use it to unlock your phone or verify it\u2019s you in apps Do it later diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java index 60faab932f9..7003eed252b 100644 --- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java +++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java @@ -180,10 +180,11 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl | AuthenticatorException e) { // handled below Log.w(TAG, "Remove account error: " + e); - RemoveAccountFailureDialog.show(getTargetFragment()); } Log.i(TAG, "failed: " + failed); - if (!failed) { + if (failed) { + RemoveAccountFailureDialog.show(getTargetFragment()); + } else { targetActivity.finish(); } }, null, mUserHandle); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index e42574f7b6b..46ea7f42351 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -799,10 +799,12 @@ public class FingerprintSettings extends SubSettings { public Dialog onCreateDialog(Bundle savedInstanceState) { mFp = getArguments().getParcelable(KEY_FINGERPRINT); final String title = getString(R.string.fingerprint_delete_title, mFp.getName()); + final String message = + getString(R.string.fingerprint_v2_delete_message, mFp.getName()); mAlertDialog = new AlertDialog.Builder(getActivity()) .setTitle(title) - .setMessage(R.string.fingerprint_delete_message) + .setMessage(message) .setPositiveButton( R.string.security_settings_fingerprint_enroll_dialog_delete, this /* onClickListener */) @@ -967,6 +969,10 @@ public class FingerprintSettings extends SubSettings { final boolean isProfileChallengeUser = getArguments().getBoolean("isProfileChallengeUser"); + final String title = getString(R.string.fingerprint_delete_title, mFp.getName()); + final String message = + getString(R.string.fingerprint_v2_delete_message, mFp.getName()); + DevicePolicyManager devicePolicyManager = getContext().getSystemService(DevicePolicyManager.class); String messageId = @@ -977,10 +983,12 @@ public class FingerprintSettings extends SubSettings { : R.string.fingerprint_last_delete_message; final AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) - .setTitle(R.string.fingerprint_last_delete_title) + .setTitle(title) .setMessage(devicePolicyManager.getResources().getString( - messageId, () -> getContext().getString(defaultMessageId))) - .setPositiveButton(R.string.fingerprint_last_delete_confirm, + messageId, + () -> message + "\n\n" + getContext().getString(defaultMessageId))) + .setPositiveButton( + R.string.security_settings_fingerprint_enroll_dialog_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java index a9ac2868878..c118a43131d 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java @@ -22,6 +22,7 @@ import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.content.Context; +import android.content.res.TypedArray; import android.net.Uri; import android.os.Bundle; import android.provider.DeviceConfig; @@ -49,7 +50,6 @@ import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; -import java.util.IllegalFormatException; import java.util.List; public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment { @@ -136,7 +136,6 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment use(BlockingSlicePrefController.class).setSliceUri(sliceEnabled ? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice()) : null); - updateExtraControlUri(/* viewWidth */ 0); } private void updateExtraControlUri(int viewWidth) { @@ -148,13 +147,14 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment String uri = featureProvider.getBluetoothDeviceControlUri(mCachedDevice.getDevice()); if (!TextUtils.isEmpty(uri)) { try { - controlUri = Uri.parse(String.format(uri, viewWidth)); - } catch (IllegalFormatException | NullPointerException exception) { + controlUri = Uri.parse(uri + viewWidth); + } catch (NullPointerException exception) { Log.d(TAG, "unable to parse uri"); controlUri = null; } } use(SlicePreferenceController.class).setSliceUri(sliceEnabled ? controlUri : null); + use(SlicePreferenceController.class).onStart(); } private final ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener = @@ -165,7 +165,10 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment if (view == null) { return; } - updateExtraControlUri(view.getWidth()); + if (view.getWidth() <= 0) { + return; + } + updateExtraControlUri(view.getWidth() - getPaddingSize()); view.getViewTreeObserver().removeOnGlobalLayoutListener( mOnGlobalLayoutListener); } @@ -251,4 +254,17 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment } return controllers; } + + private int getPaddingSize() { + TypedArray resolvedAttributes = + getContext().obtainStyledAttributes( + new int[]{ + android.R.attr.listPreferredItemPaddingStart, + android.R.attr.listPreferredItemPaddingEnd + }); + int width = resolvedAttributes.getDimensionPixelSize(0, 0) + + resolvedAttributes.getDimensionPixelSize(1, 0); + resolvedAttributes.recycle(); + return width; + } } diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java index 98939cfe14c..08884d5621f 100644 --- a/src/com/android/settings/panel/VolumePanel.java +++ b/src/com/android/settings/panel/VolumePanel.java @@ -26,6 +26,7 @@ import static com.android.settings.slices.CustomSliceRegistry.VOLUME_CALL_URI; import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI; import static com.android.settings.slices.CustomSliceRegistry.VOLUME_RINGER_URI; +import android.app.Activity; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; @@ -49,7 +50,6 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.android.settingslib.media.MediaOutputConstants; import java.util.ArrayList; -import java.util.IllegalFormatException; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; @@ -64,6 +64,7 @@ public class VolumePanel implements PanelContent, LifecycleObserver { private PanelContentCallback mCallback; private LocalBluetoothProfileManager mProfileManager; + private int mControlSliceWidth; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -80,6 +81,14 @@ public class VolumePanel implements PanelContent, LifecycleObserver { private VolumePanel(Context context) { mContext = context.getApplicationContext(); + if (context instanceof Activity) { + int panelWidth = + ((Activity) context).getWindowManager().getCurrentWindowMetrics().getBounds() + .width(); + // The control slice width = panel width - two left and right horizontal paddings + mControlSliceWidth = panelWidth - context.getResources().getDimensionPixelSize( + R.dimen.panel_slice_Horizontal_padding) * 2; + } final FutureTask localBtManagerFutureTask = new FutureTask<>( // Avoid StrictMode ThreadPolicy violation @@ -102,8 +111,7 @@ public class VolumePanel implements PanelContent, LifecycleObserver { public void onResume() { final IntentFilter filter = new IntentFilter(); filter.addAction(MediaOutputConstants.ACTION_CLOSE_PANEL); - mContext.registerReceiver(mReceiver, filter, - Context.RECEIVER_EXPORTED_UNAUDITED); + mContext.registerReceiver(mReceiver, filter, Context.RECEIVER_EXPORTED_UNAUDITED); } /** Invoked when the panel is paused. */ @@ -159,13 +167,11 @@ public class VolumePanel implements PanelContent, LifecycleObserver { Uri controlUri = null; final BluetoothDevice bluetoothDevice = findActiveDevice(); if (bluetoothDevice != null) { - final int width = mContext.getResources().getDimensionPixelSize( - R.dimen.settings_panel_width); final String uri = BluetoothUtils.getControlUriMetaData(bluetoothDevice); if (!TextUtils.isEmpty(uri)) { try { - controlUri = Uri.parse(String.format(uri, width)); - } catch (IllegalFormatException | NullPointerException exception) { + controlUri = Uri.parse(uri + mControlSliceWidth); + } catch (NullPointerException exception) { Log.d(TAG, "unable to parse uri"); controlUri = null; }