package se.slide.timy;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import se.slide.timy.db.DatabaseManager;
import se.slide.timy.model.Project;
import java.util.List;
public class ProjectListFragment extends Fragment implements AdapterView.OnItemClickListener {
private static final String TAG = "ProjectListFragment";
public static final String EXTRA_ID = "id";
public static final int MENU_EDIT = 0;
public static final int MENU_REMOVE = 1;
private int mId;
private ResponseReceiver mReceiver;
private ProjectArrayAdapter mAdapter;
private ProjectListInterface mActivity;
private ListView mListView;
public interface ProjectListInterface {
public boolean hasProjectsChanged();
}
public static final ProjectListFragment getInstance(int id) {
ProjectListFragment fragment = new ProjectListFragment();
Bundle bdl = new Bundle(2);
bdl.putInt(EXTRA_ID, id);
fragment.setArguments(bdl);
return fragment;
}
public ProjectListFragment() {
}
/*
* (non-Javadoc)
* @see android.support.v4.app.Fragment#onAttach(android.app.Activity)
*/
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = (ProjectListInterface) activity;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mReceiver = new ResponseReceiver();
}
@Override
public void onResume() {
super.onResume();
if (mActivity.hasProjectsChanged())
resetAdapter();
registerReceiver();
}
/*
* (non-Javadoc)
* @see android.support.v4.app.Fragment#onDetach()
*/
@Override
public void onDetach() {
super.onDetach();
}
/*
* (non-Javadoc)
* @see android.support.v4.app.Fragment#onStop()
*/
@Override
public void onStop() {
super.onStop();
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver();
}
/*
* (non-Javadoc)
* @see android.support.v4.app.Fragment#onStart()
*/
@Override
public void onStart() {
super.onStart();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = (View) inflater.inflate(R.layout.project_listview, null);
mListView = (ListView) view.findViewById(android.R.id.list);
mListView.setOnItemClickListener(this);
mListView.setEmptyView(view.findViewById(R.id.empty_list_view));
mId = getArguments().getInt(EXTRA_ID);
registerForContextMenu(mListView);
attachAdapter();
return view;
}
/*
* (non-Javadoc)
* @see
* android.support.v4.app.Fragment#onContextItemSelected(android.view.MenuItem
* )
*/
@Override
public boolean onContextItemSelected(MenuItem item) {
// Are we on the correct listview, check the groupId which should match
// the mId we set in menu.add
if (item.getGroupId() == mId) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
final Project project = mAdapter.getItem(info.position);
int menuItemIndex = item.getItemId();
if (menuItemIndex == MENU_EDIT) {
//
Intent i = new Intent(getActivity(), ProjectActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra(ProjectActivity.EXTRA_PROJECT_ID, project.getId());
startActivityForResult(i, ProjectActivity.ACTIVITY_CODE);
}
else if (menuItemIndex == MENU_REMOVE) {
// Ask to hide or delete
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.delete_or_hide_title)
.setPositiveButton(R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int selectedPosition = ((AlertDialog) dialog).getListView()
.getCheckedItemPosition();
if (selectedPosition == 0) {
// Hide
project.setActive(false);
DatabaseManager.getInstance().updateProject(project);
}
else {
// Delete
DatabaseManager.getInstance().deleteProjectAndItsReports(
project);
}
mAdapter.clear();
mAdapter.addAll(DatabaseManager.getInstance().getAllProjects(mId));
mAdapter.notifyDataSetChanged();
}
})
.setNegativeButton(R.string.cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setSingleChoiceItems(
getResources().getStringArray(R.array.delete_or_hide), 0,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int item) {
}
});
builder.create().show();
}
}
return super.onContextItemSelected(item);
}
/*
* (non-Javadoc)
* @see
* android.support.v4.app.Fragment#onCreateContextMenu(android.view.ContextMenu
* , android.view.View, android.view.ContextMenu.ContextMenuInfo)
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
Project project = mAdapter.getItem(info.position);
menu.setHeaderTitle(getString(R.string.listmenu_title) + " " + project.getName());
menu.add(mId, MENU_EDIT, 0, getString(R.string.listmenu_edit));
menu.add(mId, MENU_REMOVE, 1, getString(R.string.listmenu_remove));
}
/*
* (non-Javadoc)
* @see android.support.v4.app.Fragment#onActivityResult(int, int,
* android.content.Intent)
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ProjectActivity.ACTIVITY_CODE) {
if (resultCode == getActivity().RESULT_OK) {
String name = data.getStringExtra(ProjectActivity.EXTRA_PROJECT_NAME);
String colorId = data.getStringExtra(ProjectActivity.EXTRA_PROJECT_COLOR_ID);
int id = data.getIntExtra(ProjectActivity.EXTRA_PROJECT_ID, -1);
List<Project> projects = DatabaseManager.getInstance().getProject(id);
if (projects.size() > 0) {
Project project = projects.get(0);
project.setName(name);
project.setColorId(colorId);
DatabaseManager.getInstance().updateProject(project);
resetAdapter();
}
else {
// We should always have an existing project
}
}
}
}
/*
public void onListItemClick(ListView l, View v, int position, long id) {
onListItemClick(l, v, position, id);
Project project = mAdapter.getItem(position);
Intent i = new Intent(getActivity(), HoursActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra(HoursActivity.EXTRA_PROJECT_ID, project.getId());
startActivity(i);
}
*/
private void attachAdapter() {
List<Project> projectList = DatabaseManager.getInstance().getAllProjects(mId);
mAdapter = new ProjectArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1, projectList);
mListView.setAdapter(mAdapter);
}
private void resetAdapter() {
mAdapter.clear();
mAdapter.addAll(DatabaseManager.getInstance().getAllProjects(mId));
mAdapter.notifyDataSetChanged();
}
private void registerReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(ProjectListFragment.ResponseReceiver.INTENT_ACTION_ADD_PROJECT);
filter.addAction(ProjectListFragment.ResponseReceiver.INTENT_ACTION_DELETE_PROJECT);
filter.addAction(ProjectListFragment.ResponseReceiver.INTENT_ACTION_CLEAR_ALL);
filter.addCategory(Intent.CATEGORY_DEFAULT);
getActivity().registerReceiver(mReceiver, filter);
}
private void unregisterReceiver() {
getActivity().unregisterReceiver(mReceiver);
}
public class ResponseReceiver extends BroadcastReceiver {
/** Actions */
public static final String INTENT_ACTION_ADD_PROJECT = "se.slide.timy.intent.action.ADD_PROJECT";
public static final String INTENT_ACTION_DELETE_PROJECT = "se.slide.timy.intent.action.DELETE_PROJECT";
public static final String INTENT_ACTION_CLEAR_ALL = "se.slide.timy.intent.action.CLEAR_ALL";
/** Extras */
public static final String CURRENT_PAGE = "current_page";
@Override
public void onReceive(Context context, Intent intent) {
int currentPage = intent.getIntExtra(CURRENT_PAGE, 0);
String action = intent.getAction();
if (action.equals(INTENT_ACTION_ADD_PROJECT) && currentPage == mId) {
mAdapter.clear();
mAdapter.addAll(DatabaseManager.getInstance().getAllProjects(mId));
mAdapter.notifyDataSetChanged();
}
if (action.equals(INTENT_ACTION_CLEAR_ALL) && currentPage == mId) {
mAdapter.clear();
}
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
Project project = mAdapter.getItem(position);
/*
* FragmentManager fm = getActivity().getSupportFragmentManager();
* HoursDialog dialog = HoursDialog.newInstance(project.getName(),
* project.getId()); dialog.show(fm, "dialog_select_hours");
*/
Intent i = new Intent(getActivity(), HoursActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra(HoursActivity.EXTRA_PROJECT_ID, project.getId());
startActivity(i);
}
}