package com.rackspacecloud.android;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.rackspace.cloud.android.R;
import com.rackspace.cloud.files.api.client.Container;
import com.rackspace.cloud.files.api.client.ContainerManager;
import com.rackspace.cloud.servers.api.client.CloudServersException;
/**
*
* @author Phillip Toohill
*
*/
public class ListContainerActivity extends GaListActivity {
protected static final int DELETE_ID = 0;
private Container[] containers;
public Container container;
public Container cdnContainer;
public String[] containerNames;
public Object megaBytes;
public Object kiloBytes;
public int bConver = 1048576;
public int kbConver = 1024;
private Context context;
private boolean loading;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
trackPageView(GoogleAnalytics.PAGE_CONTAINERS);
context = getApplicationContext();
restoreState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("container", containers);
outState.putBoolean("loading", loading);
}
private void restoreState(Bundle state) {
if(state != null && state.containsKey("loading") && state.getBoolean("loading")){
loadContainers();
registerForContextMenu(getListView());
}
else if (state != null && state.containsKey("container") && state.getSerializable("container") != null) {
containers = (Container[]) state.getSerializable("container");
if (containers.length == 0) {
displayNoServersCell();
} else {
getListView().setDividerHeight(1); // restore divider lines
setListAdapter(new FileAdapter());
}
} else {
loadContainers();
registerForContextMenu(getListView());
}
}
protected void onListItemClick(ListView l, View v, int position, long id) {
if (containers != null && containers.length > 0) {
Intent viewIntent = new Intent(this, ContainerObjectsActivity.class);
viewIntent.putExtra("container", containers[position]);
startActivityForResult(viewIntent, 55);
}
}
private void loadContainers() {
displayLoadingCell();
new LoadContainersTask().execute((Void[]) null);
}
private void setContainerList() {
if (containerNames == null || containerNames.length == 0) {
displayNoServersCell();
} else {
getListView().setDividerHeight(1); // restore divider lines
setListAdapter(new FileAdapter());
}
}
private void displayLoadingCell() {
String a[] = new String[1];
a[0] = "Loading...";
setListAdapter(new ArrayAdapter<String>(this, R.layout.loadingcell,
R.id.loading_label, a));
getListView().setTextFilterEnabled(true);
getListView().setDividerHeight(0); // hide the dividers so it won't look
// like a list row
getListView().setItemsCanFocus(false);
}
private void displayNoServersCell() {
String a[] = new String[1];
a[0] = "No Containers";
setListAdapter(new ArrayAdapter<String>(this,
R.layout.nocontainerscell, R.id.no_containers_label, a));
getListView().setTextFilterEnabled(true);
getListView().setDividerHeight(0); // hide the dividers so it won't look
// like a list row
getListView().setItemsCanFocus(false);
}
private void showAlert(String title, String message) {
// Can't create handler inside thread that has not called
// Looper.prepare()
// Looper.prepare();
try {
AlertDialog alert = new AlertDialog.Builder(this).create();
alert.setTitle(title);
alert.setMessage(message);
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
alert.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private class LoadContainersTask extends
AsyncTask<Void, Void, ArrayList<Container>> {
private CloudServersException exception;
@Override
protected void onPreExecute(){
loading = true;
}
@Override
protected ArrayList<Container> doInBackground(Void... arg0) {
ArrayList<Container> containers = null;
try {
containers = (new ContainerManager(context)).createList(true);
} catch (CloudServersException e) {
exception = e;
}
return containers;
}
@Override
protected void onPostExecute(ArrayList<Container> result) {
if (exception != null) {
showAlert("Error", exception.getMessage());
}
ArrayList<Container> containerList = result;
if (containerList != null) {
containerNames = new String[containerList.size()];
containers = new Container[containerList.size()];
for (int i = 0; i < containerList.size(); i++) {
Container container = containerList.get(i);
containers[i] = container;
containerNames[i] = container.getName();
}
}
loading = false;
new LoadCDNContainersTask().execute((Void[]) null);
}
}
private class LoadCDNContainersTask extends
AsyncTask<Void, Void, ArrayList<Container>> {
private CloudServersException exception;
@Override
protected void onPreExecute(){
loading = true;
}
@Override
protected ArrayList<Container> doInBackground(Void... arg0) {
ArrayList<Container> cdnContainers = null;
try {
cdnContainers = (new ContainerManager(context)).createCDNList(true);
} catch (CloudServersException e) {
exception = e;
}
return cdnContainers;
}
@Override
protected void onPostExecute(ArrayList<Container> result) {
if (exception != null) {
showAlert("Error", exception.getMessage());
}
ArrayList<Container> cdnContainers = result;
if (containers != null && cdnContainers != null) {
for (int i = 0; i < containers.length; i++) {
Container container = containers[i];
for (int t = 0; t < cdnContainers.size(); t++) {
Container cdnContainer = cdnContainers.get(t);
if (container.getName().equals(cdnContainer.getName())) {
container.setCdnEnabled(cdnContainer.isCdnEnabled());
container.setCdnUrl(cdnContainer.getCdnUrl());
container.setTtl(cdnContainer.getTtl());
}
}
}
}
setContainerList();
loading = false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.container_list_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_container:
startActivityForResult(
new Intent(this, AddContainerActivity.class), 56); // arbitrary number never used again
return true;
case R.id.refresh:
containers = null;
loadContainers();
return true;
}
return false;
}
class FileAdapter extends ArrayAdapter<Container> {
FileAdapter() {
super(ListContainerActivity.this, R.layout.listcontainerscell,
containers);
}
public View getView(int position, View convertView, ViewGroup parent) {
Container container = containers[position];
LayoutInflater inflater = getLayoutInflater();
View row = inflater.inflate(R.layout.listcontainerscell, parent,
false);
TextView label = (TextView) row.findViewById(R.id.label);
label.setText(container.getName());
if (container.getBytes() >= bConver) {
megaBytes = Math.abs(container.getBytes() / bConver + 0.2);
TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
sublabel.setText(container.getCount() + " Objects " + megaBytes
+ " MB");
} else if (container.getBytes() >= kbConver) {
kiloBytes = Math.abs(container.getBytes() / kbConver + 0.2);
TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
sublabel.setText(container.getCount() + " Objects " + kiloBytes
+ " KB");
} else {
TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
sublabel.setText(container.getCount() + " Objects "
+ container.getBytes() + " B");
}
return (row);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// a sub-activity kicked back, so we want to refresh the server list
loadContainers();
}
}
}