Use child fragment manager for task edit fragments

pull/437/head
Alex Baker 10 years ago
parent 3aec9d905e
commit 3235d5e6df

@ -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<TaskEditControlFragment> 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<TaskEditControlFragment> fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder();
List<TaskEditControlFragment> 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 extends TaskEditControlFragment> 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);
}
/*

@ -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<TaskEditControlFragment> 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<TaskEditControlFragment> 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<TaskEditControlFragment> controlFragments = taskEditControlSetFragmentManager.createNewFragments(isNewTask, task);
loadTaskEditFragment(
false,
newTaskEditFragment(isNewTask, task, controlFragments.size()),
controlFragments);
loadTaskEditFragment(newTaskEditFragment(isNewTask, task));
}
@Override

@ -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<String, Integer> controlSetFragments = new LinkedHashMap<>();
private final List<String> 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<TaskEditControlFragment> createNewFragments(boolean isNewTask, Task task) {
List<TaskEditControlFragment> 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<TaskEditControlFragment> getFragmentsInPersistOrder(FragmentManager fragmentManager) {
List<TaskEditControlFragment> 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<TaskEditControlFragment> getFragmentsInDisplayOrder() {
return getFragments(displayOrder);
}
public List<TaskEditControlFragment> getFragmentsInPersistOrder() {
return getFragments(controlSetFragments.keySet());
return fragments;
}
private List<TaskEditControlFragment> getFragments(Iterable<String> tags) {
public List<TaskEditControlFragment> getOrCreateFragments(FragmentManager fragmentManager, boolean isNewTask, Task task) {
List<TaskEditControlFragment> 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;
}

@ -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);
}
}

Loading…
Cancel
Save