package com.zegoggles.smssync.activity; import android.preference.Preference; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.squareup.otto.Subscribe; import com.zegoggles.smssync.App; import com.zegoggles.smssync.R; import com.zegoggles.smssync.mail.DataType; import com.zegoggles.smssync.preferences.AuthPreferences; import com.zegoggles.smssync.preferences.Preferences; import com.zegoggles.smssync.service.SmsBackupService; import com.zegoggles.smssync.service.SmsRestoreService; import com.zegoggles.smssync.service.UserCanceled; import com.zegoggles.smssync.service.state.BackupState; import com.zegoggles.smssync.service.state.RestoreState; import com.zegoggles.smssync.service.state.SmsSyncState; import com.zegoggles.smssync.service.state.State; import static com.zegoggles.smssync.App.LOCAL_LOGV; import static com.zegoggles.smssync.App.TAG; class StatusPreference extends Preference implements View.OnClickListener { private View mView; private Button mBackupButton; private Button mRestoreButton; private ImageView mStatusIcon; private TextView mStatusLabel; private TextView mSyncDetailsLabel; private ProgressBar mProgressBar; private MainActivity mainActivity; public StatusPreference(MainActivity mainActivity) { super(mainActivity); this.mainActivity = mainActivity; setSelectable(false); setOrder(0); } @Override public void onClick(View v) { if (v == mBackupButton) { if (!SmsBackupService.isServiceWorking()) { if (LOCAL_LOGV) Log.v(TAG, "user requested sync"); mainActivity.performAction(MainActivity.Actions.Backup); } else { if (LOCAL_LOGV) Log.v(TAG, "user requested cancel"); // Sync button will be restored on next status update. mBackupButton.setText(R.string.ui_sync_button_label_canceling); mBackupButton.setEnabled(false); App.bus.post(new UserCanceled()); } } else if (v == mRestoreButton) { if (LOCAL_LOGV) Log.v(TAG, "restore"); if (!SmsRestoreService.isServiceWorking()) { mainActivity.performAction(MainActivity.Actions.Restore); } else { mRestoreButton.setText(R.string.ui_sync_button_label_canceling); mRestoreButton.setEnabled(false); App.bus.post(new UserCanceled()); } } } @Override public View getView(View convertView, ViewGroup parent) { if (mView == null) { mView = mainActivity.getLayoutInflater().inflate(R.layout.status, parent, false); mBackupButton = (Button) mView.findViewById(R.id.sync_button); mBackupButton.setOnClickListener(this); mRestoreButton = (Button) mView.findViewById(R.id.restore_button); mRestoreButton.setOnClickListener(this); mStatusIcon = (ImageView) mView.findViewById(R.id.status_icon); mStatusLabel = (TextView) mView.findViewById(R.id.status_label); View mSyncDetails = mView.findViewById(R.id.details_sync); mSyncDetailsLabel = (TextView) mSyncDetails.findViewById(R.id.details_sync_label); mProgressBar = (ProgressBar) mSyncDetails.findViewById(R.id.details_sync_progress); idle(); } return mView; } @Subscribe public void restoreStateChanged(final RestoreState newState) { if (App.LOCAL_LOGV) Log.v(TAG, "restoreStateChanged:" + newState); if (mView == null) return; stateChanged(newState); switch (newState.state) { case RESTORE: mBackupButton.setEnabled(false); mRestoreButton.setText(R.string.ui_restore_button_label_restoring); mStatusLabel.setText(R.string.status_restore); mSyncDetailsLabel.setText(newState.getNotificationLabel(getContext().getResources())); mProgressBar.setIndeterminate(false); mProgressBar.setProgress(newState.currentRestoredCount); mProgressBar.setMax(newState.itemsToRestore); break; case FINISHED_RESTORE: finishedRestore(newState); break; case CANCELED_RESTORE: mStatusLabel.setText(R.string.status_canceled); mSyncDetailsLabel.setText(getContext().getString(R.string.status_restore_canceled_details, newState.currentRestoredCount, newState.itemsToRestore)); break; case UPDATING_THREADS: mProgressBar.setIndeterminate(true); mSyncDetailsLabel.setText(getContext().getString(R.string.status_updating_threads)); break; } } @Subscribe public void backupStateChanged(final BackupState newState) { if (App.LOCAL_LOGV) Log.v(TAG, "backupStateChanged:"+newState); if (mView == null || newState.backupType.isBackground()) return; stateChanged(newState); switch (newState.state) { case FINISHED_BACKUP: finishedBackup(newState); break; case BACKUP: mRestoreButton.setEnabled(false); mBackupButton.setText(R.string.ui_sync_button_label_syncing); mStatusLabel.setText(R.string.status_backup); mSyncDetailsLabel.setText(newState.getNotificationLabel(getContext().getResources())); mProgressBar.setIndeterminate(false); mProgressBar.setProgress(newState.currentSyncedItems); mProgressBar.setMax(newState.itemsToSync); break; case CANCELED_BACKUP: mStatusLabel.setText(R.string.status_canceled); mSyncDetailsLabel.setText(getContext().getString(R.string.status_canceled_details, newState.currentSyncedItems, newState.itemsToSync)); break; } } private void authFailed() { mStatusLabel.setText(R.string.status_auth_failure); if (new AuthPreferences(getContext()).useXOAuth()) { mSyncDetailsLabel.setText(R.string.status_auth_failure_details_xoauth); } else { mSyncDetailsLabel.setText(R.string.status_auth_failure_details_plain); } } private void calc() { mStatusLabel.setText(R.string.status_working); mSyncDetailsLabel.setText(R.string.status_calc_details); mProgressBar.setIndeterminate(true); } private void finishedBackup(BackupState state) { int backedUpCount = state.currentSyncedItems; String text = null; if (backedUpCount == new Preferences(getContext()).getMaxItemsPerSync()) { text = getContext().getString(R.string.status_backup_done_details_max_per_sync, backedUpCount); } else if (backedUpCount > 0) { text = getContext().getResources().getQuantityString(R.plurals.status_backup_done_details, backedUpCount, backedUpCount); } else if (backedUpCount == 0) { text = getContext().getString(R.string.status_backup_done_details_noitems); } mSyncDetailsLabel.setText(text); mStatusLabel.setText(R.string.status_done); mStatusLabel.setTextColor(getContext().getResources().getColor(R.color.status_done)); } private void finishedRestore(RestoreState newState) { mStatusLabel.setTextColor(getContext().getResources().getColor(R.color.status_done)); mStatusLabel.setText(R.string.status_done); mSyncDetailsLabel.setText(getContext().getResources().getQuantityString( R.plurals.status_restore_done_details, newState.actualRestoredCount, newState.actualRestoredCount, newState.duplicateCount)); } private void idle() { mSyncDetailsLabel.setText(mainActivity.getLastSyncText(DataType.getMostRecentSyncedDate(mainActivity))); mStatusLabel.setText(R.string.status_idle); } private void stateChanged(State state) { setViewAttributes(state.state); switch (state.state) { case INITIAL: idle(); break; case LOGIN: mStatusLabel.setText(R.string.status_working); mSyncDetailsLabel.setText(R.string.status_login_details); mProgressBar.setIndeterminate(true); break; case CALC: calc(); break; case ERROR: if (state.isAuthException()) { authFailed(); } else { final String errorMessage = state.getErrorMessage(getContext().getResources()); mStatusLabel.setText(R.string.status_unknown_error); mSyncDetailsLabel.setText(getContext().getString(R.string.status_unknown_error_details, errorMessage == null ? "N/A" : errorMessage)); } break; } } private void setViewAttributes(final SmsSyncState state) { switch (state) { case LOGIN: case CALC: case BACKUP: case RESTORE: mStatusLabel.setTextColor(getContext().getResources().getColor(R.color.status_sync)); mStatusIcon.setImageResource(R.drawable.ic_syncing); break; case ERROR: mProgressBar.setProgress(0); mProgressBar.setIndeterminate(false); mStatusLabel.setTextColor(getContext().getResources().getColor(R.color.status_error)); mStatusIcon.setImageResource(R.drawable.ic_error); setButtonsToDefault(); break; default: mProgressBar.setProgress(0); mProgressBar.setIndeterminate(false); mStatusLabel.setTextColor(getContext().getResources().getColor(R.color.status_idle)); mStatusIcon.setImageResource(R.drawable.ic_idle); setButtonsToDefault(); break; } } private void setButtonsToDefault() { mRestoreButton.setEnabled(true); mRestoreButton.setText(R.string.ui_restore_button_label_idle); mBackupButton.setEnabled(true); mBackupButton.setText(R.string.ui_sync_button_label_idle); } }