143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani/*
243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Copyright (C) 2008 The Android Open Source Project
343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *
443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * you may not use this file except in compliance with the License.
643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * You may obtain a copy of the License at
743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *
843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *
1043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Unless required by applicable law or agreed to in writing, software
1143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
1243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * See the License for the specific language governing permissions and
1443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * limitations under the License.
1543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani */
1643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
1743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipackage com.android.settings.accounts;
1843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
197a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport android.accounts.Account;
20167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhuimport android.app.ActivityManager;
2143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.Context;
2239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v14.preference.SwitchPreference;
2339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceViewHolder;
2443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.util.AttributeSet;
25167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhuimport android.util.Log;
2643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.view.View;
2743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.widget.TextView;
287a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey
297a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.R;
30b280b0a892bf258e68ed5483f93f91da20e0103dTony Mantlerimport com.android.settingslib.widget.AnimatedImageView;
3143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
321bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Megliopublic class SyncStateSwitchPreference extends SwitchPreference {
3343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsActive = false;
3543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsPending = false;
3643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mFailed = false;
3743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private Account mAccount;
3843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private String mAuthority;
396f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    private String mPackageName;
406f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    private int mUid;
4143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
4243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
4343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * A mode for this preference where clicking does a one-time sync instead of
4443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * toggling whether the provider will do autosync.
4543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
4643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mOneTimeSyncMode = false;
475b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
481bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio    public SyncStateSwitchPreference(Context context, AttributeSet attrs) {
49fb6e1186ab0b967acf0a041dc0d2d6ea96c672b9Jason Monk        super(context, attrs, 0, R.style.SyncSwitchPreference);
5043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = null;
5143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = null;
526f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        mPackageName = null;
536f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        mUid = 0;
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
566f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    public SyncStateSwitchPreference(Context context, Account account, String authority,
576f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov            String packageName, int uid) {
58fb6e1186ab0b967acf0a041dc0d2d6ea96c672b9Jason Monk        super(context, null, 0, R.style.SyncSwitchPreference);
596f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        setup(account, authority, packageName, uid);
60cd66b4a99fca502d2fd67e9182787c184eb0fce3Jason Monk    }
61cd66b4a99fca502d2fd67e9182787c184eb0fce3Jason Monk
626f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    public void setup(Account account, String authority, String packageName, int uid) {
6343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = account;
6443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = authority;
656f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        mPackageName = packageName;
666f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        mUid = uid;
67cd66b4a99fca502d2fd67e9182787c184eb0fce3Jason Monk        notifyChanged();
6843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
6943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
7043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
7139b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public void onBindViewHolder(PreferenceViewHolder view) {
7239b467482d1bf256a111c757e9b7621c6f523271Jason Monk        super.onBindViewHolder(view);
737a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final AnimatedImageView syncActiveView = (AnimatedImageView) view.findViewById(
747a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                R.id.sync_active);
757a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final View syncFailedView = view.findViewById(R.id.sync_failed);
7643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
777a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean activeVisible = mIsActive || mIsPending;
787a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setVisibility(activeVisible ? View.VISIBLE : View.GONE);
797a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setAnimating(mIsActive);
8043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
817a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean failedVisible = mFailed && !activeVisible;
827a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncFailedView.setVisibility(failedVisible ? View.VISIBLE : View.GONE);
835b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
8452a302e81b93d4067ab09ae1b0eaeecbbda6b6aaJason Monk        View switchView = view.findViewById(com.android.internal.R.id.switch_widget);
8543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mOneTimeSyncMode) {
861bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio            switchView.setVisibility(View.GONE);
875b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
8843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            /*
8943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * Override the summary. Fill in the %1$s with the existing summary
9043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * (what ends up happening is the old summary is shown on the next
9143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * line).
9243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             */
9343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            TextView summary = (TextView) view.findViewById(android.R.id.summary);
9443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
9543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
961bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio            switchView.setVisibility(View.VISIBLE);
9743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
9843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
9943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
10143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the sync is active.
10243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isActive whether or not the sync is active
10343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
10443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setActive(boolean isActive) {
10543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsActive = isActive;
10643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
10743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
10843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
11043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether a sync is pending.
11143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isPending whether or not the sync is pending
11243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setPending(boolean isPending) {
11443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsPending = isPending;
11543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
11643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
11743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
11843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
11943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the corresponding sync failed.
12043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param failed whether or not the sync failed
12143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setFailed(boolean failed) {
12343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mFailed = failed;
12443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
12543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
12643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
12743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
12843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Sets whether the preference is in one-time sync mode.
12943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
13043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
13143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mOneTimeSyncMode = oneTimeSyncMode;
13243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
13343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
1345b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
13543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
13643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets whether the preference is in one-time sync mode.
13743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
13843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public boolean isOneTimeSyncMode() {
13943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mOneTimeSyncMode;
14043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onClick() {
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // When we're in one-time sync mode, we don't want a click to change the
1451bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio        // Switch state
14643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (!mOneTimeSyncMode) {
147167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            if (ActivityManager.isUserAMonkey()) {
148167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                Log.d("SyncState", "ignoring monkey's attempt to flip sync state");
149167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            } else {
150167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                super.onClick();
151167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            }
1525b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert        }
15343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
15443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
15543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public Account getAccount() {
15643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAccount;
15743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
15843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
15943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public String getAuthority() {
16043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAuthority;
16143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
1626f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov
1636f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    public String getPackageName() {
1646f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        return mPackageName;
1656f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    };
1666f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov
1676f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    public int getUid() {
1686f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov        return mUid;
1696f9bf1da903a8607bcaa03a92f1c610e2ad49d74Svetoslav Ganov    };
17043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani}
171