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;
2043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.Context;
2143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.CheckBoxPreference;
2243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.util.AttributeSet;
2343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.view.View;
2443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.widget.TextView;
257a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey
267a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.R;
277a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkeyimport com.android.settings.widget.AnimatedImageView;
2843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
2943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipublic class SyncStateCheckBoxPreference extends CheckBoxPreference {
3043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsActive = false;
3243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mIsPending = false;
3343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mFailed = false;
3443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private Account mAccount;
3543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private String mAuthority;
3643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
3743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
3843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * A mode for this preference where clicking does a one-time sync instead of
3943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * toggling whether the provider will do autosync.
4043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
4143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private boolean mOneTimeSyncMode = false;
425b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
4343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public SyncStateCheckBoxPreference(Context context, AttributeSet attrs) {
4443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super(context, attrs);
4543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        setWidgetLayoutResource(R.layout.preference_widget_sync_toggle);
4643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = null;
4743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = null;
4843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
4943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public SyncStateCheckBoxPreference(Context context, Account account, String authority) {
5143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super(context, null);
5243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAccount = account;
5343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAuthority = authority;
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        setWidgetLayoutResource(R.layout.preference_widget_sync_toggle);
5543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
5643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
5743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
5843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void onBindView(View view) {
5943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super.onBindView(view);
607a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final AnimatedImageView syncActiveView = (AnimatedImageView) view.findViewById(
617a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                R.id.sync_active);
627a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final View syncFailedView = view.findViewById(R.id.sync_failed);
6343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
647a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean activeVisible = mIsActive || mIsPending;
657a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setVisibility(activeVisible ? View.VISIBLE : View.GONE);
667a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncActiveView.setAnimating(mIsActive);
6743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
687a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        final boolean failedVisible = mFailed && !activeVisible;
697a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey        syncFailedView.setVisibility(failedVisible ? View.VISIBLE : View.GONE);
705b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
7143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        View checkBox = view.findViewById(android.R.id.checkbox);
7243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mOneTimeSyncMode) {
7343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            checkBox.setVisibility(View.GONE);
745b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
7543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            /*
7643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * Override the summary. Fill in the %1$s with the existing summary
7743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * (what ends up happening is the old summary is shown on the next
7843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             * line).
7943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani             */
8043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            TextView summary = (TextView) view.findViewById(android.R.id.summary);
8143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
8243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
8343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            checkBox.setVisibility(View.VISIBLE);
8443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
8543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
8643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
8743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
8843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the sync is active.
8943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isActive whether or not the sync is active
9043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
9143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setActive(boolean isActive) {
9243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsActive = isActive;
9343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
9443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
9543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
9643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
9743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether a sync is pending.
9843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param isPending whether or not the sync is pending
9943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
10043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setPending(boolean isPending) {
10143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mIsPending = isPending;
10243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
10343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
10443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
10643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Set whether the corresponding sync failed.
10743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param failed whether or not the sync failed
10843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
10943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setFailed(boolean failed) {
11043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mFailed = failed;
11143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
11243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
11343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
11443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
11543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Sets whether the preference is in one-time sync mode.
11643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
11743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
11843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mOneTimeSyncMode = oneTimeSyncMode;
11943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        notifyChanged();
12043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
1215b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert
12243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
12343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets whether the preference is in one-time sync mode.
12443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public boolean isOneTimeSyncMode() {
12643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mOneTimeSyncMode;
12743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
12843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
12943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
13043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onClick() {
13143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // When we're in one-time sync mode, we don't want a click to change the
13243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // checkbox state
13343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (!mOneTimeSyncMode) {
13443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            super.onClick();
1355b6983049db6ca926ddb944188cf8e95871a47ecAlon Albert        }
13643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
13743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
13843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public Account getAccount() {
13943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAccount;
14043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public String getAuthority() {
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAuthority;
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
14543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani}
146