package org.ebookdroid.ui.library.dialogs; import org.sufficientlysecure.viewer.R; import android.app.Dialog; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.util.SparseBooleanArray; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import org.emdev.common.backup.BackupInfo; import org.emdev.common.backup.BackupManager; import org.emdev.ui.actions.ActionController; import org.emdev.ui.actions.ActionEx; import org.emdev.ui.actions.ActionMethod; import org.emdev.utils.LayoutUtils; import org.emdev.utils.LengthUtils; public class BackupDlg extends Dialog implements TextWatcher, ListView.OnItemLongClickListener, ListView.OnItemClickListener { private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private final EditText newBackupNameEdit; private final Button backupButton; private final Button removeButton; private final Button restoreButton; private final ListView backupsList; private final BackupInfoAdapter adapter; private final ActionController<BackupDlg> actions = new ActionController<BackupDlg>(this); public BackupDlg(final Context context) { super(context); setTitle(R.string.menu_backupsettings); setContentView(R.layout.backup_screen); adapter = new BackupInfoAdapter(getContext(), BackupManager.getAvailableBackups()); newBackupNameEdit = (EditText) findViewById(R.id.newBackupNameEdit); newBackupNameEdit.addTextChangedListener(this); backupButton = (Button) findViewById(R.id.backupButton); actions.setActionForView(backupButton); restoreButton = (Button) findViewById(R.id.restoreBackupButton); actions.setActionForView(restoreButton); removeButton = (Button) findViewById(R.id.removeBackupButton); actions.setActionForView(removeButton); backupsList = (ListView) findViewById(R.id.backupsList); backupsList.setAdapter(adapter); backupsList.setOnItemClickListener(this); backupsList.setOnItemLongClickListener(this); updateControls(null); } @Override protected void onStart() { super.onStart(); LayoutUtils.maximizeWindow(getWindow()); } private void updateAdapter() { adapter.setNotifyOnChange(false); try { adapter.clear(); for (final BackupInfo info : BackupManager.getAvailableBackups()) { adapter.add(info); } } finally { adapter.setNotifyOnChange(true); adapter.notifyDataSetChanged(); } } private void updateControls(final String newBackupName) { final int checked = getCheckedPositionsCount(); backupButton.setEnabled(LengthUtils.isNotEmpty(newBackupName)); restoreButton.setEnabled(1 == checked); removeButton.setEnabled(0 < checked); } @ActionMethod(ids = R.id.backupButton) public void backup(final ActionEx action) { final BackupInfo backup = new BackupInfo(newBackupNameEdit.getText().toString()); BackupManager.backup(backup); newBackupNameEdit.setText(""); updateAdapter(); } @ActionMethod(ids = R.id.restoreBackupButton) public void restore(final ActionEx action) { if (getCheckedPositionsCount() == 1) { final int pos = getFirstCheckedPosition(); if (pos != -1) { final BackupInfo backup = adapter.getItem(pos); BackupManager.restore(backup); backupsList.clearChoices(); } } } @ActionMethod(ids = R.id.removeBackupButton) public void remove(final ActionEx action) { final SparseBooleanArray checked = backupsList.getCheckedItemPositions(); if (checked != null) { for (int i = 0, n = checked.size(); i < n; i++) { final int pos = checked.keyAt(i); final boolean state = checked.valueAt(i); if (pos >= 0 && pos < adapter.getCount() && state) { final BackupInfo backup = adapter.getItem(pos); BackupManager.remove(backup); } } updateAdapter(); backupsList.clearChoices(); } } @Override public void onTextChanged(final CharSequence s, final int start, final int before, final int count) { } @Override public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) { } @Override public void afterTextChanged(final Editable s) { updateControls(s.toString()); } @Override public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { updateControls(newBackupNameEdit.getText().toString()); } @Override public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) { return true; } protected int getCheckedPositionsCount() { final SparseBooleanArray checked = backupsList.getCheckedItemPositions(); int count = 0; for (int i = 0, n = checked != null ? checked.size() : 0; i < n; i++) { if (checked.valueAt(i)) { count++; } } return count; } protected int getFirstCheckedPosition() { final SparseBooleanArray checked = backupsList.getCheckedItemPositions(); for (int i = 0, n = checked != null ? checked.size() : 0; i < n; i++) { if (checked.valueAt(i)) { return checked.keyAt(i); } } return -1; } private static class BackupInfoAdapter extends ArrayAdapter<BackupInfo> { public BackupInfoAdapter(final Context context, final Collection<BackupInfo> objects) { super(context, R.layout.list_item, R.id.list_item, new ArrayList<BackupInfo>(objects)); } @Override public View getView(final int position, final View convertView, final ViewGroup parent) { final View view = super.getView(position, convertView, parent); final TextView text = (TextView) view.findViewById(R.id.list_item); final BackupInfo info = getItem(position); text.setText(SDF.format(info.getTimestamp()) + " " + info.name); return view; } } }