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.accounts.AuthenticatorDescription;
21import android.app.Activity;
22import android.content.ContentResolver;
23import android.content.Context;
24import android.content.SyncStatusObserver;
25import android.content.pm.PackageManager;
26import android.content.res.Resources;
27import android.content.res.Resources.Theme;
28import android.graphics.drawable.Drawable;
29import android.os.Bundle;
30import android.os.Handler;
31import android.os.UserHandle;
32import android.os.UserManager;
33import android.preference.PreferenceScreen;
34import android.text.format.DateFormat;
35import android.util.Log;
36import android.view.ContextThemeWrapper;
37
38import com.android.settings.SettingsPreferenceFragment;
39import com.android.settings.Utils;
40
41import java.util.ArrayList;
42import java.util.Date;
43
44class AccountPreferenceBase extends SettingsPreferenceFragment
45        implements AuthenticatorHelper.OnAccountsUpdateListener {
46
47    protected static final String TAG = "AccountSettings";
48
49    public static final String AUTHORITIES_FILTER_KEY = "authorities";
50    public static final String ACCOUNT_TYPES_FILTER_KEY = "account_types";
51
52    private final Handler mHandler = new Handler();
53
54    private UserManager mUm;
55    private Object mStatusChangeListenerHandle;
56    protected AuthenticatorHelper mAuthenticatorHelper;
57    protected UserHandle mUserHandle;
58
59    private java.text.DateFormat mDateFormat;
60    private java.text.DateFormat mTimeFormat;
61
62    @Override
63    public void onCreate(Bundle icicle) {
64        super.onCreate(icicle);
65        mUm = (UserManager) getSystemService(Context.USER_SERVICE);
66        final Activity activity = getActivity();
67        mUserHandle = Utils.getSecureTargetUser(activity.getActivityToken(), mUm, getArguments(),
68                activity.getIntent().getExtras());
69        mAuthenticatorHelper = new AuthenticatorHelper(activity, mUserHandle, mUm, this);
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        PreferenceScreen prefs = null;
143        if (mAuthenticatorHelper.containsAccountType(accountType)) {
144            AuthenticatorDescription desc = null;
145            try {
146                desc = mAuthenticatorHelper.getAccountTypeDescription(accountType);
147                if (desc != null && desc.accountPreferencesId != 0) {
148                    // Load the context of the target package, then apply the
149                    // base Settings theme (no references to local resources)
150                    // and create a context theme wrapper so that we get the
151                    // correct text colors. Control colors will still be wrong,
152                    // but there's not much we can do about it since we can't
153                    // reference local color resources.
154                    final Context targetCtx = getActivity().createPackageContextAsUser(
155                            desc.packageName, 0, mUserHandle);
156                    final Theme baseTheme = getResources().newTheme();
157                    baseTheme.applyStyle(com.android.settings.R.style.Theme_SettingsBase, true);
158                    final Context themedCtx = new ContextThemeWrapper(targetCtx, 0);
159                    themedCtx.getTheme().setTo(baseTheme);
160                    prefs = getPreferenceManager().inflateFromResource(themedCtx,
161                            desc.accountPreferencesId, parent);
162                }
163            } catch (PackageManager.NameNotFoundException e) {
164                Log.w(TAG, "Couldn't load preferences.xml file from " + desc.packageName);
165            } catch (Resources.NotFoundException e) {
166                Log.w(TAG, "Couldn't load preferences.xml file from " + desc.packageName);
167            }
168        }
169        return prefs;
170    }
171
172    public void updateAuthDescriptions() {
173        mAuthenticatorHelper.updateAuthDescriptions(getActivity());
174        onAuthDescriptionsUpdated();
175    }
176
177    protected Drawable getDrawableForType(final String accountType) {
178        return mAuthenticatorHelper.getDrawableForType(getActivity(), accountType);
179    }
180
181    protected CharSequence getLabelForType(final String accountType) {
182        return mAuthenticatorHelper.getLabelForType(getActivity(), accountType);
183    }
184
185    protected String formatSyncDate(Date date) {
186        // TODO: Switch to using DateUtils.formatDateTime
187        return mDateFormat.format(date) + " " + mTimeFormat.format(date);
188    }
189}
190