package com.jadn.cc.ui;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.jadn.cc.R;
import com.jadn.cc.core.CarCastApplication;
import com.jadn.cc.core.ExternalMediaStatus;
import com.jadn.cc.core.Subscription;
import com.jadn.cc.core.Util;
import com.jadn.cc.services.DownloadHistory;
/**
* A good video about listview http://code.google.com/events/io/2010/sessions/world-of-listview-android.html
*
* Although right now Subscriptions is using a very simple approach
*/
public class Subscriptions extends BaseActivity {
private static final String DISABLE_SUBSCRIPTION = "Disable";
private static final String ENABLE_SUBSCRIPTION = "Enable";
private static final String DELETE_SUBSCRIPTION = "Delete";
private static final String EDIT_SUBSCRIPTION = "Edit";
private static final String ERASE_SUBSCRIPTIONS_S_HISTORY = "Erase History";
SimpleAdapter listAdapter;
ListView listView;
List<Map<String, Object>> subscriptions = new ArrayList<Map<String, Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.subscription_list);
setTitle(CarCastApplication.getAppTitle() + ": Subscriptions");
listView = (ListView) findViewById(R.id.siteList);
registerForContextMenu(listView);
ExternalMediaStatus status = ExternalMediaStatus.getExternalMediaStatus();
if (status == ExternalMediaStatus.unavailable) {
Toast.makeText(getApplicationContext(), "Unable to read subscriptions from sdcard", Toast.LENGTH_LONG);
return;
}
listAdapter = new SimpleAdapter(this, subscriptions, R.layout.main_item_two_line_row2, new String[] { "name", "enabled" },
new int[] { R.id.text1, R.id.text2 });
listView.setAdapter(listAdapter);
}
// Invoked when returning from a subscription edit
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
reloadSubscriptions();
}
// Invoked when the background service is bound (hooked up) to this Activity
@Override
protected void onContentService() {
reloadSubscriptions();
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Map<?, ?> rowData = (Map<?, ?>) listView.getAdapter().getItem(info.position);
Subscription sub = (Subscription) rowData.get("subscription");
if (item.getTitle().equals(DISABLE_SUBSCRIPTION) || item.getTitle().equals(ENABLE_SUBSCRIPTION)) {
contentService.toggleSubscription(sub);
reloadSubscriptions();
Subscriptions.this.listAdapter.notifyDataSetChanged();
return true;
} else if (item.getTitle().equals(DELETE_SUBSCRIPTION)) {
contentService.deleteSubscription(sub);
Subscriptions.this.subscriptions.remove(info.position);
Subscriptions.this.listAdapter.notifyDataSetChanged();
return true;
} else if (item.getTitle().equals(EDIT_SUBSCRIPTION)) {
Intent intent = new Intent(this, SubscriptionEdit.class);
intent.putExtra("subscription", sub);
startActivityForResult(intent, info.position);
} else if (item.getTitle().equals(ERASE_SUBSCRIPTIONS_S_HISTORY)) {
int erasedPodcasts = new DownloadHistory(getApplicationContext()).eraseHistory(sub.name);
Util.toast(this, "Removed " + erasedPodcasts + " podcasts from download history.");
}
return true;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
Map<?, ?> rowData = (Map<?, ?>) listView.getAdapter().getItem(info.position);
Subscription sub = (Subscription) rowData.get("subscription");
menu.setHeaderTitle(sub.name);
if (sub.enabled)
menu.add(DISABLE_SUBSCRIPTION);
else
menu.add(ENABLE_SUBSCRIPTION);
menu.add(EDIT_SUBSCRIPTION);
menu.add(DELETE_SUBSCRIPTION);
menu.add(ERASE_SUBSCRIPTIONS_S_HISTORY);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.edit_subscription_menu, menu);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (item.getItemId() == R.id.addSubscription) {
Intent addIntent = new Intent(this, SubscriptionEdit.class);
addIntent.putExtra("focus", "This value is ignored; only the presence of the key matters.");
startActivityForResult(addIntent, Integer.MAX_VALUE);
return true;
}
if (item.getItemId() == R.id.deleteAllSubscriptions) {
new AlertDialog.Builder(Subscriptions.this).setIcon(android.R.drawable.ic_dialog_alert).setMessage("Delete All Subscriptions?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
contentService.deleteAllSubscriptions();
reloadSubscriptions();
}
}).setNegativeButton("Cancel", null).show();
}
if (item.getItemId() == R.id.resetToDemoSubscriptions) {
new AlertDialog.Builder(Subscriptions.this).setIcon(android.R.drawable.ic_dialog_alert)
.setMessage("Reset to Demo Subscriptions (will delete all current subscriptions)?")
.setPositiveButton("Reset to Demos", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
contentService.resetToDemoSubscriptions();
reloadSubscriptions();
}
}).setNegativeButton("Cancel", null).show();
return true;
}
if (item.getItemId() == R.id.search) {
startActivityForResult(new Intent(this, Search.class), Integer.MAX_VALUE);
return true;
}
if (item.getItemId() == R.id.export) {
exportOpml();
}
if (item.getItemId() == R.id.importx) {
startActivityForResult(new Intent(this, OpmlLocator.class), 0);
}
return super.onMenuItemSelected(featureId, item);
}
protected void reloadSubscriptions() {
subscriptions.clear();
// If we have no content service... then game over... cant display anything
List<Subscription> sites = new ArrayList<Subscription>();
if (contentService != null) {
sites = getSubscriptions();
}
// sort sites by name:
Collections.sort(sites);
for (Subscription sub : sites) {
Map<String, Object> item = new HashMap<String, Object>();
item.put("name", sub.name);
if (sub.enabled)
item.put("enabled", "");
else
item.put("enabled", "(Disabled)");
item.put("subscription", sub);
subscriptions.add(item);
}
listAdapter.notifyDataSetChanged();
}
public void exportOpml() {
File tempFile = null;
try {
tempFile = new File(Environment.getExternalStorageDirectory(),"/carcast.opml");
FileOutputStream opmlFile = new FileOutputStream(tempFile);
contentService.exportOPML(opmlFile);
opmlFile.close();
} catch (Exception ex) {
// Do a toast...
Util.toast(this, "Problem creating temporary file\n"+ex.getMessage());
return;
}
Log.i("carcast", "temporary file is "+tempFile.length());
Intent sendIntent = new Intent(Intent.ACTION_SEND);
// Mime type of the attachment (or) u can use sendIntent.setType("*/*")
sendIntent.setType("text/xml");
// Subject for the message or Email
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "CarCast OPML");
// Full Path to the attachment
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tempFile));
// Use a chooser to decide whether email or mms
startActivity(Intent.createChooser(sendIntent, "Export OPML..."));
}
}