1/*
2
3 * Copyright (C) 2008 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.settings.accounts;
19
20import android.app.Activity;
21import android.content.ContentResolver;
22import android.content.Context;
23import android.content.SyncStatusObserver;
24import android.graphics.drawable.Drawable;
25import android.os.Bundle;
26import android.os.Handler;
27import android.os.UserHandle;
28import android.os.UserManager;
29import android.support.v7.preference.PreferenceScreen;
30import android.text.format.DateFormat;
31import android.util.Log;
32
33import com.android.settings.SettingsPreferenceFragment;
34import com.android.settings.Utils;
35import com.android.settingslib.accounts.AuthenticatorHelper;
36
37import java.util.ArrayList;
38import java.util.Date;
39
40abstract class AccountPreferenceBase extends SettingsPreferenceFragment
41        implements AuthenticatorHelper.OnAccountsUpdateListener {
42
43    protected static final String TAG = "AccountPreferenceBase";
44    protected static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
45
46    public static final String AUTHORITIES_FILTER_KEY = "authorities";
47    public static final String ACCOUNT_TYPES_FILTER_KEY = "account_types";
48
49    private final Handler mHandler = new Handler();
50
51    private UserManager mUm;
52    private Object mStatusChangeListenerHandle;
53    protected AuthenticatorHelper mAuthenticatorHelper;
54    protected UserHandle mUserHandle;
55    protected AccountTypePreferenceLoader mAccountTypePreferenceLoader;
56
57    private java.text.DateFormat mDateFormat;
58    private java.text.DateFormat mTimeFormat;
59
60    @Override
61    public void onCreate(Bundle icicle) {
62        super.onCreate(icicle);
63        mUm = (UserManager) getSystemService(Context.USER_SERVICE);
64        final Activity activity = getActivity();
65        mUserHandle = Utils.getSecureTargetUser(activity.getActivityToken(), mUm, getArguments(),
66                activity.getIntent().getExtras());
67        mAuthenticatorHelper = new AuthenticatorHelper(activity, mUserHandle, this);
68        mAccountTypePreferenceLoader =
69            new AccountTypePreferenceLoader(this, mAuthenticatorHelper, mUserHandle);
70    }
71
72    /**
73     * Overload to handle account updates.
74     */
75    @Override
76    public void onAccountsUpdate(UserHandle userHandle) {
77
78    }
79
80    /**
81     * Overload to handle authenticator description updates
82     */
83    protected void onAuthDescriptionsUpdated() {
84
85    }
86
87    /**
88     * Overload to handle sync state updates.
89     */
90    protected void onSyncStateUpdated() {
91
92    }
93
94    @Override
95    public void onActivityCreated(Bundle savedInstanceState) {
96        super.onActivityCreated(savedInstanceState);
97
98        final Activity activity = getActivity();
99
100        mDateFormat = DateFormat.getDateFormat(activity);
101        mTimeFormat = DateFormat.getTimeFormat(activity);
102    }
103
104    @Override
105    public void onResume() {
106        super.onResume();
107        mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
108                ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
109                | ContentResolver.SYNC_OBSERVER_TYPE_STATUS
110                | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS,
111                mSyncStatusObserver);
112        onSyncStateUpdated();
113    }
114
115    @Override
116    public void onPause() {
117        super.onPause();
118        ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
119    }
120
121    private SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
122        public void onStatusChanged(int which) {
123            mHandler.post(new Runnable() {
124                public void run() {
125                    onSyncStateUpdated();
126                }
127            });
128        }
129    };
130
131    public ArrayList<String> getAuthoritiesForAccountType(String type) {
132        return mAuthenticatorHelper.getAuthoritiesForAccountType(type);
133    }
134
135    /**
136     * Gets the preferences.xml file associated with a particular account type.
137     * @param accountType the type of account
138     * @return a PreferenceScreen inflated from accountPreferenceId.
139     */
140    public PreferenceScreen addPreferencesForType(final String accountType,
141            PreferenceScreen parent) {
142        return mAccountTypePreferenceLoader.addPreferencesForType(accountType, parent);
143    }
144
145    public void updateAuthDescriptions() {
146        mAuthenticatorHelper.updateAuthDescriptions(getActivity());
147        onAuthDescriptionsUpdated();
148    }
149
150    protected Drawable getDrawableForType(final String accountType) {
151        return mAuthenticatorHelper.getDrawableForType(getActivity(), accountType);
152    }
153
154    protected CharSequence getLabelForType(final String accountType) {
155        return mAuthenticatorHelper.getLabelForType(getActivity(), accountType);
156    }
157
158    protected String formatSyncDate(Date date) {
159        // TODO: Switch to using DateUtils.formatDateTime
160        return mDateFormat.format(date) + " " + mTimeFormat.format(date);
161    }
162}
163