Clean up comments

pull/384/head
Alex Baker 10 years ago
parent b8c1f6d621
commit c017131a7f

@ -19,20 +19,17 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment; import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.files.AACRecordingActivity; import com.todoroo.astrid.files.AACRecordingActivity;
import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.notes.EditNoteActivity; import com.todoroo.astrid.notes.CommentsController;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.timers.TimerPlugin;
@ -45,7 +42,6 @@ import org.tasks.fragments.TaskEditControlSetFragmentManager;
import org.tasks.injection.ForActivity; import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingFragment; import org.tasks.injection.InjectingFragment;
import org.tasks.notifications.NotificationManager; import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.ui.MenuColorizer; import org.tasks.ui.MenuColorizer;
import org.tasks.ui.TaskEditControlFragment; import org.tasks.ui.TaskEditControlFragment;
@ -59,14 +55,6 @@ import butterknife.ButterKnife;
import static android.app.Activity.RESULT_OK; import static android.app.Activity.RESULT_OK;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;
/**
* This activity is responsible for creating new tasks and editing existing
* ones. It saves a task when it is paused (screen rotated, back button pressed)
* as long as the task has a title.
*
* @author timsu
*
*/
public final class TaskEditFragment extends InjectingFragment implements Toolbar.OnMenuItemClickListener { public final class TaskEditFragment extends InjectingFragment implements Toolbar.OnMenuItemClickListener {
public interface TaskEditFragmentCallbackHandler { public interface TaskEditFragmentCallbackHandler {
@ -80,41 +68,24 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
return taskEditFragment; return taskEditFragment;
} }
public static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; //$NON-NLS-1$ public static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment";
public static final String TOKEN_VALUES = "v";
// --- bundle tokens private static final String EXTRA_TASK = "extra_task";
/**
* Content Values to set
*/
public static final String TOKEN_VALUES = "v"; //$NON-NLS-1$
/**
* Task in progress (during orientation change)
*/
private static final String EXTRA_TASK = "extra_task"; //$NON-NLS-1$
private static final String EXTRA_IS_NEW_TASK = "extra_is_new_task"; private static final String EXTRA_IS_NEW_TASK = "extra_is_new_task";
private static final int REQUEST_CODE_RECORD = 30; // TODO: move this to file control set
// --- request codes
public static final int REQUEST_CODE_RECORD = 30; // TODO: move this to file control set
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject MetadataDao metadataDao;
@Inject UserActivityDao userActivityDao; @Inject UserActivityDao userActivityDao;
@Inject TaskDeleter taskDeleter; @Inject TaskDeleter taskDeleter;
@Inject NotificationManager notificationManager; @Inject NotificationManager notificationManager;
@Inject ActivityPreferences preferences;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject @ForActivity Context context; @Inject @ForActivity Context context;
@Inject TaskEditControlSetFragmentManager taskEditControlSetFragmentManager; @Inject TaskEditControlSetFragmentManager taskEditControlSetFragmentManager;
@Inject CommentsController commentsController;
// --- UI components
private EditNoteActivity editNotes;
@Bind(R.id.edit_body) LinearLayout body;
@Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.toolbar) Toolbar toolbar;
@Bind(R.id.comments) LinearLayout comments;
// --- other instance variables // --- other instance variables
@ -124,30 +95,8 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
/** task model */ /** task model */
Task model = null; Task model = null;
private boolean showEditComments;
private TaskEditFragmentCallbackHandler callback; private TaskEditFragmentCallbackHandler callback;
/*
* ======================================================================
* ======================================================= initialization
* ======================================================================
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// if we were editing a task already, restore it
if (savedInstanceState != null) {
model = savedInstanceState.getParcelable(EXTRA_TASK);
isNewTask = savedInstanceState.getBoolean(EXTRA_IS_NEW_TASK);
}
showEditComments = preferences.getBoolean(R.string.p_show_task_edit_comments, true);
getActivity().setResult(RESULT_OK);
}
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
super.onAttach(activity); super.onAttach(activity);
@ -155,18 +104,16 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
callback = (TaskEditFragmentCallbackHandler) activity; callback = (TaskEditFragmentCallbackHandler) activity;
} }
/*
* ======================================================================
* ==================================================== UI initialization
* ======================================================================
*/
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_task_edit, container, false); View view = inflater.inflate(R.layout.fragment_task_edit, container, false);
ButterKnife.bind(this, view); ButterKnife.bind(this, view);
if (savedInstanceState != null) {
model = savedInstanceState.getParcelable(EXTRA_TASK);
isNewTask = savedInstanceState.getBoolean(EXTRA_IS_NEW_TASK);
}
Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_save_24dp)); Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_save_24dp));
DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white)); DrawableCompat.setTint(drawable, getResources().getColor(android.R.color.white));
toolbar.setNavigationIcon(drawable); toolbar.setNavigationIcon(drawable);
@ -185,14 +132,12 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
notificationManager.cancel(model.getId()); notificationManager.cancel(model.getId());
if (!showEditComments) { commentsController.initialize(model, comments);
// TODO: hide comment bar commentsController.reloadView();
}
return view; return view;
} }
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
AndroidUtilities.hideKeyboard(getActivity()); AndroidUtilities.hideKeyboard(getActivity());
@ -209,30 +154,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
return false; return false;
} }
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Load task data in background
new TaskEditBackgroundLoader().start();
}
private void instantiateEditNotes() {
if (showEditComments) {
editNotes = new EditNoteActivity(metadataDao, userActivityDao, taskService, this, model.getId());
editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
body.addView(editNotes);
}
}
private void loadMoreContainer() {
if (editNotes == null) {
instantiateEditNotes();
} else {
editNotes.loadViewForTaskID(model.getId());
}
}
public Task stopTimer() { public Task stopTimer() {
TimerPlugin.stopTimer(notificationManager, taskService, context, model); TimerPlugin.stopTimer(notificationManager, taskService, context, model);
String elapsedTime = DateUtils.formatElapsedTime(model.getElapsedSeconds()); String elapsedTime = DateUtils.formatElapsedTime(model.getElapsedSeconds());
@ -255,42 +176,12 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
return model; return model;
} }
/**
* Initialize task edit page in the background
*
* @author Tim Su <tim@todoroo.com>
*
*/
private class TaskEditBackgroundLoader extends Thread {
@Override
public void run() {
AndroidUtilities.sleepDeep(500L);
Activity activity = getActivity();
if (activity == null) {
return;
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (getActivity() != null) {
// todo: is this necessary?
loadMoreContainer();
}
}
});
}
}
/* /*
* ====================================================================== * ======================================================================
* =============================================== model reading / saving * =============================================== model reading / saving
* ====================================================================== * ======================================================================
*/ */
/** Save task model from values in UI components */ /** Save task model from values in UI components */
public void save() { public void save() {
List<TaskEditControlFragment> fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder(); List<TaskEditControlFragment> fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder();
@ -392,10 +283,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (editNotes == null) {
instantiateEditNotes();
}
if (requestCode == REQUEST_CODE_RECORD && resultCode == RESULT_OK) { if (requestCode == REQUEST_CODE_RECORD && resultCode == RESULT_OK) {
String recordedAudioPath = data.getStringExtra(AACRecordingActivity.RESULT_OUTFILE); String recordedAudioPath = data.getStringExtra(AACRecordingActivity.RESULT_OUTFILE);
String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME); String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME);
@ -437,6 +324,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
userActivity.setPicture(picture); userActivity.setPicture(picture);
} }
userActivityDao.createNew(userActivity); userActivityDao.createNew(userActivity);
editNotes.reloadView(); commentsController.reloadView();
} }
} }

@ -5,110 +5,73 @@
*/ */
package com.todoroo.astrid.notes; package com.todoroo.astrid.notes;
import android.app.Fragment; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.database.sqlite.SQLiteException;
import android.graphics.Color; import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.text.Html; import android.text.Html;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.todoroo.andlib.data.Callback; import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.service.TaskService;
import org.tasks.R; import org.tasks.R;
import org.tasks.preferences.Preferences;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import timber.log.Timber; import javax.inject.Inject;
import static org.tasks.files.FileHelper.getPathFromUri; import static org.tasks.files.FileHelper.getPathFromUri;
import static org.tasks.files.ImageHelper.sampleBitmap; import static org.tasks.files.ImageHelper.sampleBitmap;
public class EditNoteActivity extends LinearLayout { public class CommentsController {
private Task task;
private final MetadataDao metadataDao; private final MetadataDao metadataDao;
private final UserActivityDao userActivityDao; private final UserActivityDao userActivityDao;
private final TaskService taskService;
private final ArrayList<NoteOrUpdate> items = new ArrayList<>(); private final ArrayList<NoteOrUpdate> items = new ArrayList<>();
private int commentItems = 10; private final Activity activity;
private final Fragment fragment; private Preferences preferences;
private final TaskListActivity activity; private int commentItems = 10;
private Task task;
private ViewGroup commentsContainer;
public EditNoteActivity( @Inject
MetadataDao metadataDao, public CommentsController(MetadataDao metadataDao, UserActivityDao userActivityDao,
UserActivityDao userActivityDao, Activity activity, Preferences preferences) {
TaskService taskService,
Fragment fragment,
long t) {
super(fragment.getActivity());
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
this.userActivityDao = userActivityDao; this.userActivityDao = userActivityDao;
this.taskService = taskService; this.activity = activity;
this.preferences = preferences;
this.fragment = fragment;
this.activity = (TaskListActivity) fragment.getActivity();
setOrientation(VERTICAL);
loadViewForTaskID(t);
} }
private void fetchTask(long id) { public void initialize(Task task, ViewGroup commentsContainer) {
task = taskService.fetchById(id, Task.NOTES, Task.ID, Task.UUID, Task.TITLE); this.task = task;
this.commentsContainer = commentsContainer;
} }
public void loadViewForTaskID(long t){ public void reloadView() {
try { if (!preferences.getBoolean(R.string.p_show_task_edit_comments, true)) {
fetchTask(t);
} catch (SQLiteException e) {
Timber.e(e, e.getMessage());
}
if(task == null) {
return; return;
} }
setUpInterface();
reloadView();
}
// --- UI preparation
private void setUpInterface() {
if(!TextUtils.isEmpty(task.getNotes())) {
TextView notes = new TextView(activity);
notes.setLinkTextColor(Color.rgb(100, 160, 255));
notes.setTextSize(18);
notes.setText(task.getNotes());
notes.setPadding(5, 10, 5, 10);
Linkify.addLinks(notes, Linkify.ALL);
}
}
public void reloadView() {
items.clear(); items.clear();
this.removeAllViews(); commentsContainer.removeAllViews();
metadataDao.byTaskAndKey(task.getId(), NoteMetadata.METADATA_KEY, new Callback<Metadata>() { metadataDao.byTaskAndKey(task.getId(), NoteMetadata.METADATA_KEY, new Callback<Metadata>() {
@Override @Override
public void apply(Metadata metadata) { public void apply(Metadata metadata) {
@ -137,8 +100,8 @@ public class EditNoteActivity extends LinearLayout {
}); });
for (int i = 0; i < Math.min(items.size(), commentItems); i++) { for (int i = 0; i < Math.min(items.size(), commentItems); i++) {
View notesView = this.getUpdateNotes(items.get(i), this); View notesView = this.getUpdateNotes(items.get(i), commentsContainer);
this.addView(notesView); commentsContainer.addView(notesView);
} }
if (items.size() > commentItems) { if (items.size() > commentItems) {
@ -154,19 +117,18 @@ public class EditNoteActivity extends LinearLayout {
reloadView(); reloadView();
} }
}); });
this.addView(loadMore); commentsContainer.addView(loadMore);
} }
} }
public View getUpdateNotes(NoteOrUpdate note, ViewGroup parent) { private View getUpdateNotes(NoteOrUpdate note, ViewGroup parent) {
View convertView = activity.getLayoutInflater().inflate( View convertView = activity.getLayoutInflater().inflate(R.layout.comment_adapter_row, parent, false);
R.layout.comment_adapter_row, parent, false);
bindView(convertView, note); bindView(convertView, note);
return convertView; return convertView;
} }
/** Helper method to set the contents and visibility of each field */ /** Helper method to set the contents and visibility of each field */
public synchronized void bindView(View view, NoteOrUpdate item) { private void bindView(View view, NoteOrUpdate item) {
// name // name
final TextView nameView = (TextView)view.findViewById(R.id.title); { final TextView nameView = (TextView)view.findViewById(R.id.title); {
nameView.setText(item.title); nameView.setText(item.title);
@ -183,20 +145,20 @@ public class EditNoteActivity extends LinearLayout {
// picture // picture
final ImageView commentPictureView = (ImageView)view.findViewById(R.id.comment_picture); final ImageView commentPictureView = (ImageView)view.findViewById(R.id.comment_picture);
setupImagePopupForCommentView(view, commentPictureView, item.commentBitmap, fragment); setupImagePopupForCommentView(view, commentPictureView, item.commentBitmap, activity);
} }
private static void setupImagePopupForCommentView(View view, ImageView commentPictureView, final Uri updateBitmap, private static void setupImagePopupForCommentView(View view, ImageView commentPictureView, final Uri updateBitmap,
final Fragment fragment) { final Activity activity) {
if (updateBitmap != null) { //$NON-NLS-1$ if (updateBitmap != null) {
commentPictureView.setVisibility(View.VISIBLE); commentPictureView.setVisibility(View.VISIBLE);
String path = getPathFromUri(fragment.getActivity(), updateBitmap); String path = getPathFromUri(activity, updateBitmap);
commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height)); commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height));
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
fragment.startActivity(new Intent(Intent.ACTION_VIEW) {{ activity.startActivity(new Intent(Intent.ACTION_VIEW) {{
setDataAndType(updateBitmap, "image/*"); setDataAndType(updateBitmap, "image/*");
}}); }});
} }

@ -16,6 +16,7 @@ import android.view.inputmethod.EditorInfo;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
@ -28,6 +29,7 @@ import org.tasks.activities.CameraActivity;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingFragment; import org.tasks.injection.InjectingFragment;
import org.tasks.preferences.Device; import org.tasks.preferences.Device;
import org.tasks.preferences.Preferences;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -61,10 +63,12 @@ public class CommentBarFragment extends InjectingFragment {
@Inject Activity activity; @Inject Activity activity;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject Device device; @Inject Device device;
@Inject Preferences preferences;
@Bind(R.id.commentButton) View commentButton; @Bind(R.id.commentButton) View commentButton;
@Bind(R.id.commentField) EditText commentField; @Bind(R.id.commentField) EditText commentField;
@Bind(R.id.picture) ImageView pictureButton; @Bind(R.id.picture) ImageView pictureButton;
@Bind(R.id.updatesFooter) LinearLayout commentBar;
private CommentBarFragmentCallback callback; private CommentBarFragmentCallback callback;
private Uri pendingCommentPicture = null; private Uri pendingCommentPicture = null;
@ -92,6 +96,11 @@ public class CommentBarFragment extends InjectingFragment {
commentField.setHorizontallyScrolling(false); commentField.setHorizontallyScrolling(false);
commentField.setMaxLines(Integer.MAX_VALUE); commentField.setMaxLines(Integer.MAX_VALUE);
if (!preferences.getBoolean(R.string.p_show_task_edit_comments, true)) {
commentBar.setVisibility(View.GONE);
}
return view; return view;
} }

@ -21,7 +21,6 @@
android:overScrollMode="never"> android:overScrollMode="never">
<LinearLayout <LinearLayout
android:id="@+id/edit_body"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"
@ -82,6 +81,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/comments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

Loading…
Cancel
Save