13e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia/* 23e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * Copyright (C) 2015 The Android Open Source Project 33e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * 43e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * Licensed under the Apache License, Version 2.0 (the "License"); 53e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * you may not use this file except in compliance with the License. 63e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * You may obtain a copy of the License at 73e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * 83e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * http://www.apache.org/licenses/LICENSE-2.0 93e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * 103e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * Unless required by applicable law or agreed to in writing, software 113e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * distributed under the License is distributed on an "AS IS" BASIS, 123e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * See the License for the specific language governing permissions and 143e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * limitations under the License. 153e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia */ 163e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 173e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiapackage com.android.settings; 183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 193e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.app.Fragment; 2077181e947860056fb77d24ab9fa9e86365b244e6Adrian Roosimport android.content.Context; 213e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.content.Intent; 223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.os.AsyncTask; 233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.os.Bundle; 245bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Leeimport android.os.UserManager; 253e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 263e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport com.android.internal.widget.LockPatternUtils; 273e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 283e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia/** 293e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * An invisible retained worker fragment to track the AsyncWork that saves (and optionally 303e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * verifies if a challenge is given) the chosen lock credential (pattern/pin/password). 313e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia */ 323e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaabstract class SaveChosenLockWorkerBase extends Fragment { 333e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 343e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private Listener mListener; 353e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private boolean mFinished; 363e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private Intent mResultData; 373e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 383e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected LockPatternUtils mUtils; 393e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected boolean mHasChallenge; 403e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected long mChallenge; 413e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected boolean mWasSecureBefore; 42b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri protected int mUserId; 433e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 4462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos private boolean mBlocking; 4562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 463e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 473e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onCreate(Bundle savedInstanceState) { 483e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia super.onCreate(savedInstanceState); 493e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setRetainInstance(true); 503e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 513e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 523e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void setListener(Listener listener) { 533e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mListener == listener) { 543e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return; 553e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 563e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mListener = listener; 583e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mFinished && mListener != null) { 593e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mListener.onChosenLockSaveFinished(mWasSecureBefore, mResultData); 603e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 613e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 623e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 633e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void prepare(LockPatternUtils utils, boolean credentialRequired, 64b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri boolean hasChallenge, long challenge, int userId) { 653e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mUtils = utils; 66b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri mUserId = userId; 673e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 683e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mHasChallenge = hasChallenge; 693e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mChallenge = challenge; 70b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri // This will be a no-op for non managed profiles. 71b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri mWasSecureBefore = mUtils.isSecure(mUserId); 723e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7377181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos Context context = getContext(); 7477181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos // If context is null, we're being invoked to change the setCredentialRequiredToDecrypt, 7577181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos // and we made sure that this is the primary user already. 7677181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos if (context == null || UserManager.get(context).getUserInfo(mUserId).isPrimary()) { 775bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee mUtils.setCredentialRequiredToDecrypt(credentialRequired); 785bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee } 793e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 803e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mFinished = false; 813e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mResultData = null; 823e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 843e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void start() { 8562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos if (mBlocking) { 8662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos finish(saveAndVerifyInBackground()); 8762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } else { 8862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos new Task().execute(); 8962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 913e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 923e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia /** 933e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * Executes the save and verify work in background. 943e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * @return Intent with challenge token or null. 953e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia */ 963e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected abstract Intent saveAndVerifyInBackground(); 973e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 983e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void finish(Intent resultData) { 993e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mFinished = true; 1003e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mResultData = resultData; 1013e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mListener != null) { 1023e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mListener.onChosenLockSaveFinished(mWasSecureBefore, mResultData); 1033e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1043e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1053e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos public void setBlocking(boolean blocking) { 10762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos mBlocking = blocking; 10862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 10962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 1103e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private class Task extends AsyncTask<Void, Void, Intent> { 1113e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 1123e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected Intent doInBackground(Void... params){ 1133e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return saveAndVerifyInBackground(); 1143e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1153e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 1163e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 1173e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void onPostExecute(Intent resultData) { 1183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia finish(resultData); 1193e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1203e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1213e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 1223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia interface Listener { 1233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData); 1243e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1253e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia} 126