From 3235d5e6df284258f4fa4adfe77b3e0ead946f60 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 19 Jul 2016 08:41:34 -0500 Subject: [PATCH] Use child fragment manager for task edit fragments --- .../astrid/activity/TaskEditFragment.java | 29 ++++++---- .../astrid/activity/TaskListActivity.java | 38 +++---------- .../TaskEditControlSetFragmentManager.java | 54 +++++++------------ .../org/tasks/injection/ActivityModule.java | 8 +++ 4 files changed, 52 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index 2034183d0..6c9b2c955 100755 --- a/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -9,6 +9,8 @@ import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.Toolbar; import android.text.format.DateUtils; import android.view.LayoutInflater; @@ -63,11 +65,10 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar void taskEditFinished(); } - public static TaskEditFragment newTaskEditFragment(boolean isNewTask, Task task, int numFragments) { + public static TaskEditFragment newTaskEditFragment(boolean isNewTask, Task task) { TaskEditFragment taskEditFragment = new TaskEditFragment(); taskEditFragment.isNewTask = isNewTask; taskEditFragment.model = task; - taskEditFragment.numFragments = numFragments; return taskEditFragment; } @@ -76,7 +77,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar private static final String EXTRA_TASK = "extra_task"; private static final String EXTRA_IS_NEW_TASK = "extra_is_new_task"; - private static final String EXTRA_NUM_FRAGMENTS = "extra_num_fragments"; @Inject TaskService taskService; @Inject UserActivityDao userActivityDao; @@ -98,7 +98,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar /** true if editing started with a new task */ private boolean isNewTask = false; - private int numFragments; /** task model */ Task model = null; @@ -124,7 +123,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar if (savedInstanceState != null) { model = savedInstanceState.getParcelable(EXTRA_TASK); isNewTask = savedInstanceState.getBoolean(EXTRA_IS_NEW_TASK); - numFragments = savedInstanceState.getInt(EXTRA_NUM_FRAGMENTS); } final boolean backButtonSavesTask = preferences.backButtonSavesTask(); @@ -149,7 +147,19 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar commentsController.initialize(model, comments); commentsController.reloadView(); - for (int i = numFragments - 2; i > 1 ; i--) { + FragmentManager fragmentManager = getChildFragmentManager(); + List taskEditControlFragments = taskEditControlSetFragmentManager.getOrCreateFragments(fragmentManager, isNewTask, model); + + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + for (int i = 0 ; i < taskEditControlFragments.size() ; i++) { + TaskEditControlFragment taskEditControlFragment = taskEditControlFragments.get(i); + String tag = getString(taskEditControlFragment.controlId()); + fragmentTransaction.replace(TaskEditControlSetFragmentManager.TASK_EDIT_CONTROL_FRAGMENT_ROWS[i], taskEditControlFragment, tag); + } + fragmentTransaction.commit(); + + + for (int i = taskEditControlFragments.size() - 2; i > 1 ; i--) { controlSets.addView(inflater.inflate(R.layout.task_edit_row_divider, controlSets, false), i); } @@ -200,7 +210,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar /** Save task model from values in UI components */ public void save() { - List fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder(); + List fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()); if (hasChanges(fragments)) { for (TaskEditControlFragment fragment : fragments) { fragment.apply(model); @@ -239,7 +249,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar @SuppressWarnings("unchecked") private T getFragment(int tag) { - return (T) getActivity().getSupportFragmentManager().findFragmentByTag(getString(tag)); + return (T) getChildFragmentManager().findFragmentByTag(getString(tag)); } /* @@ -263,7 +273,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar } public void discardButtonClick() { - if (hasChanges(taskEditControlSetFragmentManager.getFragmentsInPersistOrder())) { + if (hasChanges(taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()))) { dialogBuilder.newMessageDialog(R.string.discard_confirmation) .setPositiveButton(R.string.keep_editing, null) .setNegativeButton(R.string.discard, new DialogInterface.OnClickListener() { @@ -308,7 +318,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar outState.putParcelable(EXTRA_TASK, model); outState.putBoolean(EXTRA_IS_NEW_TASK, isNewTask); - outState.putInt(EXTRA_NUM_FRAGMENTS, numFragments); } /* diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index 1f69c21d1..5c3472e88 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -6,7 +6,6 @@ package com.todoroo.astrid.activity; import android.app.Activity; -import android.support.v4.app.FragmentManager; import android.content.ContentValues; import android.content.Intent; import android.content.IntentFilter; @@ -14,7 +13,7 @@ import android.content.res.Configuration; import android.os.Bundle; import android.provider.Settings; import android.support.design.widget.Snackbar; -import android.support.v4.app.FragmentTransaction; +import android.support.v4.app.FragmentManager; import android.support.v4.widget.DrawerLayout; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -49,7 +48,6 @@ import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; import org.tasks.dialogs.SortDialog; import org.tasks.fragments.CommentBarFragment; -import org.tasks.fragments.TaskEditControlSetFragmentManager; import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.gtasks.SyncAdapterHelper; import org.tasks.injection.ActivityComponent; @@ -64,9 +62,6 @@ import org.tasks.themes.ThemeColor; import org.tasks.ui.EmptyTaskEditFragment; import org.tasks.ui.NavigationDrawerFragment; import org.tasks.ui.PriorityControlSet; -import org.tasks.ui.TaskEditControlFragment; - -import java.util.List; import javax.inject.Inject; @@ -92,7 +87,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements @Inject StartupService startupService; @Inject SubtasksHelper subtasksHelper; @Inject TaskService taskService; - @Inject TaskEditControlSetFragmentManager taskEditControlSetFragmentManager; @Inject RepeatConfirmationReceiver repeatConfirmationReceiver; @Inject DefaultFilterProvider defaultFilterProvider; @Inject GtasksListService gtasksListService; @@ -153,13 +147,10 @@ public class TaskListActivity extends InjectingAppCompatActivity implements Intent intent = getIntent(); TaskEditFragment taskEditFragment = getTaskEditFragment(); - List taskEditControlFragments = null; if (taskEditFragment != null) { if (intent.hasExtra(OPEN_FILTER) || intent.hasExtra(LOAD_FILTER) || intent.hasExtra(OPEN_TASK)) { taskEditFragment.save(); taskEditFragment = null; - } else { - taskEditControlFragments = taskEditControlSetFragmentManager.getFragmentsInDisplayOrder(); } } @@ -188,7 +179,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements } if (taskEditFragment != null) { - loadTaskEditFragment(true, taskEditFragment, taskEditControlFragments); + loadTaskEditFragment(taskEditFragment); } } @@ -209,25 +200,12 @@ public class TaskListActivity extends InjectingAppCompatActivity implements .commit(); } - private void loadTaskEditFragment(boolean onCreate, TaskEditFragment taskEditFragment, List taskEditControlFragments) { - FragmentManager fragmentManager = getSupportFragmentManager(); - fragmentManager.beginTransaction() + private void loadTaskEditFragment(TaskEditFragment taskEditFragment) { + getSupportFragmentManager() + .beginTransaction() .replace(isDoublePaneLayout() ? R.id.detail_dual : R.id.single_pane, taskEditFragment, TaskEditFragment.TAG_TASKEDIT_FRAGMENT) .addToBackStack(TaskEditFragment.TAG_TASKEDIT_FRAGMENT) .commit(); - - if (onCreate) { - fragmentManager.executePendingTransactions(); - } - - FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); - for (int i = 0 ; i < taskEditControlFragments.size() ; i++) { - TaskEditControlFragment taskEditControlFragment = taskEditControlFragments.get(i); - String tag = getString(taskEditControlFragment.controlId()); - fragmentTransaction.replace(TaskEditControlSetFragmentManager.TASK_EDIT_CONTROL_FRAGMENT_ROWS[i], taskEditControlFragment, tag); - } - fragmentTransaction.addToBackStack(null); - fragmentTransaction.commit(); } public NavigationDrawerFragment getNavigationDrawerFragment() { @@ -377,11 +355,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements return; } boolean isNewTask = task.getTitle().length() == 0; - List controlFragments = taskEditControlSetFragmentManager.createNewFragments(isNewTask, task); - loadTaskEditFragment( - false, - newTaskEditFragment(isNewTask, task, controlFragments.size()), - controlFragments); + loadTaskEditFragment(newTaskEditFragment(isNewTask, task)); } @Override diff --git a/src/main/java/org/tasks/fragments/TaskEditControlSetFragmentManager.java b/src/main/java/org/tasks/fragments/TaskEditControlSetFragmentManager.java index 922b88097..57938c2ce 100644 --- a/src/main/java/org/tasks/fragments/TaskEditControlSetFragmentManager.java +++ b/src/main/java/org/tasks/fragments/TaskEditControlSetFragmentManager.java @@ -4,7 +4,7 @@ import android.app.Activity; import android.support.v4.app.FragmentManager; import com.todoroo.astrid.activity.BeastModePreferences; -import com.todoroo.astrid.activity.TaskListActivity; +import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.repeats.RepeatControlSet; @@ -33,9 +33,6 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; -import timber.log.Timber; - -@Singleton public class TaskEditControlSetFragmentManager { public static final int[] TASK_EDIT_CONTROL_FRAGMENT_ROWS = new int[] { @@ -78,17 +75,14 @@ public class TaskEditControlSetFragmentManager { private final Map controlSetFragments = new LinkedHashMap<>(); private final List displayOrder; - private final FragmentManager fragmentManager; private final SyncAdapterHelper syncAdapterHelper; private int numRows; - @Inject public TaskEditControlSetFragmentManager(Activity activity, Preferences preferences, SyncAdapterHelper syncAdapterHelper) { this.syncAdapterHelper = syncAdapterHelper; displayOrder = BeastModePreferences.constructOrderedControlList(preferences, activity); displayOrder.add(0, activity.getString(EditTitleControlSet.TAG)); displayOrder.add(1, activity.getString(CommentBarFragment.TAG)); - fragmentManager = ((TaskListActivity) activity).getSupportFragmentManager(); String hideAlwaysTrigger = activity.getString(R.string.TEA_ctrl_hide_section_pref); for (numRows = 0 ; numRows < displayOrder.size() ; numRows++) { if (displayOrder.get(numRows).equals(hideAlwaysTrigger)) { @@ -101,41 +95,31 @@ public class TaskEditControlSetFragmentManager { } } - public List createNewFragments(boolean isNewTask, Task task) { - List taskEditControlFragments = new ArrayList<>(); - for (int i = 0; i < numRows; i++) { - String item = displayOrder.get(i); - Integer resId = controlSetFragments.get(item); - if (resId == null) { - Timber.e("Unknown task edit control %s", item); - continue; - } - - TaskEditControlFragment fragment = createFragment(resId); - if (fragment == null) { - continue; + public List getFragmentsInPersistOrder(FragmentManager fragmentManager) { + List fragments = new ArrayList<>(); + for (String tag : controlSetFragments.keySet()) { + TaskEditControlFragment fragment = (TaskEditControlFragment) fragmentManager.findFragmentByTag(tag); + if (fragment != null) { + fragments.add(fragment); } - fragment.initialize(isNewTask, task); - taskEditControlFragments.add(fragment); } - return taskEditControlFragments; - } - - public List getFragmentsInDisplayOrder() { - return getFragments(displayOrder); - } - - public List getFragmentsInPersistOrder() { - return getFragments(controlSetFragments.keySet()); + return fragments; } - private List getFragments(Iterable tags) { + public List getOrCreateFragments(FragmentManager fragmentManager, boolean isNewTask, Task task) { List fragments = new ArrayList<>(); - for (String tag : tags) { + for (int i = 0 ; i < numRows ; i++) { + String tag = displayOrder.get(i); TaskEditControlFragment fragment = (TaskEditControlFragment) fragmentManager.findFragmentByTag(tag); - if (fragment != null) { - fragments.add(fragment); + if (fragment == null) { + Integer resId = controlSetFragments.get(tag); + fragment = createFragment(resId); + if (fragment == null) { + continue; + } + fragment.initialize(isNewTask, task); } + fragments.add(fragment); } return fragments; } diff --git a/src/main/java/org/tasks/injection/ActivityModule.java b/src/main/java/org/tasks/injection/ActivityModule.java index 76d7b39ba..8d24516dc 100644 --- a/src/main/java/org/tasks/injection/ActivityModule.java +++ b/src/main/java/org/tasks/injection/ActivityModule.java @@ -3,6 +3,8 @@ package org.tasks.injection; import android.app.Activity; import org.tasks.R; +import org.tasks.fragments.TaskEditControlSetFragmentManager; +import org.tasks.gtasks.SyncAdapterHelper; import org.tasks.preferences.Preferences; import org.tasks.themes.ThemeAccent; import org.tasks.themes.ThemeBase; @@ -45,4 +47,10 @@ public class ActivityModule { public ThemeAccent getThemeAccent(ThemeCache themeCache, Preferences preferences) { return themeCache.getThemeAccent(preferences.getInt(R.string.p_theme_accent, 1)); } + + @Provides + @Singleton + public TaskEditControlSetFragmentManager getTaskEditControlSetFragmentManager(Preferences preferences, SyncAdapterHelper syncAdapterHelper) { + return new TaskEditControlSetFragmentManager(activity, preferences, syncAdapterHelper); + } }