193582995daff3b92b89a24c271fbd719293a41daDoris Ling/*
293582995daff3b92b89a24c271fbd719293a41daDoris Ling * Copyright (C) 2017 The Android Open Source Project
393582995daff3b92b89a24c271fbd719293a41daDoris Ling *
493582995daff3b92b89a24c271fbd719293a41daDoris Ling * Licensed under the Apache License, Version 2.0 (the "License");
593582995daff3b92b89a24c271fbd719293a41daDoris Ling * you may not use this file except in compliance with the License.
693582995daff3b92b89a24c271fbd719293a41daDoris Ling * You may obtain a copy of the License at
793582995daff3b92b89a24c271fbd719293a41daDoris Ling *
893582995daff3b92b89a24c271fbd719293a41daDoris Ling *      http://www.apache.org/licenses/LICENSE-2.0
993582995daff3b92b89a24c271fbd719293a41daDoris Ling *
1093582995daff3b92b89a24c271fbd719293a41daDoris Ling * Unless required by applicable law or agreed to in writing, software
1193582995daff3b92b89a24c271fbd719293a41daDoris Ling * distributed under the License is distributed on an "AS IS" BASIS,
1293582995daff3b92b89a24c271fbd719293a41daDoris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1393582995daff3b92b89a24c271fbd719293a41daDoris Ling * See the License for the specific language governing permissions and
1493582995daff3b92b89a24c271fbd719293a41daDoris Ling * limitations under the License.
1593582995daff3b92b89a24c271fbd719293a41daDoris Ling */
1693582995daff3b92b89a24c271fbd719293a41daDoris Lingpackage com.android.settings.security;
1793582995daff3b92b89a24c271fbd719293a41daDoris Ling
1893582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.app.Fragment;
1993582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.content.Context;
2093582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.os.UserHandle;
2193582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.support.annotation.VisibleForTesting;
2293582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.support.v7.preference.Preference;
2393582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.support.v7.preference.Preference.OnPreferenceClickListener;
2493582995daff3b92b89a24c271fbd719293a41daDoris Lingimport android.support.v7.preference.PreferenceScreen;
2593582995daff3b92b89a24c271fbd719293a41daDoris Lingimport com.android.internal.widget.LockPatternUtils;
2693582995daff3b92b89a24c271fbd719293a41daDoris Lingimport com.android.settings.OwnerInfoSettings;
271d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport com.android.settings.core.PreferenceControllerMixin;
2893582995daff3b92b89a24c271fbd719293a41daDoris Lingimport com.android.settingslib.RestrictedLockUtils;
2993582995daff3b92b89a24c271fbd719293a41daDoris Lingimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
3093582995daff3b92b89a24c271fbd719293a41daDoris Lingimport com.android.settingslib.RestrictedPreference;
311d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport com.android.settingslib.core.AbstractPreferenceController;
32777ed2535a7fd6f618a0d12f381af99252283574Juan Langimport com.android.settingslib.core.lifecycle.Lifecycle;
33777ed2535a7fd6f618a0d12f381af99252283574Juan Langimport com.android.settingslib.core.lifecycle.LifecycleObserver;
34777ed2535a7fd6f618a0d12f381af99252283574Juan Langimport com.android.settingslib.core.lifecycle.events.OnResume;
3593582995daff3b92b89a24c271fbd719293a41daDoris Ling
361d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerpublic class OwnerInfoPreferenceController extends AbstractPreferenceController
371d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler        implements PreferenceControllerMixin, LifecycleObserver, OnResume {
3893582995daff3b92b89a24c271fbd719293a41daDoris Ling
3993582995daff3b92b89a24c271fbd719293a41daDoris Ling    private static final String KEY_OWNER_INFO = "owner_info_settings";
4093582995daff3b92b89a24c271fbd719293a41daDoris Ling    private static final int MY_USER_ID = UserHandle.myUserId();
4193582995daff3b92b89a24c271fbd719293a41daDoris Ling
4293582995daff3b92b89a24c271fbd719293a41daDoris Ling    private final LockPatternUtils mLockPatternUtils;
4393582995daff3b92b89a24c271fbd719293a41daDoris Ling    private final Fragment mParent;
4493582995daff3b92b89a24c271fbd719293a41daDoris Ling    private RestrictedPreference mOwnerInfoPref;
4593582995daff3b92b89a24c271fbd719293a41daDoris Ling
4693582995daff3b92b89a24c271fbd719293a41daDoris Ling    // Container fragment should implement this in order to show the correct summary
4793582995daff3b92b89a24c271fbd719293a41daDoris Ling    public interface OwnerInfoCallback {
4893582995daff3b92b89a24c271fbd719293a41daDoris Ling        public void onOwnerInfoUpdated();
4993582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
5093582995daff3b92b89a24c271fbd719293a41daDoris Ling
5193582995daff3b92b89a24c271fbd719293a41daDoris Ling    public OwnerInfoPreferenceController(Context context, Fragment parent, Lifecycle lifecycle ) {
5293582995daff3b92b89a24c271fbd719293a41daDoris Ling        super(context);
5393582995daff3b92b89a24c271fbd719293a41daDoris Ling        mParent = parent;
5493582995daff3b92b89a24c271fbd719293a41daDoris Ling        mLockPatternUtils = new LockPatternUtils(context);
5593582995daff3b92b89a24c271fbd719293a41daDoris Ling        if (lifecycle != null) {
5693582995daff3b92b89a24c271fbd719293a41daDoris Ling            lifecycle.addObserver(this);
5793582995daff3b92b89a24c271fbd719293a41daDoris Ling        }
5893582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
5993582995daff3b92b89a24c271fbd719293a41daDoris Ling
6093582995daff3b92b89a24c271fbd719293a41daDoris Ling    @Override
6193582995daff3b92b89a24c271fbd719293a41daDoris Ling    public void displayPreference(PreferenceScreen screen) {
6293582995daff3b92b89a24c271fbd719293a41daDoris Ling        mOwnerInfoPref  = (RestrictedPreference) screen.findPreference(KEY_OWNER_INFO);
6393582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
6493582995daff3b92b89a24c271fbd719293a41daDoris Ling
6593582995daff3b92b89a24c271fbd719293a41daDoris Ling    @Override
6693582995daff3b92b89a24c271fbd719293a41daDoris Ling    public void onResume() {
6793582995daff3b92b89a24c271fbd719293a41daDoris Ling        updateEnableState();
6893582995daff3b92b89a24c271fbd719293a41daDoris Ling        updateSummary();
6993582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
7093582995daff3b92b89a24c271fbd719293a41daDoris Ling
7193582995daff3b92b89a24c271fbd719293a41daDoris Ling    @Override
7293582995daff3b92b89a24c271fbd719293a41daDoris Ling    public boolean isAvailable() {
7393582995daff3b92b89a24c271fbd719293a41daDoris Ling        return true;
7493582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
7593582995daff3b92b89a24c271fbd719293a41daDoris Ling
7693582995daff3b92b89a24c271fbd719293a41daDoris Ling    @Override
7793582995daff3b92b89a24c271fbd719293a41daDoris Ling    public String getPreferenceKey() {
7893582995daff3b92b89a24c271fbd719293a41daDoris Ling        return KEY_OWNER_INFO;
7993582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
8093582995daff3b92b89a24c271fbd719293a41daDoris Ling
8193582995daff3b92b89a24c271fbd719293a41daDoris Ling    public void updateEnableState() {
8293582995daff3b92b89a24c271fbd719293a41daDoris Ling        if (mOwnerInfoPref == null) {
8393582995daff3b92b89a24c271fbd719293a41daDoris Ling            return;
8493582995daff3b92b89a24c271fbd719293a41daDoris Ling        }
8593582995daff3b92b89a24c271fbd719293a41daDoris Ling        if (isDeviceOwnerInfoEnabled()) {
8693582995daff3b92b89a24c271fbd719293a41daDoris Ling            EnforcedAdmin admin = getDeviceOwner();
8793582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPref.setDisabledByAdmin(admin);
8893582995daff3b92b89a24c271fbd719293a41daDoris Ling        } else {
8993582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPref.setDisabledByAdmin(null);
9093582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPref.setEnabled(!mLockPatternUtils.isLockScreenDisabled(MY_USER_ID));
9193582995daff3b92b89a24c271fbd719293a41daDoris Ling            if (mOwnerInfoPref.isEnabled()) {
9293582995daff3b92b89a24c271fbd719293a41daDoris Ling                mOwnerInfoPref.setOnPreferenceClickListener(
9393582995daff3b92b89a24c271fbd719293a41daDoris Ling                    new OnPreferenceClickListener() {
9493582995daff3b92b89a24c271fbd719293a41daDoris Ling                        @Override
9593582995daff3b92b89a24c271fbd719293a41daDoris Ling                        public boolean onPreferenceClick(Preference preference) {
9693582995daff3b92b89a24c271fbd719293a41daDoris Ling                            OwnerInfoSettings.show(mParent);
9793582995daff3b92b89a24c271fbd719293a41daDoris Ling                            return true;
9893582995daff3b92b89a24c271fbd719293a41daDoris Ling                        }
9993582995daff3b92b89a24c271fbd719293a41daDoris Ling                    });
10093582995daff3b92b89a24c271fbd719293a41daDoris Ling            }
10193582995daff3b92b89a24c271fbd719293a41daDoris Ling        }
10293582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
10393582995daff3b92b89a24c271fbd719293a41daDoris Ling
10493582995daff3b92b89a24c271fbd719293a41daDoris Ling    public void updateSummary() {
10593582995daff3b92b89a24c271fbd719293a41daDoris Ling        if (mOwnerInfoPref != null) {
10693582995daff3b92b89a24c271fbd719293a41daDoris Ling            if (isDeviceOwnerInfoEnabled()) {
10793582995daff3b92b89a24c271fbd719293a41daDoris Ling                mOwnerInfoPref.setSummary(
10893582995daff3b92b89a24c271fbd719293a41daDoris Ling                    getDeviceOwnerInfo());
10993582995daff3b92b89a24c271fbd719293a41daDoris Ling            } else {
11093582995daff3b92b89a24c271fbd719293a41daDoris Ling                mOwnerInfoPref.setSummary(isOwnerInfoEnabled()
11193582995daff3b92b89a24c271fbd719293a41daDoris Ling                    ? getOwnerInfo()
11293582995daff3b92b89a24c271fbd719293a41daDoris Ling                    : mContext.getString(
11393582995daff3b92b89a24c271fbd719293a41daDoris Ling                        com.android.settings.R.string.owner_info_settings_summary));
11493582995daff3b92b89a24c271fbd719293a41daDoris Ling            }
11593582995daff3b92b89a24c271fbd719293a41daDoris Ling        }
11693582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
11793582995daff3b92b89a24c271fbd719293a41daDoris Ling
11893582995daff3b92b89a24c271fbd719293a41daDoris Ling    // Wrapper methods to allow testing
11993582995daff3b92b89a24c271fbd719293a41daDoris Ling    @VisibleForTesting
12093582995daff3b92b89a24c271fbd719293a41daDoris Ling    boolean isDeviceOwnerInfoEnabled() {
12193582995daff3b92b89a24c271fbd719293a41daDoris Ling        return mLockPatternUtils.isDeviceOwnerInfoEnabled();
12293582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
12393582995daff3b92b89a24c271fbd719293a41daDoris Ling
12493582995daff3b92b89a24c271fbd719293a41daDoris Ling    @VisibleForTesting
12593582995daff3b92b89a24c271fbd719293a41daDoris Ling    String getDeviceOwnerInfo() {
12693582995daff3b92b89a24c271fbd719293a41daDoris Ling        return mLockPatternUtils.getDeviceOwnerInfo();
12793582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
12893582995daff3b92b89a24c271fbd719293a41daDoris Ling
12993582995daff3b92b89a24c271fbd719293a41daDoris Ling    @VisibleForTesting
13093582995daff3b92b89a24c271fbd719293a41daDoris Ling    boolean isOwnerInfoEnabled() {
13193582995daff3b92b89a24c271fbd719293a41daDoris Ling        return mLockPatternUtils.isOwnerInfoEnabled(MY_USER_ID);
13293582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
13393582995daff3b92b89a24c271fbd719293a41daDoris Ling
13493582995daff3b92b89a24c271fbd719293a41daDoris Ling    @VisibleForTesting
13593582995daff3b92b89a24c271fbd719293a41daDoris Ling    String getOwnerInfo() {
13693582995daff3b92b89a24c271fbd719293a41daDoris Ling        return mLockPatternUtils.getOwnerInfo(MY_USER_ID);
13793582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
13893582995daff3b92b89a24c271fbd719293a41daDoris Ling
13993582995daff3b92b89a24c271fbd719293a41daDoris Ling    @VisibleForTesting
14093582995daff3b92b89a24c271fbd719293a41daDoris Ling    EnforcedAdmin getDeviceOwner() {
14193582995daff3b92b89a24c271fbd719293a41daDoris Ling        return RestrictedLockUtils.getDeviceOwner(mContext);
14293582995daff3b92b89a24c271fbd719293a41daDoris Ling    }
14393582995daff3b92b89a24c271fbd719293a41daDoris Ling}
144