1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.car.settings.security; 18 19 import android.app.admin.DevicePolicyManager; 20 import android.os.Bundle; 21 import android.os.UserHandle; 22 import android.text.TextUtils; 23 24 import androidx.car.widget.ListItem; 25 import androidx.car.widget.ListItemProvider; 26 import androidx.car.widget.TextListItem; 27 28 import com.android.car.settings.R; 29 import com.android.car.settings.common.BaseFragment; 30 import com.android.car.settings.common.ListItemSettingsFragment; 31 import com.android.internal.widget.LockPatternUtils; 32 33 import java.util.ArrayList; 34 import java.util.List; 35 36 /** 37 * Give user choices of lock screen type: Pin/Pattern/Password or None. 38 */ 39 public class ChooseLockTypeFragment extends ListItemSettingsFragment { 40 41 public static final String EXTRA_CURRENT_PASSWORD_QUALITY = "extra_current_password_quality"; 42 private static final String DIALOG_TAG = "ConfirmRemoveScreenLockDialog"; 43 44 private ListItemProvider mItemProvider; 45 private String mCurrPassword; 46 private int mPasswordQuality; 47 48 private final ConfirmRemoveScreenLockDialog.ConfirmRemoveLockListener mConfirmListener = () -> { 49 int userId = UserHandle.myUserId(); 50 new LockPatternUtils(getContext()).clearLock(mCurrPassword, userId); 51 getFragmentController().goBack(); 52 }; 53 newInstance()54 public static ChooseLockTypeFragment newInstance() { 55 ChooseLockTypeFragment chooseLockTypeFragment = new ChooseLockTypeFragment(); 56 Bundle bundle = ListItemSettingsFragment.getBundle(); 57 bundle.putInt(EXTRA_TITLE_ID, R.string.lock_settings_picker_title); 58 bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button); 59 chooseLockTypeFragment.setArguments(bundle); 60 return chooseLockTypeFragment; 61 } 62 63 @Override onCreate(Bundle savedInstanceState)64 public void onCreate(Bundle savedInstanceState) { 65 super.onCreate(savedInstanceState); 66 Bundle args = getArguments(); 67 if (args != null) { 68 mCurrPassword = args.getString(SettingsScreenLockActivity.EXTRA_CURRENT_SCREEN_LOCK); 69 mPasswordQuality = args.getInt(EXTRA_CURRENT_PASSWORD_QUALITY); 70 } 71 72 if (savedInstanceState != null) { 73 ConfirmRemoveScreenLockDialog dialog = (ConfirmRemoveScreenLockDialog) 74 getFragmentManager().findFragmentByTag(DIALOG_TAG); 75 if (dialog != null) { 76 dialog.setConfirmRemoveLockListener(mConfirmListener); 77 } 78 } 79 } 80 81 @Override getItemProvider()82 public ListItemProvider getItemProvider() { 83 if (mItemProvider == null) { 84 mItemProvider = new ListItemProvider.ListProvider(getListItems()); 85 } 86 return mItemProvider; 87 } 88 getListItems()89 private List<ListItem> getListItems() { 90 List<ListItem> items = new ArrayList<>(); 91 items.add(createNoneLineItem()); 92 items.add(createLockPatternLineItem()); 93 items.add(createLockPasswordLineItem()); 94 items.add(createLockPinLineItem()); 95 return items; 96 } 97 createNoneLineItem()98 private ListItem createNoneLineItem() { 99 TextListItem item = new TextListItem(getContext()); 100 item.setTitle(getString(R.string.security_lock_none)); 101 if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 102 item.setBody(getString(R.string.current_screen_lock)); 103 // TODO set item disabled after b/78784323 is fixed 104 } else { 105 item.setOnClickListener(view -> { 106 ConfirmRemoveScreenLockDialog dialog = new ConfirmRemoveScreenLockDialog(); 107 dialog.setConfirmRemoveLockListener(mConfirmListener); 108 dialog.show(getFragmentManager(), DIALOG_TAG); 109 }); 110 } 111 return item; 112 } 113 createLockPatternLineItem()114 private ListItem createLockPatternLineItem() { 115 TextListItem item = new TextListItem(getContext()); 116 item.setTitle(getString(R.string.security_lock_pattern)); 117 if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { 118 item.setBody(getString(R.string.current_screen_lock)); 119 } 120 item.setOnClickListener(view -> launchFragment(ChooseLockPatternFragment.newInstance())); 121 return item; 122 } 123 createLockPasswordLineItem()124 private ListItem createLockPasswordLineItem() { 125 TextListItem item = new TextListItem(getContext()); 126 item.setTitle(getString(R.string.security_lock_password)); 127 if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC 128 || mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC) { 129 item.setBody(getString(R.string.current_screen_lock)); 130 } 131 item.setOnClickListener(view -> launchFragment( 132 ChooseLockPinPasswordFragment.newPasswordInstance())); 133 return item; 134 } 135 createLockPinLineItem()136 private ListItem createLockPinLineItem() { 137 TextListItem item = new TextListItem(getContext()); 138 item.setTitle(getString(R.string.security_lock_pin)); 139 if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC 140 || mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX) { 141 item.setBody(getString(R.string.current_screen_lock)); 142 } 143 item.setOnClickListener(view -> launchFragment( 144 ChooseLockPinPasswordFragment.newPinInstance())); 145 return item; 146 } 147 launchFragment(BaseFragment fragment)148 private void launchFragment(BaseFragment fragment) { 149 if (!TextUtils.isEmpty(mCurrPassword)) { 150 Bundle args = fragment.getArguments(); 151 if (args == null) { 152 args = new Bundle(); 153 } 154 args.putString(SettingsScreenLockActivity.EXTRA_CURRENT_SCREEN_LOCK, mCurrPassword); 155 fragment.setArguments(args); 156 } 157 158 getFragmentController().launchFragment(fragment); 159 } 160 } 161