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;
2243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.CheckBoxPreference;
2343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.util.AttributeSet;
24167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhuimport android.util.Log;
2543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.view.View;
2643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.widget.TextView;
277a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey
287a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.R;
297a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.widget.AnimatedImageView;
3043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipublic class SyncStateCheckBoxPreference extends CheckBoxPreference {
3243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsActive = false;
3443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsPending = false;
3543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mFailed = false;
3643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private Account mAccount;
3743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private String mAuthority;
3843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
4043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * A mode for this preference where clicking does a one-time sync instead of
4143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * toggling whether the provider will do autosync.
4243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
4343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mOneTimeSyncMode = false;
445b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
4543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public SyncStateCheckBoxPreference(Context context, AttributeSet attrs) {
4643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super(context, attrs);
4743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        setWidgetLayoutResource(R.layout.preference_widget_sync_toggle);
4843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = null;
4943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = null;
5043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public SyncStateCheckBoxPreference(Context context, Account account, String authority) {
5343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super(context, null);
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = account;
5543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = authority;
5643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        setWidgetLayoutResource(R.layout.preference_widget_sync_toggle);
5743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
6043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void onBindView(View view) {
6143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super.onBindView(view);
627a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final AnimatedImageView syncActiveView = (AnimatedImageView) view.findViewById(
637a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                R.id.sync_active);
647a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final View syncFailedView = view.findViewById(R.id.sync_failed);
6543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
667a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean activeVisible = mIsActive || mIsPending;
677a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setVisibility(activeVisible ? View.VISIBLE : View.GONE);
687a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setAnimating(mIsActive);
6943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
707a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean failedVisible = mFailed && !activeVisible;
717a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncFailedView.setVisibility(failedVisible ? View.VISIBLE : View.GONE);
725b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
7343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        View checkBox = view.findViewById(android.R.id.checkbox);
7443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mOneTimeSyncMode) {
7543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            checkBox.setVisibility(View.GONE);
765b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
7743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            /*
7843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * Override the summary. Fill in the %1$s with the existing summary
7943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * (what ends up happening is the old summary is shown on the next
8043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * line).
8143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             */
8243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            TextView summary = (TextView) view.findViewById(android.R.id.summary);
8343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
8443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
8543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            checkBox.setVisibility(View.VISIBLE);
8643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
8743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
8843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
8943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
9043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the sync is active.
9143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isActive whether or not the sync is active
9243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
9343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setActive(boolean isActive) {
9443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsActive = isActive;
9543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
9643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
9743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
9843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
9943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether a sync is pending.
10043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isPending whether or not the sync is pending
10143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
10243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setPending(boolean isPending) {
10343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsPending = isPending;
10443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
10543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
10643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
10843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the corresponding sync failed.
10943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param failed whether or not the sync failed
11043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setFailed(boolean failed) {
11243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mFailed = failed;
11343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
11443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
11543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
11643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
11743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Sets whether the preference is in one-time sync mode.
11843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
12043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mOneTimeSyncMode = oneTimeSyncMode;
12143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
12243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
1235b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
12443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
12543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets whether the preference is in one-time sync mode.
12643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public boolean isOneTimeSyncMode() {
12843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mOneTimeSyncMode;
12943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
13043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
13143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
13243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onClick() {
13343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // When we're in one-time sync mode, we don't want a click to change the
13443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // checkbox state
13543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (!mOneTimeSyncMode) {
136167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            if (ActivityManager.isUserAMonkey()) {
137167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                Log.d("SyncState", "ignoring monkey's attempt to flip sync state");
138167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            } else {
139167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                super.onClick();
140167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu            }
1415b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert        }
14243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public Account getAccount() {
14543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAccount;
14643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public String getAuthority() {
14943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAuthority;
15043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
15143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani}
152