SaveChosenLockWorkerBase.java revision 5bb1e4fb909a5f0e0574d3572ea1edcf32a2190f
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; 203e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.content.Intent; 213e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.os.AsyncTask; 223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport android.os.Bundle; 235bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Leeimport android.os.UserManager; 243e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 253e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaimport com.android.internal.widget.LockPatternUtils; 263e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 273e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia/** 283e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * An invisible retained worker fragment to track the AsyncWork that saves (and optionally 293e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * verifies if a challenge is given) the chosen lock credential (pattern/pin/password). 303e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia */ 313e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xiaabstract class SaveChosenLockWorkerBase extends Fragment { 323e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 333e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private Listener mListener; 343e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private boolean mFinished; 353e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private Intent mResultData; 363e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 373e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected LockPatternUtils mUtils; 383e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected boolean mHasChallenge; 393e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected long mChallenge; 403e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected boolean mWasSecureBefore; 41b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri protected int mUserId; 423e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 433e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 443e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onCreate(Bundle savedInstanceState) { 453e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia super.onCreate(savedInstanceState); 463e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setRetainInstance(true); 473e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 483e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 493e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void setListener(Listener listener) { 503e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mListener == listener) { 513e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return; 523e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 533e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 543e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mListener = listener; 553e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mFinished && mListener != null) { 563e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mListener.onChosenLockSaveFinished(mWasSecureBefore, mResultData); 573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 583e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 593e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 603e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void prepare(LockPatternUtils utils, boolean credentialRequired, 61b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri boolean hasChallenge, long challenge, int userId) { 623e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mUtils = utils; 63b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri mUserId = userId; 643e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 653e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mHasChallenge = hasChallenge; 663e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mChallenge = challenge; 67b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri // This will be a no-op for non managed profiles. 68b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri mUtils.setSeparateProfileChallengeEnabled(mUserId, true); 69b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri mWasSecureBefore = mUtils.isSecure(mUserId); 703e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 715bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee if (UserManager.get(getContext()).getUserInfo(mUserId).isPrimary()) { 725bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee mUtils.setCredentialRequiredToDecrypt(credentialRequired); 735bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee } 743e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 753e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mFinished = false; 763e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mResultData = null; 773e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 783e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 793e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void start() { 803e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia new Task().execute(); 813e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 823e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia /** 843e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * Executes the save and verify work in background. 853e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia * @return Intent with challenge token or null. 863e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia */ 873e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected abstract Intent saveAndVerifyInBackground(); 883e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 893e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void finish(Intent resultData) { 903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mFinished = true; 913e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mResultData = resultData; 923e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mListener != null) { 933e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mListener.onChosenLockSaveFinished(mWasSecureBefore, mResultData); 943e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 953e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 963e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 973e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private class Task extends AsyncTask<Void, Void, Intent> { 983e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 993e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected Intent doInBackground(Void... params){ 1003e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return saveAndVerifyInBackground(); 1013e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1023e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 1033e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 1043e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void onPostExecute(Intent resultData) { 1053e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia finish(resultData); 1063e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1073e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1083e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 1093e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia interface Listener { 1103e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData); 1113e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1123e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia} 113