1bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling/*
2bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * Copyright (C) 2016 The Android Open Source Project
3bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling *
4bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * Licensed under the Apache License, Version 2.0 (the "License");
5bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * you may not use this file except in compliance with the License.
6bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * You may obtain a copy of the License at
7bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling *
8bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling *      http://www.apache.org/licenses/LICENSE-2.0
9bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling *
10bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * Unless required by applicable law or agreed to in writing, software
11bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * distributed under the License is distributed on an "AS IS" BASIS,
12bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * See the License for the specific language governing permissions and
14bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling * limitations under the License.
15bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling */
16bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
17bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingpackage com.android.settings.accounts;
18bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
19ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhangimport android.accounts.Account;
20bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.content.Context;
21bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.graphics.drawable.Drawable;
22bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.os.Bundle;
23bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.os.UserHandle;
24bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.os.UserManager;
25bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.support.v7.preference.Preference;
26bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport android.support.v7.preference.Preference.OnPreferenceClickListener;
27bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
28bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport com.android.settings.R;
29bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport com.android.settings.Utils;
30bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
31bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Lingimport static android.content.Intent.EXTRA_USER;
32bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
3320d4b041f7870796f4f186729add8cd1b42f2dddDoris Lingpublic class AccountTypePreference extends Preference implements OnPreferenceClickListener {
34bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    /**
35bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * Title of the tile that is shown to the user.
36bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * @attr ref android.R.styleable#PreferenceHeader_title
37bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     */
38bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    private final CharSequence mTitle;
39bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
40bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    /**
41bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * Packange name used to resolve the resources of the title shown to the user in the new
42bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * fragment.
43bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     */
44bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    private final String mTitleResPackageName;
45bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
46bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    /**
47bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * Resource id of the title shown to the user in the new fragment.
48bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     */
49bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    private final int mTitleResId;
50bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
51bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    /**
5220d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling     * Summary of the tile that is shown to the user.
5320d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling     */
5420d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    private final CharSequence mSummary;
5520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling
5620d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    /**
57bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * Full class name of the fragment to display when this tile is
58bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * selected.
59bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * @attr ref android.R.styleable#PreferenceHeader_fragment
60bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     */
61bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    private final String mFragment;
62bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
63bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    /**
64bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * Optional arguments to supply to the fragment when it is
65bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     * instantiated.
66bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling     */
67bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    private final Bundle mFragmentArguments;
68bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
69c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang    private final int mMetricsCategory;
70c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang
71ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang    public AccountTypePreference(Context context, int metricsCategory, Account account,
72c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang            String titleResPackageName, int titleResId, CharSequence summary, String fragment,
73c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang            Bundle fragmentArguments, Drawable icon) {
74bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        super(context);
75ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang        mTitle = account.name;
76bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        mTitleResPackageName = titleResPackageName;
77bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        mTitleResId = titleResId;
7820d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling        mSummary = summary;
79bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        mFragment = fragment;
80bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        mFragmentArguments = fragmentArguments;
81c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang        mMetricsCategory = metricsCategory;
82bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        setWidgetLayoutResource(R.layout.account_type_preference);
83bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
84ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang        setKey(buildKey(account));
85ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang        setTitle(mTitle);
8620d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling        setSummary(summary);
87bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        setIcon(icon);
88bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
89bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        setOnPreferenceClickListener(this);
90bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    }
91bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
92bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    @Override
93bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    public boolean onPreferenceClick(Preference preference) {
94bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        if (mFragment != null) {
95bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            UserManager userManager =
96bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling                (UserManager) getContext().getSystemService(Context.USER_SERVICE);
97bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            UserHandle user = mFragmentArguments.getParcelable(EXTRA_USER);
98bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            if (user != null && Utils.startQuietModeDialogIfNecessary(getContext(), userManager,
99bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling                user.getIdentifier())) {
100bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling                return true;
101bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            } else if (user != null && Utils.unlockWorkProfileIfNecessary(getContext(),
102bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling                user.getIdentifier())) {
103bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling                return true;
104bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            }
105bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            Utils.startWithFragment(getContext(), mFragment, mFragmentArguments,
106bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling                null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName,
107c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang                mTitleResId, null /* title */, mMetricsCategory);
108bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling            return true;
109bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        }
110bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        return false;
111bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    }
112bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
113ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang    /**
114ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang     * Build a unique preference key based on account.
115ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang     */
116ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang    public static String buildKey(Account account) {
117ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang        return String.valueOf(account.hashCode());
118ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang    }
119ff67503b581e8535f06a53c6f479e446cc2f1638Fan Zhang
12020d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    public CharSequence getTitle() {
121bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        return mTitle;
122bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling    }
123bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling
12420d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    public CharSequence getSummary() {
12520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling        return mSummary;
12620d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling    }
127bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling}
128