SyncStateCheckBoxPreference.java revision 43c697854c7e373fbc1dae8b7a5259a32de346b4
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
1943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport com.android.settings.R;
2043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
2143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.Context;
2243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.graphics.drawable.AnimationDrawable;
2343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.CheckBoxPreference;
2443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.util.AttributeSet;
2543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.view.View;
2643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.widget.ImageView;
2743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.widget.TextView;
2843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.accounts.Account;
2943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipublic class SyncStateCheckBoxPreference extends CheckBoxPreference {
3143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsActive = false;
3343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsPending = false;
3443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mFailed = false;
3543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private Account mAccount;
3643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private String mAuthority;
3743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
3943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * A mode for this preference where clicking does a one-time sync instead of
4043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * toggling whether the provider will do autosync.
4143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
4243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mOneTimeSyncMode = false;
4343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
4443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public SyncStateCheckBoxPreference(Context context, AttributeSet attrs) {
4543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super(context, attrs);
4643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        setWidgetLayoutResource(R.layout.preference_widget_sync_toggle);
4743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = null;
4843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = null;
4943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public SyncStateCheckBoxPreference(Context context, Account account, String authority) {
5243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super(context, null);
5343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = account;
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = authority;
5543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        setWidgetLayoutResource(R.layout.preference_widget_sync_toggle);
5643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
5943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void onBindView(View view) {
6043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super.onBindView(view);
6143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        ImageView syncActiveView = (ImageView) view.findViewById(R.id.sync_active);
6243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        View syncPendingView = view.findViewById(R.id.sync_pending);
6343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        View syncFailedView = view.findViewById(R.id.sync_failed);
6443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
6543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        syncActiveView.setVisibility(mIsActive ? View.VISIBLE : View.GONE);
6643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        final AnimationDrawable anim = (AnimationDrawable) syncActiveView.getDrawable();
6743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        boolean showError;
6843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        boolean showPending;
6943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mIsActive) {
7043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            syncActiveView.post(new Runnable() {
7143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                public void run() {
7243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    anim.start();
7343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                }
7443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            });
7543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            showPending = false;
7643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            showError = false;
7743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
7843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            anim.stop();
7943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            if (mIsPending) {
8043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                showPending = true;
8143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                showError = false;
8243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            } else {
8343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                showPending = false;
8443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                showError = mFailed;
8543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
8643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
8743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
8843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        syncFailedView.setVisibility(showError ? View.VISIBLE : View.GONE);
8943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        syncPendingView.setVisibility((showPending && !mIsActive) ? View.VISIBLE : View.GONE);
9043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
9143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        View checkBox = view.findViewById(android.R.id.checkbox);
9243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mOneTimeSyncMode) {
9343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            checkBox.setVisibility(View.GONE);
9443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
9543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            /*
9643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * Override the summary. Fill in the %1$s with the existing summary
9743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * (what ends up happening is the old summary is shown on the next
9843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * line).
9943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             */
10043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            TextView summary = (TextView) view.findViewById(android.R.id.summary);
10143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
10243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
10343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            checkBox.setVisibility(View.VISIBLE);
10443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
10543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
10643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
10843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the sync is active.
10943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isActive whether or not the sync is active
11043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setActive(boolean isActive) {
11243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsActive = isActive;
11343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
11443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
11543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
11643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
11743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether a sync is pending.
11843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isPending whether or not the sync is pending
11943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setPending(boolean isPending) {
12143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsPending = isPending;
12243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
12343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
12443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
12543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
12643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the corresponding sync failed.
12743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param failed whether or not the sync failed
12843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setFailed(boolean failed) {
13043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mFailed = failed;
13143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
13243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
13343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
13443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
13543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Sets whether the preference is in one-time sync mode.
13643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
13743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
13843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mOneTimeSyncMode = oneTimeSyncMode;
13943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
14043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets whether the preference is in one-time sync mode.
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
14543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public boolean isOneTimeSyncMode() {
14643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mOneTimeSyncMode;
14743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
15043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onClick() {
15143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // When we're in one-time sync mode, we don't want a click to change the
15243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // checkbox state
15343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (!mOneTimeSyncMode) {
15443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            super.onClick();
15543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
15643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
15743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
15843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public Account getAccount() {
15943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAccount;
16043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
16143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
16243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public String getAuthority() {
16343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAuthority;
16443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
16543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani}
166