120c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang/*
220c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * Copyright (C) 2015 The Android Open Source Project
320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang *
420c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * Licensed under the Apache License, Version 2.0 (the "License");
520c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * you may not use this file except in compliance with the License.
620c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * You may obtain a copy of the License at
720c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang *
820c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang *      http://www.apache.org/licenses/LICENSE-2.0
920c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang *
1020c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * Unless required by applicable law or agreed to in writing, software
1120c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * distributed under the License is distributed on an "AS IS" BASIS,
1220c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * See the License for the specific language governing permissions and
1420c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang * limitations under the License
1520c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang */
1620c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
1769c182afb0e6d82a341a28b4317aa703af768906Gary Maipackage com.android.contacts.preference;
1820c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
1920c6ec57df86ac67a6c555caac25993502fe66aaTingting Wangimport android.app.AlertDialog;
2020c6ec57df86ac67a6c555caac25993502fe66aaTingting Wangimport android.content.Context;
21fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Maiimport android.content.DialogInterface;
22fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.preference.DialogPreference;
2320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wangimport android.util.AttributeSet;
246d29c04a52500466bb06138d63220b28cd8df40dyaoluimport android.view.View;
2520c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
26ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerottimport com.android.contacts.model.account.AccountInfo;
2769c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountWithDataSet;
2869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.util.AccountsListAdapter;
2920c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
30ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerottimport java.util.List;
31ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott
32fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottpublic class DefaultAccountPreference extends DialogPreference {
3320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    private ContactsPreferences mPreferences;
34fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai    private AccountsListAdapter mListAdapter;
35ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott    private List<AccountInfo> mAccounts;
36fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott    private int mChosenIndex = -1;
3720c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
3820c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    public DefaultAccountPreference(Context context) {
3920c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        super(context);
4020c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        prepare();
4120c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    }
4220c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
4320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    public DefaultAccountPreference(Context context, AttributeSet attrs) {
4420c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        super(context, attrs);
4520c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        prepare();
4620c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    }
4720c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
48ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott    public void setAccounts(List<AccountInfo> accounts) {
49ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott        mAccounts = accounts;
50ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott        if (mListAdapter != null) {
51ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott            mListAdapter.setAccounts(accounts, null);
52614d81204436ca60e3b0a4c5cd0be92fb7e8213eMarcus Hagerott            notifyChanged();
53ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott        }
54ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott    }
55ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott
566d29c04a52500466bb06138d63220b28cd8df40dyaolu    @Override
576d29c04a52500466bb06138d63220b28cd8df40dyaolu    protected View onCreateDialogView() {
586d29c04a52500466bb06138d63220b28cd8df40dyaolu        prepare();
596d29c04a52500466bb06138d63220b28cd8df40dyaolu        return super.onCreateDialogView();
606d29c04a52500466bb06138d63220b28cd8df40dyaolu    }
616d29c04a52500466bb06138d63220b28cd8df40dyaolu
6220c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    private void prepare() {
6320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        mPreferences = new ContactsPreferences(getContext());
64ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott        mListAdapter = new AccountsListAdapter(getContext());
65ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott        if (mAccounts != null) {
66ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott            mListAdapter.setAccounts(mAccounts, null);
67ee3d3a503553de2699285d98bc6fe7d34699a8b0Marcus Hagerott        }
6820c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    }
6920c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
7020c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    @Override
7120c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    protected boolean shouldPersist() {
7220c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        return false;   // This preference takes care of its own storage
7320c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    }
7420c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
7520c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    @Override
7620c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    public CharSequence getSummary() {
77fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        final AccountWithDataSet defaultAccount = mPreferences.getDefaultAccount();
78614d81204436ca60e3b0a4c5cd0be92fb7e8213eMarcus Hagerott        if (defaultAccount == null || mAccounts == null ||
79614d81204436ca60e3b0a4c5cd0be92fb7e8213eMarcus Hagerott                !AccountInfo.contains(mAccounts, defaultAccount)) {
80949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott            return null;
81949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        } else {
82614d81204436ca60e3b0a4c5cd0be92fb7e8213eMarcus Hagerott            return AccountInfo.getAccount(mAccounts, defaultAccount).getNameLabel();
83949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        }
8420c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    }
8520c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang
8620c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    @Override
8720c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
8820c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        super.onPrepareDialogBuilder(builder);
89fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        // UX recommendation is not to show buttons on such lists.
9020c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang        builder.setNegativeButton(null, null);
91fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        builder.setPositiveButton(null, null);
92fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai        builder.setAdapter(mListAdapter, new DialogInterface.OnClickListener() {
93fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai            @Override
94fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai            public void onClick(DialogInterface dialog, int which) {
95fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott                mChosenIndex = which;
96fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai            }
97fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai        });
98fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai    }
99fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai
100fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai    @Override
101fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai    protected void onDialogClosed(boolean positiveResult) {
102fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        final AccountWithDataSet currentDefault = mPreferences.getDefaultAccount();
103fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott
104949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        if (mChosenIndex != -1) {
105fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            final AccountWithDataSet chosenAccount = mListAdapter.getItem(mChosenIndex);
106fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            if (!chosenAccount.equals(currentDefault)) {
107fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott                mPreferences.setDefaultAccount(chosenAccount);
108fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott                notifyChanged();
109fd866c064feab57fcd13f4fd7b99e3bc1cc013ffGary Mai            }
110949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        } // else the user dismissed this dialog so leave the preference unchanged.
11120c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang    }
11220c6ec57df86ac67a6c555caac25993502fe66aaTingting Wang}
113