• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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