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;
221bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglioimport android.preference.SwitchPreference;
2343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.util.AttributeSet;
24167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhuimport android.util.Log;
2543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.view.View;
26fb6e1186ab0b967acf0a041dc0d2d6ea96c672b9Jason Monkimport android.view.ViewGroup;
2743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.widget.TextView;
287a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey
297a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.R;
307a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.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;
3943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
4043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
4143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * A mode for this preference where clicking does a one-time sync instead of
4243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * toggling whether the provider will do autosync.
4343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
4443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mOneTimeSyncMode = false;
455b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
461bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio    public SyncStateSwitchPreference(Context context, AttributeSet attrs) {
47fb6e1186ab0b967acf0a041dc0d2d6ea96c672b9Jason Monk        super(context, attrs, 0, R.style.SyncSwitchPreference);
4843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = null;
4943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = null;
5043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
521bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio    public SyncStateSwitchPreference(Context context, Account account, String authority) {
53fb6e1186ab0b967acf0a041dc0d2d6ea96c672b9Jason Monk        super(context, null, 0, R.style.SyncSwitchPreference);
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = account;
5543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = authority;
5643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
5943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void onBindView(View view) {
6043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super.onBindView(view);
617a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final AnimatedImageView syncActiveView = (AnimatedImageView) view.findViewById(
627a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                R.id.sync_active);
637a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final View syncFailedView = view.findViewById(R.id.sync_failed);
6443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
657a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean activeVisible = mIsActive || mIsPending;
667a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setVisibility(activeVisible ? View.VISIBLE : View.GONE);
677a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setAnimating(mIsActive);
6843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
697a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean failedVisible = mFailed && !activeVisible;
707a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncFailedView.setVisibility(failedVisible ? View.VISIBLE : View.GONE);
715b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
721bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio        View switchView = view.findViewById(com.android.internal.R.id.switchWidget);
7343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mOneTimeSyncMode) {
741bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio            switchView.setVisibility(View.GONE);
755b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
7643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            /*
7743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * Override the summary. Fill in the %1$s with the existing summary
7843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * (what ends up happening is the old summary is shown on the next
7943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * line).
8043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             */
8143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            TextView summary = (TextView) view.findViewById(android.R.id.summary);
8243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
8343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
841bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio            switchView.setVisibility(View.VISIBLE);
8543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
8643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
8743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
8843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
8943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the sync is active.
9043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isActive whether or not the sync is active
9143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
9243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setActive(boolean isActive) {
9343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsActive = isActive;
9443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
9543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
9643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
9743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
9843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether a sync is pending.
9943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isPending whether or not the sync is pending
10043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
10143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setPending(boolean isPending) {
10243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsPending = isPending;
10343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
10443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
10543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
10743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the corresponding sync failed.
10843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param failed whether or not the sync failed
10943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setFailed(boolean failed) {
11143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mFailed = failed;
11243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
11343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
11443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
11543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
11643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Sets whether the preference is in one-time sync mode.
11743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
11943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mOneTimeSyncMode = oneTimeSyncMode;
12043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
12143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
1225b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
12343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
12443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets whether the preference is in one-time sync mode.
12543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public boolean isOneTimeSyncMode() {
12743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mOneTimeSyncMode;
12843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
12943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
13043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
13143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onClick() {
13243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // When we're in one-time sync mode, we don't want a click to change the
1331bc996532ca5c53efaaa5718d7ba4d0ad9710571Fabrice Di Meglio        // Switch state
13443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (!mOneTimeSyncMode) {
135167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            if (ActivityManager.isUserAMonkey()) {
136167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                Log.d("SyncState", "ignoring monkey's attempt to flip sync state");
137167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            } else {
138167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                super.onClick();
139167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            }
1405b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert        }
14143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public Account getAccount() {
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAccount;
14543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public String getAuthority() {
14843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAuthority;
14943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
15043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani}
151