summaryrefslogblamecommitdiffstats
path: root/src/de/animux/android/andmal/ListActivity.java
blob: ec21f41812bf7386e7dd1b36d34e67d9113ad6db (plain) (tree)






















































































































































































































                                                                                                         
package de.animux.android.andmal;

import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import de.animux.android.andmal.api.MalList;
import de.animux.android.andmal.api.MalObject;
import de.animux.android.andmal.api.MalState;
import de.animux.android.andmal.api.anime.AnimeList;
import de.animux.android.andmal.api.manga.MangaList;
import de.animux.android.andmal.util.SeparatedListAdapter;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class ListActivity extends Activity {

	public final static String ITEM_TITLE = "title";
	public final static String ITEM_CAPTION = "caption";

	public final static int SYNCING = 0;

	private MalList currentList;

	private UpdateUIHandler updateUIHandler = new UpdateUIHandler();
	private SharedPreferences prefs;

	public ListActivity() {
		super();
		this.currentList = null;
		this.prefs = null;
	}

	public Map<String, ?> createItem(String title, String caption) {
		Map<String, String> item = new HashMap<String, String>();
		item.put(ITEM_TITLE, title);
		item.put(ITEM_CAPTION, caption);
		return item;
	}

	private class UpdateUIHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			SeparatedListAdapter adapter = new SeparatedListAdapter(
					ListActivity.this);

			if (currentList != null) {
				Map<MalState, Collection<MalObject>> malObjects = currentList
						.getObjects();

				if (malObjects != null) {
					for (MalState s : malObjects.keySet())
						addMalObjects(adapter, malObjects.get(s), s.toString());

					ListView list = new ListView(ListActivity.this);
					list.setAdapter(adapter);
					ListActivity.this.setContentView(list);
				}
			}

			dismissDialog(SYNCING);
		}
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		PreferenceManager.setDefaultValues(this, R.menu.settings, false);

		prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

		if (prefs.getString("MAL_USERNAME", null) == null) {
			startActivity(new Intent(this, Settings.class));
			return;
		}

		currentList = new AnimeList(prefs.getString("MAL_USERNAME", null),
				prefs.getString("MAL_PASSWORD", null));
		refreshDisplay();
	}

	@Override
	protected void onResume() {
		super.onResume();

		if (currentList == null) {
			if (prefs.getString("USERNAME", null) != null) {
				currentList = new AnimeList(prefs.getString("MAL_USERNAME",
						null), prefs.getString("MAL_PASSWORD", null));
			}
		} else {
			currentList.setUsername(prefs.getString("MAL_USERNAME", null));
			currentList.setPassword(prefs.getString("MAL_PASSWORD", null));
		}

		refreshDisplay();
	}

	private synchronized void refreshDisplay() {
		if (currentList != null) {
			if (currentList.needsRefresh()) {
				showDialog(SYNCING);

				new Thread() {
					public void run() {
						try {
							currentList.refresh();
						} catch (Exception e) {
							e.printStackTrace();
						}

						updateUIHandler.sendEmptyMessage(0);
					}
				}.start();
			} else {
				updateUIHandler.sendEmptyMessage(0);
			}
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}

	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		super.onPrepareOptionsMenu(menu);
		MenuItem item;

		item = menu.findItem(R.id.menu_switch_anime);
		item.setVisible(currentList instanceof MangaList);

		item = menu.findItem(R.id.menu_switch_manga);
		item.setVisible(currentList instanceof AnimeList);

		return true;
	}

	private void addMalObjects(SeparatedListAdapter adapter,
			Collection<MalObject> malObjects, String sectionName) {
		if (malObjects != null && malObjects.size() > 0) {
			java.util.List<Map<String, ?>> listSection = new LinkedList<Map<String, ?>>();

			for (MalObject m : malObjects) {
				listSection.add(createItem(m.getTitle(), m.getProgress()));
			}

			adapter.addSection(sectionName, new SimpleAdapter(this,
					listSection, R.layout.list_item, new String[] { ITEM_TITLE,
							ITEM_CAPTION }, new int[] { R.id.list_item_title,
							R.id.list_item_other }));
		}
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case SYNCING:
			ProgressDialog dialog = ProgressDialog.show(this, "",
					"Loading list. Please wait...", true);
			dialog.show();
			return dialog;
		default:
			return super.onCreateDialog(id);
		}
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_settings:
			startActivity(new Intent(this, Settings.class));
			return true;
		case R.id.menu_switch_manga:
			currentList = new MangaList();
			break;
		case R.id.menu_switch_anime:
			currentList = new AnimeList();
			break;
		case R.id.menu_refresh:
			if (currentList != null)
				currentList.setNeedsRefresh(true);

			break;
		case R.id.menu_exit:
			System.exit(0);
			break;
		default:
			return false;
		}

		refreshDisplay();
		return true;
	}

}