package com.rackspacecloud.android;
import org.apache.http.HttpResponse;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Spinner;
import com.rackspace.cloud.android.R;
import com.rackspace.cloud.servers.api.client.Backup;
import com.rackspace.cloud.servers.api.client.BackupManager;
import com.rackspace.cloud.servers.api.client.CloudServersException;
import com.rackspace.cloud.servers.api.client.Server;
import com.rackspace.cloud.servers.api.client.ServerManager;
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
public class BackupServerActivity extends CloudActivity implements OnItemSelectedListener, OnClickListener {
private Server server;
private Backup backup;
private Spinner weeklyBackupSpinner;
private Spinner dailyBackupSpinner;
private CheckBox enableCheckBox;
private String selectedWeeklyBackup;
private String selectedDailyBackup;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
restoreState(savedInstanceState);
}
protected void restoreState(Bundle state){
super.restoreState(state);
server = (Server) this.getIntent().getExtras().get("server");
setContentView(R.layout.viewbackup);
setupSpinners();
setupButtons();
setupCheckBox();
if(state != null && state.containsKey("backup")){
backup = (Backup)state.getSerializable("backup");
if(backup == null){
loadData();
} else {
displayData();
}
} else {
loadData();
}
}
@Override
protected void onSaveInstanceState(Bundle state){
state.putSerializable("backup", backup);
}
private void setupSpinners(){
weeklyBackupSpinner = (Spinner) findViewById(R.id.weekly_backup_spinner);
ArrayAdapter<CharSequence> weeklyAdapter = ArrayAdapter.createFromResource(this, R.array.weeklyBackupValues, android.R.layout.simple_spinner_item);
weeklyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
weeklyBackupSpinner.setAdapter(weeklyAdapter);
weeklyBackupSpinner.setOnItemSelectedListener(this);
dailyBackupSpinner = (Spinner) findViewById(R.id.daily_backup_spinner);
ArrayAdapter<CharSequence> dailyAdapter = ArrayAdapter.createFromResource(this, R.array.dailyBackupValues, android.R.layout.simple_spinner_item);
dailyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
dailyBackupSpinner.setAdapter(dailyAdapter);
dailyBackupSpinner.setOnItemSelectedListener(this);
}
private void setupButtons() {
Button update = (Button) findViewById(R.id.backup_update_button);
update.setOnClickListener(this);
}
private void setupCheckBox(){
enableCheckBox = (CheckBox) findViewById(R.id.enable_backup_checkbox);
}
private void displayData(){
if(backup != null){
enableCheckBox.setChecked(backup.getEnable());
if(backup.getWeekly() != null){
weeklyBackupSpinner.setSelection(Backup.getWeeklyIndex(backup.getWeekly()));
}
if(backup.getDaily() != null){
dailyBackupSpinner.setSelection(Backup.getDailyIndex(backup.getDaily()));
}
}
}
public void onClick(View v) {
/*
* server maybe null if another task is
* currently processing
*/
if(server == null){
showAlert("Error", "Server is busy.");
}
else{
trackEvent(GoogleAnalytics.CATEGORY_SERVER, GoogleAnalytics.EVENT_BACKUP, "", -1);
new BackupServerTask().execute((Void[]) null);
}
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
if(parent == weeklyBackupSpinner){
selectedWeeklyBackup = Backup.getWeeklyValue(pos);
}
if(parent == dailyBackupSpinner){
selectedDailyBackup = Backup.getDailyValue(pos);
}
}
public void onNothingSelected(AdapterView<?> parent) {
//do nothing
}
private void loadData(){
new GetBackUpTask().execute((Void[]) null);
}
private class GetBackUpTask extends AsyncTask<Void, Void, Backup> {
private CloudServersException exception;
@Override
//let user know their process has started
protected void onPreExecute(){
showDialog();
}
@Override
protected Backup doInBackground(Void... arg0) {
try {
return (new BackupManager()).getBackup(server, getContext());
} catch (CloudServersException e) {
exception = e;
}
return null;
}
@Override
protected void onPostExecute(Backup result) {
hideDialog();
if (exception != null) {
showAlert("Error", exception.getMessage());
} else {
backup = new Backup();
backup.setEnabled(result.getEnable());
backup.setWeekly(result.getWeekly());
backup.setDaily(result.getDaily());
displayData();
}
}
}
private class BackupServerTask extends AsyncTask<Void, Void, HttpBundle> {
private CloudServersException exception;
@Override
//let user know their process has started
protected void onPreExecute(){
showToast("Changing backup schedule process has begun");
}
@Override
protected HttpBundle doInBackground(Void... arg0) {
HttpBundle bundle = null;
try {
bundle = (new ServerManager()).backup(server, selectedWeeklyBackup, selectedDailyBackup, enableCheckBox.isChecked(), getApplicationContext());
} catch (CloudServersException e) {
exception = e;
}
return bundle;
}
@Override
protected void onPostExecute(HttpBundle bundle) {
HttpResponse response = bundle.getResponse();
if (response != null) {
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == 204 || statusCode == 202){
showToast("The server's backup schedule has been change.");
finish();
}
else if (statusCode != 204 && statusCode != 202) {
CloudServersException cse = parseCloudServersException(response);
if ("".equals(cse.getMessage())) {
showError("There was a problem changing the backup schedule.", bundle);
} else {
showError("There was a problem changing the backup schedule: " + cse.getMessage() + " " + statusCode, bundle);
}
}
} else if (exception != null) {
showError("There was a problem changing the backup schedule: " + exception.getMessage(), bundle);
}
}
}
}