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