package de.vanmar.android.yarrn; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.view.View; import com.androidquery.util.AQUtility; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.ViewById; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import de.vanmar.android.yarrn.favorites.FavoritesFragment; import de.vanmar.android.yarrn.patterns.PatternFragment; import de.vanmar.android.yarrn.patterns.PatternSearchFragment; import de.vanmar.android.yarrn.projects.ProjectFragment; import de.vanmar.android.yarrn.projects.ProjectSearchFragment; import de.vanmar.android.yarrn.projects.ProjectsFragment; import de.vanmar.android.yarrn.projects.ProjectsFragment.ProjectsFragmentListener; import de.vanmar.android.yarrn.queues.QueuedProjectFragment; import de.vanmar.android.yarrn.queues.QueuesFragment; import de.vanmar.android.yarrn.stashes.StashFragment; import de.vanmar.android.yarrn.stashes.StashSearchFragment; import de.vanmar.android.yarrn.stashes.StashesFragment; import de.vanmar.android.yarrn.util.AdHelper; import de.vanmar.android.yarrn.util.RequestCode; @EActivity(resName = "activity_main") public class MainActivity extends AbstractRavelryActivity implements ProjectsFragmentListener, ProjectSearchFragment.ProjectSearchFragmentListener, ProjectFragment.ProjectFragmentListener, FavoritesFragment.FavoritesFragmentListener, PatternSearchFragment.PatternSearchFragmentListener, PatternFragment.PatternFragmentListener, StashesFragment.StashesFragmentListener, StashSearchFragment.StashSearchFragmentListener, StashFragment.StashFragmentListener, SettingsFragment.SettingsFragmentListener, QueuesFragment.QueuesFragmentListener, QueuedProjectFragment.QueuedProjectFragmentListener { private static final String JPEG_FILE_PREFIX = "IMG_"; private static final String JPEG_FILE_SUFFIX = ".jpg"; public static final String PROJECT_DETAIL_TAG = "projectDetail"; public static final String PATTERN_DETAIL_TAG = "patternDetail"; public static final String PROJECTS_TAG = "projects"; public static final String PROJECT_SEARCH_TAG = "project_search"; public static final String FAVORITES_TAG = "favorites"; public static final String PATTERN_SEARCH_TAG = "pattern_search"; public static final String STASHES_TAG = "stashes"; public static final String QUEUES_TAG = "queues"; public static final String QUEUE_DETAIL_TAG = "queueDetail"; public static final String STASH_SEARCH_TAG = "stash_search"; public static final String STASH_DETAIL_TAG = "stashDetail"; public static final String SETTINGS_TAG = "settings"; @NonConfigurationInstance Uri photoUri; public ProjectsFragment projectsFragment; public ProjectSearchFragment projectSearchFragment; public FavoritesFragment favoritesFragment; public PatternSearchFragment patternSearchFragment; public StashesFragment stashesFragment; public QueuesFragment queuesFragment; public StashSearchFragment stashSearchFragment; @Bean public FragmentFactory fragmentFactory; @ViewById(R.id.drawer_layout) DrawerLayout drawerLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); } // get fragments from backstack if available projectsFragment = (ProjectsFragment) getSupportFragmentManager().findFragmentByTag(PROJECTS_TAG); } @Override protected void onStart() { super.onStart(); if (getSupportFragmentManager().getBackStackEntryCount() <= 1) { // if nothing else known, start projects list displayProjectsFragment(); } AdHelper.loadAds(this); } @Override public void onBackPressed() { FragmentManager fragmentManager = getSupportFragmentManager(); if (fragmentManager.getBackStackEntryCount() > 1) { super.onBackPressed(); } else { finish(); } } private void displayProjectsFragment() { if (projectsFragment == null) { projectsFragment = fragmentFactory.getProjectsFragment(); } ensureFragment(PROJECTS_TAG, projectsFragment); } private void displayProjectSearchFragment() { if (projectSearchFragment == null) { projectSearchFragment = fragmentFactory.getProjectSearchFragment(); } ensureFragment(PROJECT_SEARCH_TAG, projectSearchFragment); } private void displayFavoritesFragment() { if (favoritesFragment == null) { favoritesFragment = fragmentFactory.getFavoritesFragment(); } ensureFragment(FAVORITES_TAG, favoritesFragment); } private void displayPatternSearchFragment() { if (patternSearchFragment == null) { patternSearchFragment = fragmentFactory.getPatternSearchFragment(); } ensureFragment(PATTERN_SEARCH_TAG, patternSearchFragment); } private void displayStashesFragment() { if (stashesFragment == null) { stashesFragment = fragmentFactory.getStashesFragment(); } ensureFragment(STASHES_TAG, stashesFragment); } private void displayQueuesFragment() { if (queuesFragment == null) { queuesFragment = fragmentFactory.getQueuesFragment(); } ensureFragment(QUEUES_TAG, queuesFragment); } private void displayStashSearchFragment() { if (stashSearchFragment == null) { stashSearchFragment = fragmentFactory.getStashSearchFragment(); } ensureFragment(STASH_SEARCH_TAG, stashSearchFragment); } private void displaySettingsFragment() { SettingsFragment settingsFragment = fragmentFactory.getSettingsFragment(); ensureFragment(SETTINGS_TAG, settingsFragment); } private void ensureFragment(String tag, Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); int backStackEntryCount = fragmentManager.getBackStackEntryCount(); if (backStackEntryCount > 0) { FragmentManager.BackStackEntry lastBackStackEntry = fragmentManager.getBackStackEntryAt(backStackEntryCount - 1); if (lastBackStackEntry != null && tag.equals(lastBackStackEntry.getName())) { // already at correct fragment return; } } FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); boolean wasPopped = fragmentManager.popBackStackImmediate(tag, 0); if (!wasPopped) { fragmentTransaction .replace(R.id.content_frame, fragment, tag) .addToBackStack(tag) .commit(); } } private void displayProjectDetailFragment(final int projectId, String username) { ProjectFragment projectFragment = fragmentFactory.getProjectFragment(); Bundle args = new Bundle(); args.putInt(ProjectFragment.ARG_PROJECT_ID, projectId); args.putString(ProjectFragment.ARG_USERNAME, username); projectFragment.setArguments(args); getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, projectFragment, PROJECT_DETAIL_TAG) .addToBackStack(PROJECT_DETAIL_TAG) .commit(); } @Override public void onProjectSelected(final int projectId, String username) { displayProjectDetailFragment(projectId, username); } @Override public void onQueuedProjectSelected(final int projectId, String username) { displayQueuedProjectDetailFragment(projectId, username); } private void displayPatternDetailFragment(final int patternId) { PatternFragment patternFragment = fragmentFactory.getPatternFragment(); Bundle args = new Bundle(); args.putInt(PatternFragment.ARG_PATTERN_ID, patternId); patternFragment.setArguments(args); getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, patternFragment, PATTERN_DETAIL_TAG) .addToBackStack(PATTERN_DETAIL_TAG) .commit(); } private void displayQueuedProjectDetailFragment(final int queuedProjectId, final String username) { QueuedProjectFragment queuedProjectFragment = fragmentFactory.getQueuedProjectFragment(); Bundle args = new Bundle(); args.putInt(QueuedProjectFragment.ARG_QUEUED_PROJECT_ID, queuedProjectId); args.putString(QueuedProjectFragment.ARG_USERNAME, username); queuedProjectFragment.setArguments(args); getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, queuedProjectFragment, QUEUE_DETAIL_TAG) .addToBackStack(QUEUE_DETAIL_TAG) .commit(); } @Override public void onPatternSelected(final int patternId) { displayPatternDetailFragment(patternId); } private void displayStashDetailFragment(final int stashId, String username) { StashFragment stashFragment = fragmentFactory.getStashFragment(); Bundle args = new Bundle(); args.putInt(StashFragment.ARG_STASH_ID, stashId); args.putString(StashFragment.ARG_USERNAME, username); stashFragment.setArguments(args); getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, stashFragment, STASH_DETAIL_TAG) .addToBackStack(STASH_DETAIL_TAG) .commit(); } @Override public void onStashSelected(final int stashId, String username) { displayStashDetailFragment(stashId, username); } @Override public void pickImage() { final Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.setType("image/*"); startActivityForResult(intent, RequestCode.REQUEST_CODE_GALLERY); } @Override @SuppressLint("SimpleDateFormat") public void takePhoto() { final File storageDir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Yarrn" ); storageDir.mkdirs(); final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); final String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; File image; try { image = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, storageDir); final Intent takePictureIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); //takePictureIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); photoUri = Uri.fromFile(image); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(takePictureIntent, RequestCode.REQUEST_CODE_CAMERA); } catch (final IOException e) { AQUtility.report(e); } } @OnActivityResult(RequestCode.REQUEST_CODE_CAMERA) void onCameraResult(final int resultCode, final Intent data) { if (resultCode == Activity.RESULT_OK && photoUri != null) { ProjectFragment projectFragment = (ProjectFragment) getSupportFragmentManager().findFragmentByTag(PROJECT_DETAIL_TAG); projectFragment.uploadPhotoToProject(photoUri); photoUri = null; } } @OnActivityResult(RequestCode.REQUEST_CODE_GALLERY) void onGalleryResult(final int resultCode, final Intent data) { if (resultCode == Activity.RESULT_OK) { ProjectFragment projectFragment = (ProjectFragment) getSupportFragmentManager().findFragmentByTag(PROJECT_DETAIL_TAG); projectFragment.uploadPhotoToProject(data.getData()); } } @SuppressLint("InlinedApi") @OptionsItem(android.R.id.home) void toggleMenu() { View drawer = findViewById(R.id.right_drawer); if (drawerLayout.isDrawerOpen(drawer)) { drawerLayout.closeDrawers(); } else { drawerLayout.openDrawer(drawer); } } @Click(R.id.menu_my_projects) public void menuMyProjectsClicked() { drawerLayout.closeDrawers(); displayProjectsFragment(); } @Click(R.id.menu_my_favorites) public void menuMyFavoritesClicked() { drawerLayout.closeDrawers(); displayFavoritesFragment(); } @Click(R.id.menu_my_stashes) public void menuMyStashesClicked() { drawerLayout.closeDrawers(); displayStashesFragment(); } @Click(R.id.menu_my_queues) public void menuMyQueuesClicked() { drawerLayout.closeDrawers(); displayQueuesFragment(); } @Click(R.id.menu_project_search) public void menuProjectSearchClicked() { drawerLayout.closeDrawers(); displayProjectSearchFragment(); } @Click(R.id.menu_pattern_search) public void menuPatternSearchClicked() { drawerLayout.closeDrawers(); displayPatternSearchFragment(); } @Click(R.id.menu_stash_search) public void menuStashSearchClicked() { drawerLayout.closeDrawers(); displayStashSearchFragment(); } @Click(R.id.menu_open_ravelry) public void menuOpenRavelryClicked() { drawerLayout.closeDrawers(); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.open_ravelry_url)))); } @Click(R.id.menu_settings) public void menuSettingsClicked() { drawerLayout.closeDrawers(); displaySettingsFragment(); } }