/**
** Copyright (c) 2010 Ushahidi Inc
** All rights reserved
** Contact: team@ushahidi.com
** Website: http://www.ushahidi.com
**
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: http://www.gnu.org/licenses/lgpl.html.
**
**
** If you have questions regarding the use of this file, please contact
** Ushahidi developers at team@ushahidi.com.
**
**/
package com.ushahidi.android.app.fragments;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.ushahidi.android.app.R;
import com.ushahidi.android.app.adapters.BaseListAdapter;
import com.ushahidi.android.app.models.Model;
import com.ushahidi.android.app.tasks.ProgressTask;
import com.ushahidi.android.app.util.AnalyticsUtils;
import com.ushahidi.android.app.util.Objects;
import com.ushahidi.android.app.util.Util;
import com.ushahidi.android.app.views.View;
/**
* @author eyedol
*/
public abstract class BaseListFragment<V extends View, M extends Model, L extends BaseListAdapter<M>>
extends SherlockListFragment {
/**
* ListView resource id
*/
private final int listViewId;
/**
* ListAdpater class
*/
private final Class<L> adapterClass;
/**
* ListAdapter
*/
protected L adapter;
/**
* ListView
*/
protected ListView listView;
/**
* Menu resource id
*/
protected final int menu;
/**
* Layout resource id
*/
protected final int layout;
/**
* View class
*/
protected final Class<V> viewClass;
/**
* View
*/
protected V view;
/**
* BaseListActivity
*
* @param view
* View class type
* @param adapter
* List adapter class type
* @param layout
* layout resource id
* @param menu
* menu resource id
* @param listView
* list view resource id
*/
protected BaseListFragment(Class<V> view, Class<L> adapter, int layout,
int menu, int listView) {
this.adapterClass = adapter;
this.listViewId = listView;
this.viewClass = view;
this.menu = menu;
this.layout = layout;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
if (listViewId != 0) {
listView = getListView();
if (headerView() != null) {
listView.addHeaderView(headerView());
}
// listView.setOnItemClickListener(this);
//android.view.View emptyView = getActivity().findViewById(
// android.R.id.empty);
/*if (emptyView != null) {
listView.setEmptyView(emptyView);
}*/
view = Objects.createInstance(viewClass, Activity.class,
getActivity());
adapter = Objects.createInstance(adapterClass, Context.class,
getActivity());
listView.setAdapter(adapter);
listView.setFocusable(true);
listView.setFocusableInTouchMode(true);
}
// start tracking with google analytics
AnalyticsUtils.setContext(getActivity());
}
@Override
public void onStart() {
super.onStart();
log("onStart");
AnalyticsUtils.activityStart(getActivity());
}
@Override
public void onStop() {
super.onStop();
log("onStop");
AnalyticsUtils.activityStop(getActivity());
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (this.menu != 0) {
inflater.inflate(this.menu, menu);
}
}
@Override
public android.view.View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
android.view.View root = null;
if (layout != 0) {
root = inflater.inflate(layout, container, false);
}
return root;
}
/**
* Called after ListAdapter has been loaded
*
* @param success
* true is successfully loaded
*/
protected abstract void onLoaded(boolean success);
protected abstract android.view.View headerView();
@SuppressWarnings("unchecked")
protected M getSelectedItem() {
return (M) listView.getSelectedItem();
}
public void onItemSelected(AdapterView<?> adapterView,
android.view.View view, int position, long id) {
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
/**
* ProgressTask sub-class for showing Loading... dialog while the
* BaseListAdapter loads the data
*/
protected class LoadingTask extends ProgressTask {
public LoadingTask(Activity activity) {
super(activity, R.string.loading_);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.cancel();
}
@Override
protected Boolean doInBackground(String... args) {
adapter.refresh();
return true;
}
@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
onLoaded(success);
listView.setAdapter(adapter);
}
}
protected void log(String message) {
new Util().log(message);
}
protected void log(String format, Object... args) {
new Util().log(String.format(format, args));
}
protected void log(String message, Exception ex) {
new Util().log(message, ex);
}
protected void toastLong(String message) {
Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
}
protected void toastLong(int message) {
Toast.makeText(getActivity(), getText(message), Toast.LENGTH_LONG)
.show();
}
protected void toastShort(int message) {
Toast.makeText(getActivity(), getText(message), Toast.LENGTH_SHORT)
.show();
}
protected void toastShort(CharSequence message) {
Toast.makeText(getActivity(), message.toString(), Toast.LENGTH_SHORT)
.show();
}
}