package se.slide.timy;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import com.crashlytics.android.Crashlytics;
import com.google.analytics.tracking.android.EasyTracker;
import com.viewpagerindicator.TitlePageIndicator;
import org.codechimp.apprater.AppRater;
import se.slide.timy.InputDialog.EditNameDialogListener;
import se.slide.timy.ProjectListFragment.ProjectListInterface;
import se.slide.timy.animations.ZoomOutPageTransformer;
import se.slide.timy.db.DatabaseManager;
import se.slide.timy.model.Category;
import se.slide.timy.model.Project;
import se.slide.utils.SimpleDialogFragment;
import java.util.List;
public class MainActivity extends FragmentActivity implements EditNameDialogListener,
ProjectListInterface {
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
* will keep every loaded fragment in memory. If this becomes too memory
* intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;
TitlePageIndicator mIndicator;
boolean hasProjectDataChanged = false;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Crashlytics.start(this);
DatabaseManager.init(this);
setContentView(R.layout.activity_main);
AppRater.app_launched(this);
// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setPageTransformer(true, new ZoomOutPageTransformer());
mViewPager.setAdapter(mSectionsPagerAdapter);
// Bind the title indicator to the adapter
mIndicator = (TitlePageIndicator) findViewById(R.id.indicator);
mIndicator.setViewPager(mViewPager);
final Intent intent = getIntent();
if (intent != null && intent.hasExtra(ShowNotification.EXTRA_CODE)) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle(intent.getStringExtra(ShowNotification.EXTRA_TITLE));
alertDialogBuilder.setMessage(intent.getStringExtra(ShowNotification.EXTRA_TEXT));
alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
intent.removeExtra(ShowNotification.EXTRA_CODE);
dialog.dismiss();
}
});
alertDialogBuilder.create().show();
}
if (mSectionsPagerAdapter.getCount() == 0) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle(R.string.empty_categories_title);
alertDialogBuilder.setMessage(R.string.empty_categories_message);
alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialogBuilder.create().show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (mViewPager.getChildCount() < 1)
menu.getItem(0).setVisible(false);
else
menu.getItem(0).setVisible(true);
return super.onPrepareOptionsMenu(menu);
}
/*
* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onMenuItemSelected(int,
* android.view.MenuItem)
*/
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (item.getItemId() == R.id.menu_add_project) {
if (mViewPager.getChildCount() < 1) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.add_category_first_title);
builder.setMessage(R.string.add_category_first_message);
builder.setPositiveButton(R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
return true;
}
startActivityForResult(new Intent(this, ProjectActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), ProjectActivity.ACTIVITY_CODE);
return true;
}
else if (item.getItemId() == R.id.menu_add_category) {
FragmentManager fm = getSupportFragmentManager();
InputDialog dialog = InputDialog.newInstance(getString(R.string.hint_add_category), -1,
null);
dialog.show(fm, "dialog_add_category");
return true;
}
else if (item.getItemId() == R.id.menu_edit_category) {
if (mViewPager.getChildCount() < 1)
return true;
Category category = mSectionsPagerAdapter.getCategory(mViewPager.getCurrentItem());
FragmentManager fm = getSupportFragmentManager();
InputDialog dialog = InputDialog.newInstance(getString(R.string.hint_add_category),
category.getId(), category.getName());
dialog.show(fm, "dialog_add_category");
return true;
}
else if (item.getItemId() == R.id.menu_remove_category) {
if (mViewPager.getChildCount() < 1)
return true;
final Category category = mSectionsPagerAdapter
.getCategory(mViewPager.getCurrentItem());
// Ask to hide or to delete
AlertDialog.Builder builder = new AlertDialog.Builder(this);
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
category.setActive(false);
DatabaseManager.getInstance().updateCategory(category);
}
else {
// Delete
DatabaseManager.getInstance()
.deleteCategoryAndItsProjects(category);
}
mSectionsPagerAdapter.updateCategoryList();
mIndicator.notifyDataSetChanged();
invalidateOptionsMenu();
}
})
.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();
}
else if (item.getItemId() == R.id.menu_about) {
Intent intent = new Intent(this, AboutActivity.class);
startActivity(intent);
}
else if (item.getItemId() == R.id.menu_settings) {
startActivity(new Intent(this, SettingsActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
return super.onMenuItemSelected(featureId, item);
}
/*
* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onActivityResult(int, int,
* android.content.Intent)
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ProjectActivity.ACTIVITY_CODE) {
if (resultCode == RESULT_OK) {
String name = data.getStringExtra(ProjectActivity.EXTRA_PROJECT_NAME);
String colorId = data.getStringExtra(ProjectActivity.EXTRA_PROJECT_COLOR_ID);
addProject(name, colorId);
}
}
}
@Override
public void onStart() {
super.onStart();
EasyTracker.getInstance(this).activityStart(this);
}
@Override
public void onStop() {
super.onStop();
EasyTracker.getInstance(this).activityStop(this);
}
public void addProject(String name, String colorId) {
Category category = mSectionsPagerAdapter.getCategory(mViewPager.getCurrentItem());
if (category == null) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.add_category_first_title);
builder.setMessage(R.string.add_category_first_message);
builder.setPositiveButton(R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
return;
}
final int belongToCategoryId = (category == null) ? 0 : category.getId();
final Project project = new Project();
project.setName(name);
project.setColorId(colorId);
project.setActive(true);
project.setBelongsToCategoryId(belongToCategoryId);
final List<Project> projectList = DatabaseManager.getInstance().getProject(name);
final List<Category> categoryList = DatabaseManager.getInstance().getAllCategories();
if (projectList.size() > 0) {
final CharSequence[] entries = new CharSequence[projectList.size()];
// final CharSequence[] categories = new
// CharSequence[categoryList.size()];
// final String[] calendarIds = new String[projectList.size()];
for (int i = 0; i < projectList.size(); i++) {
Project oldProject = projectList.get(i);
StringBuilder builder = new StringBuilder();
for (int a = 0; a < categoryList.size(); a++) {
if (categoryList.get(a).getId() == oldProject.getBelongsToCategoryId()) {
builder.append(categoryList.get(a).getName());
builder.append(": ");
break;
}
}
builder.append(projectList.get(i).getName());
entries[i] = builder.toString();
// calendarIds[i] = projectLists.get(i).getId();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.reactivate_old_project)
.setSingleChoiceItems(entries, 0, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int item) {
// dialogInterface.dismiss();
}
});
builder.setPositiveButton(getString(R.string.yes_reactivate), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ListView lw = ((AlertDialog) dialog).getListView();
Project oldProject = projectList.get(lw.getCheckedItemPosition());
oldProject.setActive(true);
oldProject.setBelongsToCategoryId(belongToCategoryId);
addProject(oldProject);
dialog.dismiss();
}
});
builder.setNegativeButton(getString(R.string.no_create_new), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
addProject(project);
dialog.dismiss();
}
});
builder.create().show();
}
else {
addProject(project);
}
}
@Override
public void onFinishEditDialog(final String text, int categoryId, int icon) {
// Is this an edit?
List<Category> categories = null;
if (categoryId > 0) {
categories = DatabaseManager.getInstance().getCategory(categoryId);
if (categories != null && categories.size() > 0) {
Category category = categories.get(0);
if (category != null) {
category.setActive(true);
category.setName(text);
addOrUpdateCategory(category);
return;
}
}
}
// This is an add
final List<Category> reactivatedCategories = DatabaseManager.getInstance()
.getCategory(text);
if (reactivatedCategories != null && reactivatedCategories.size() > 0) {
// We have old categories to handle
final CharSequence[] entries = new CharSequence[reactivatedCategories.size()];
for (int i = 0; i < reactivatedCategories.size(); i++) {
entries[i] = reactivatedCategories.get(i).getName();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.reactivate_old_category)
.setSingleChoiceItems(entries, 0, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int item) {
// dialogInterface.dismiss();
}
});
builder.setPositiveButton(getString(R.string.yes_reactivate), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ListView lw = ((AlertDialog) dialog).getListView();
Category category = reactivatedCategories.get(lw.getCheckedItemPosition());
category.setActive(true);
addOrUpdateCategory(category);
dialog.dismiss();
}
});
builder.setNegativeButton(getString(R.string.no_create_new), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Category category = new Category();
category.setActive(true);
category.setName(text);
addOrUpdateCategory(category);
dialog.dismiss();
}
});
builder.create().show();
}
else {
// We have no old categories with the same name, so just create a
// new one
Category category = new Category();
category.setActive(true);
category.setName(text);
addOrUpdateCategory(category);
}
}
public void addOrUpdateCategory(Category category) {
DatabaseManager.getInstance().addOrUpdate(category);
mSectionsPagerAdapter.updateCategoryList();
invalidateOptionsMenu();
}
public void addProject(Project project) {
DatabaseManager.getInstance().addProject(project);
hasProjectDataChanged = true;
Intent intent = new Intent()
.setAction(ProjectListFragment.ResponseReceiver.INTENT_ACTION_ADD_PROJECT)
.putExtra(ProjectListFragment.ResponseReceiver.CURRENT_PAGE,
project.getBelongsToCategoryId());
sendBroadcast(intent);
}
/*
* @Override public void onAddHoursDialog(int projectId, int hours, int
* minutes, Date date, String comment) { Report report = new Report();
* List<Report> reports = DatabaseManager.getInstance().getReport(projectId,
* date); if (reports.size() > 0) report = reports.get(0);
* report.setProjectId(projectId); report.setHours(hours);
* report.setMinutes(minutes); report.setDate(date);
* report.setComment(comment); report.setGoogleCalendarSync(false);
* DatabaseManager.getInstance().addOrUpdateReport(report); startService(new
* Intent(this, SyncService.class)); }
*/
/*
* (non-Javadoc)
* @see
* se.slide.timy.ProjectListFragment.ProjectListInterface#hasProjectsChanged
* ()
*/
@Override
public boolean hasProjectsChanged() {
return hasProjectDataChanged;
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
List<Category> categoryList;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
updateCategoryList();
}
public void updateCategoryList() {
categoryList = DatabaseManager.getInstance().getAllActiveCategories();
notifyDataSetChanged();
}
public Category getCategory(int position) {
if (categoryList == null || categoryList.isEmpty() || position > categoryList.size())
return null;
return categoryList.get(position);
}
@Override
public Fragment getItem(int position) {
Category category = categoryList.get(position);
Fragment fragment = ProjectListFragment.getInstance(category.getId());
return fragment;
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return categoryList.get(position).getName();
}
}
}