1 /* 2 * Copyright (C) 2015 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.settings; 18 19 import android.app.Fragment; 20 import android.content.Context; 21 import android.content.Intent; 22 import android.os.AsyncTask; 23 import android.os.Bundle; 24 import android.os.UserManager; 25 26 import com.android.internal.widget.LockPatternUtils; 27 28 /** 29 * An invisible retained worker fragment to track the AsyncWork that saves (and optionally 30 * verifies if a challenge is given) the chosen lock credential (pattern/pin/password). 31 */ 32 abstract class SaveChosenLockWorkerBase extends Fragment { 33 34 private Listener mListener; 35 private boolean mFinished; 36 private Intent mResultData; 37 38 protected LockPatternUtils mUtils; 39 protected boolean mHasChallenge; 40 protected long mChallenge; 41 protected boolean mWasSecureBefore; 42 protected int mUserId; 43 44 private boolean mBlocking; 45 46 @Override 47 public void onCreate(Bundle savedInstanceState) { 48 super.onCreate(savedInstanceState); 49 setRetainInstance(true); 50 } 51 52 public void setListener(Listener listener) { 53 if (mListener == listener) { 54 return; 55 } 56 57 mListener = listener; 58 if (mFinished && mListener != null) { 59 mListener.onChosenLockSaveFinished(mWasSecureBefore, mResultData); 60 } 61 } 62 63 protected void prepare(LockPatternUtils utils, boolean credentialRequired, 64 boolean hasChallenge, long challenge, int userId) { 65 mUtils = utils; 66 mUserId = userId; 67 68 mHasChallenge = hasChallenge; 69 mChallenge = challenge; 70 // This will be a no-op for non managed profiles. 71 mWasSecureBefore = mUtils.isSecure(mUserId); 72 73 Context context = getContext(); 74 // If context is null, we're being invoked to change the setCredentialRequiredToDecrypt, 75 // and we made sure that this is the primary user already. 76 if (context == null || UserManager.get(context).getUserInfo(mUserId).isPrimary()) { 77 mUtils.setCredentialRequiredToDecrypt(credentialRequired); 78 } 79 80 mFinished = false; 81 mResultData = null; 82 } 83 84 protected void start() { 85 if (mBlocking) { 86 finish(saveAndVerifyInBackground()); 87 } else { 88 new Task().execute(); 89 } 90 } 91 92 /** 93 * Executes the save and verify work in background. 94 * @return Intent with challenge token or null. 95 */ 96 protected abstract Intent saveAndVerifyInBackground(); 97 98 protected void finish(Intent resultData) { 99 mFinished = true; 100 mResultData = resultData; 101 if (mListener != null) { 102 mListener.onChosenLockSaveFinished(mWasSecureBefore, mResultData); 103 } 104 } 105 106 public void setBlocking(boolean blocking) { 107 mBlocking = blocking; 108 } 109 110 private class Task extends AsyncTask<Void, Void, Intent> { 111 @Override 112 protected Intent doInBackground(Void... params){ 113 return saveAndVerifyInBackground(); 114 } 115 116 @Override 117 protected void onPostExecute(Intent resultData) { 118 finish(resultData); 119 } 120 } 121 122 interface Listener { 123 public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData); 124 } 125 } 126