From ec062ead7d6abce1be83a15f4e81dadac1b97e0d Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Fri, 23 Oct 2015 13:32:15 +0200 Subject: [PATCH] #12 Time Headers in List-View (Today, Yesterday, ...) --- .../activity/NotesListViewActivity.java | 50 +++++++++--- .../activity/SelectSingleNoteActivity.java | 12 ++- .../notes/android/widget/AllNotesWidget.java | 2 +- .../niedermann/owncloud/notes/model/Item.java | 8 ++ .../owncloud/notes/model/ItemAdapter.java | 78 +++++++++++++++++++ .../niedermann/owncloud/notes/model/Note.java | 9 ++- .../owncloud/notes/model/NoteAdapter.java | 64 --------------- .../owncloud/notes/model/SectionItem.java | 25 ++++++ ....xml => fragment_notes_list_note_item.xml} | 0 .../fragment_notes_list_section_item.xml | 23 ++++++ app/src/main/res/values-de/strings.xml | 7 ++ app/src/main/res/values/strings.xml | 7 ++ 12 files changed, 203 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/Item.java create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java delete mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/NoteAdapter.java create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/SectionItem.java rename app/src/main/res/layout/{fragment_notes_list_view.xml => fragment_notes_list_note_item.xml} (100%) create mode 100644 app/src/main/res/layout/fragment_notes_list_section_item.xml diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index 581f0b80..9a110998 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -17,11 +17,13 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; +import java.util.ArrayList; import java.util.List; import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.model.Item; +import it.niedermann.owncloud.notes.model.ItemAdapter; import it.niedermann.owncloud.notes.model.Note; -import it.niedermann.owncloud.notes.model.NoteAdapter; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.util.ICallback; @@ -39,7 +41,7 @@ public class NotesListViewActivity extends AppCompatActivity implements private final static int about = 3; private ListView listView = null; - private NoteAdapter adapter = null; + private ItemAdapter adapter = null; private ActionMode mActionMode; private SwipeRefreshLayout swipeRefreshLayout = null; private NoteSQLiteOpenHelper db = null; @@ -103,7 +105,31 @@ public class NotesListViewActivity extends AppCompatActivity implements */ @SuppressWarnings("WeakerAccess") public void setListView(List noteList) { - adapter = new NoteAdapter(getApplicationContext(), noteList); + List itemList = new ArrayList<>(); + /* + //TODO Implement #12 + + itemList.add(new SectionItem(getResources().getString(R.string.listview_updated_recent))); + if(noteList.size() > 0) { + itemList.add(noteList.get(0)); + } + Calendar yesterday = Calendar.getInstance(); + yesterday.set(Calendar.HOUR_OF_DAY, 0); + yesterday.set(Calendar.MINUTE, 0); + yesterday.set(Calendar.SECOND, 0); + yesterday.set(Calendar.MILLISECOND, 0); + boolean yesterdaySet = false; + for(int i = 1; i < noteList.size(); i++) { + if (!yesterdaySet && noteList.get(i).getModified().before(yesterday)) { + itemList.add(new SectionItem(getResources().getString(R.string.listview_updated_yesterday))); + yesterdaySet = true; + } + itemList.add(noteList.get(i)); + }*/ + + itemList.addAll(noteList); + + adapter = new ItemAdapter(getApplicationContext(), itemList); listView = (ListView) findViewById(R.id.list_view); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setAdapter(adapter); @@ -130,13 +156,15 @@ public class NotesListViewActivity extends AppCompatActivity implements removeSelection(); Intent intent = new Intent(getApplicationContext(), NoteActivity.class); - Note note = adapter.getItem(position); - intent.putExtra(SELECTED_NOTE, note); - intent.putExtra(SELECTED_NOTE_POSITION, position); - Log.v("Note", - "notePosition | NotesListViewActivity wurde abgesendet " - + position); - startActivityForResult(intent, show_single_note_cmd); + Item item = adapter.getItem(position); + if (!item.isSection()) { + intent.putExtra(SELECTED_NOTE, (Note) item); + intent.putExtra(SELECTED_NOTE_POSITION, position); + Log.v("Note", + "notePosition | NotesListViewActivity wurde abgesendet " + + position); + startActivityForResult(intent, show_single_note_cmd); + } } else { // perform long click if already something is selected onListItemSelect(position); } @@ -285,7 +313,7 @@ public class NotesListViewActivity extends AppCompatActivity implements .getCheckedItemPositions(); for (int i = (checkedItemPositions.size() - 1); i >= 0; i--) { if (checkedItemPositions.valueAt(i)) { - Note note = adapter.getItem(checkedItemPositions + Note note = (Note) adapter.getItem(checkedItemPositions .keyAt(i)); db.deleteNoteAndSync(note.getId()); adapter.remove(note); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/SelectSingleNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/SelectSingleNoteActivity.java index 860c853b..4eb7162e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/SelectSingleNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/SelectSingleNoteActivity.java @@ -10,12 +10,14 @@ import android.widget.AdapterView; import android.widget.ListView; import android.widget.RemoteViews; +import java.util.ArrayList; import java.util.List; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.widget.SingleNoteWidget; +import it.niedermann.owncloud.notes.model.Item; +import it.niedermann.owncloud.notes.model.ItemAdapter; import it.niedermann.owncloud.notes.model.Note; -import it.niedermann.owncloud.notes.model.NoteAdapter; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; /** @@ -27,7 +29,7 @@ public class SelectSingleNoteActivity extends AppCompatActivity implements Adapt int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private NoteSQLiteOpenHelper db = null; private ListView listView = null; - private NoteAdapter adapter = null; + private ItemAdapter adapter = null; @Override public void onCreate(Bundle savedInstanceState) { @@ -60,7 +62,9 @@ public class SelectSingleNoteActivity extends AppCompatActivity implements Adapt * @param noteList List<Note> */ private void setListView(List noteList) { - adapter = new NoteAdapter(getApplicationContext(), noteList); + List itemList = new ArrayList<>(); + itemList.addAll(noteList); + adapter = new ItemAdapter(getApplicationContext(), itemList); listView = (ListView) findViewById(R.id.select_single_note_list_view); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setAdapter(adapter); @@ -75,7 +79,7 @@ public class SelectSingleNoteActivity extends AppCompatActivity implements Adapt RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_single_note); appWidgetManager.updateAppWidget(appWidgetId, views); - SingleNoteWidget.updateAppWidget(adapter.getItem(position), context, appWidgetManager, appWidgetId); + SingleNoteWidget.updateAppWidget((Note) adapter.getItem(position), context, appWidgetManager, appWidgetId); Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/widget/AllNotesWidget.java b/app/src/main/java/it/niedermann/owncloud/notes/android/widget/AllNotesWidget.java index 3c6aca28..e85c7e64 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/widget/AllNotesWidget.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/widget/AllNotesWidget.java @@ -88,7 +88,7 @@ public class AllNotesWidget extends AppWidgetProvider { public RemoteViews getViewAt(int position) { // Construct a remote views item based on the app widget item XML file, // and set the text based on the position. - RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.fragment_notes_list_view); + RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.fragment_notes_list_note_item); rv.setTextViewText(R.id.list_view, mWidgetItems.get(position).getTitle()); // Return the remote views object. diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/Item.java b/app/src/main/java/it/niedermann/owncloud/notes/model/Item.java new file mode 100644 index 00000000..2e46f58c --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/Item.java @@ -0,0 +1,8 @@ +package it.niedermann.owncloud.notes.model; + +/** + * Created by stefan on 23.10.15. + */ +public interface Item { + boolean isSection(); +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java new file mode 100644 index 00000000..df3acbfe --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -0,0 +1,78 @@ +package it.niedermann.owncloud.notes.model; + +import android.content.Context; +import android.text.format.DateUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import java.util.List; + +import it.niedermann.owncloud.notes.R; + +public class ItemAdapter extends ArrayAdapter { + private List itemList = null; + + public ItemAdapter(Context context, List itemList) { + super(context, android.R.layout.simple_list_item_1, itemList); + this.itemList = itemList; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = convertView; + + Item item = itemList.get(position); + + if (item.isSection()) { + // first check to see if the view is null. if so, we have to inflate it. + // to inflate it basically means to render, or show, the view. + if (v == null) { + LayoutInflater inflater = (LayoutInflater) getContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + v = inflater.inflate(R.layout.fragment_notes_list_section_item, null); + } + SectionItem section = (SectionItem) item; + TextView sectionTitle = (TextView) v.findViewById(R.id.sectionTitle); + sectionTitle.setText(section.geTitle()); + + } else { + // first check to see if the view is null. if so, we have to inflate it. + // to inflate it basically means to render, or show, the view. + if (v == null) { + LayoutInflater inflater = (LayoutInflater) getContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + v = inflater.inflate(R.layout.fragment_notes_list_note_item, null); + } + /* + * Recall that the variable position is sent in as an argument to this + * method. The variable simply refers to the position of the current + * object in the list. (The ArrayAdapter iterates through the list we + * sent it) + * + * Therefore, i refers to the current Item object. + */ + Note note = (Note) item; + + if (note != null) { + + // This is how you obtain a reference to the TextViews. + // These TextViews are created in the XML files we defined. + + TextView noteTitle = (TextView) v.findViewById(R.id.noteTitle); + TextView noteExcerpt = (TextView) v + .findViewById(R.id.noteExcerpt); + TextView noteModified = (TextView) v.findViewById(R.id.noteModified); + + noteTitle.setText(note.getTitle()); + noteExcerpt.setText(note.getExcerpt()); + noteModified.setText(DateUtils.getRelativeDateTimeString(getContext(), note.getModified().getTimeInMillis(), DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0)); + } + } + + // the view must be returned to our activity + return v; + } +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/Note.java b/app/src/main/java/it/niedermann/owncloud/notes/model/Note.java index 00742891..7525f5e9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/Note.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/Note.java @@ -9,8 +9,8 @@ import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.util.NoteUtil; @SuppressWarnings("serial") -public class Note implements Serializable { - private long id = 0; +public class Note implements Item, Serializable { + private long id = 0; private String title = ""; private Calendar modified = null; private String content = ""; @@ -77,4 +77,9 @@ public class Note implements Serializable { public String toString() { return "#" + getId() + " " + getTitle() + " (" + getModified(NoteSQLiteOpenHelper.DATE_FORMAT) + ")"; } + + @Override + public boolean isSection() { + return false; + } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteAdapter.java deleted file mode 100644 index bb87cb33..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteAdapter.java +++ /dev/null @@ -1,64 +0,0 @@ -package it.niedermann.owncloud.notes.model; - -import android.content.Context; -import android.text.format.DateUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.TextView; - -import java.util.List; - -import it.niedermann.owncloud.notes.R; - -public class NoteAdapter extends ArrayAdapter { - private List noteList = null; - - public NoteAdapter(Context context, - List noteList) { - super(context, android.R.layout.simple_list_item_1, noteList); - this.noteList = noteList; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v = convertView; - - // first check to see if the view is null. if so, we have to inflate it. - // to inflate it basically means to render, or show, the view. - if (v == null) { - LayoutInflater inflater = (LayoutInflater) getContext() - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = inflater.inflate(R.layout.fragment_notes_list_view, null); - } - - /* - * Recall that the variable position is sent in as an argument to this - * method. The variable simply refers to the position of the current - * object in the list. (The ArrayAdapter iterates through the list we - * sent it) - * - * Therefore, i refers to the current Item object. - */ - Note note = noteList.get(position); - - if (note != null) { - - // This is how you obtain a reference to the TextViews. - // These TextViews are created in the XML files we defined. - - TextView noteTitle = (TextView) v.findViewById(R.id.noteTitle); - TextView noteExcerpt = (TextView) v - .findViewById(R.id.noteExcerpt); - TextView noteModified = (TextView) v.findViewById(R.id.noteModified); - - noteTitle.setText(note.getTitle()); - noteExcerpt.setText(note.getExcerpt()); - noteModified.setText(DateUtils.getRelativeDateTimeString(getContext(), note.getModified().getTimeInMillis(), DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0)); - } - - // the view must be returned to our activity - return v; - } -} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItem.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItem.java new file mode 100644 index 00000000..0248d51f --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItem.java @@ -0,0 +1,25 @@ +package it.niedermann.owncloud.notes.model; + +/** + * Created by stefan on 23.10.15. + */ +public class SectionItem implements Item { + String title = ""; + + public SectionItem(String title) { + this.title = title; + } + + public String geTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public boolean isSection() { + return true; + } +} diff --git a/app/src/main/res/layout/fragment_notes_list_view.xml b/app/src/main/res/layout/fragment_notes_list_note_item.xml similarity index 100% rename from app/src/main/res/layout/fragment_notes_list_view.xml rename to app/src/main/res/layout/fragment_notes_list_note_item.xml diff --git a/app/src/main/res/layout/fragment_notes_list_section_item.xml b/app/src/main/res/layout/fragment_notes_list_section_item.xml new file mode 100644 index 00000000..a25c6e6f --- /dev/null +++ b/app/src/main/res/layout/fragment_notes_list_section_item.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2552d59a..dc00314e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,6 +20,13 @@ Kopie + Kürzlich aktualisiert + Heute aktualisiert + Gestern aktualisiert + Diese Woche aktualisiert + Diesen Monat aktualisiert + Früher aktualisiert + Version diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 246832f5..d8a4adef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,6 +20,13 @@ Copy + Updated recently + Updated today + Updated yesterday + Updated this week + Updated this month + Updated earlier + Version