diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-10-10 23:50:03 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-10-10 23:50:03 +0900 |
commit | 086c65a5128aa75db4802a16170792354d217452 (patch) | |
tree | 0c8f9204b1e7edbc42838499a4e20b166b51870f /app | |
parent | 11d41a439e55b198d222cd1c6139100b5ca0f8f2 (diff) | |
download | SmileEssence-086c65a5128aa75db4802a16170792354d217452.tar.gz |
CustomListAdapter: UI スレッドで sort() が走るのはアレアレ感あったので自動でソートされる OrderedCustomListAdapter と UnorderedCustomListAdapter に分けた
Diffstat (limited to 'app')
38 files changed, 339 insertions, 270 deletions
diff --git a/app/src/androidTest/java/net/lacolaco/smileessence/view/adapter/CustomListAdapterTest.java b/app/src/androidTest/java/net/lacolaco/smileessence/view/adapter/OrderedCustomListAdapterTest.java index 0b7f95cc..2bb156b3 100644 --- a/app/src/androidTest/java/net/lacolaco/smileessence/view/adapter/CustomListAdapterTest.java +++ b/app/src/androidTest/java/net/lacolaco/smileessence/view/adapter/OrderedCustomListAdapterTest.java @@ -31,31 +31,31 @@ import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.util.TwitterMock; import net.lacolaco.smileessence.viewmodel.StatusViewModel; -public class CustomListAdapterTest extends ActivityInstrumentationTestCase2<MainActivity> { +public class OrderedCustomListAdapterTest extends ActivityInstrumentationTestCase2<MainActivity> { TwitterMock mock; - CustomListAdapter<StatusViewModel> adapter; + OrderedCustomListAdapter<StatusViewModel> adapter; Account account; - public CustomListAdapterTest() { + public OrderedCustomListAdapterTest() { super(MainActivity.class); } @Override public void setUp() throws Exception { mock = new TwitterMock(getInstrumentation().getContext()); - adapter = new CustomListAdapter<>(getActivity()); + adapter = new OrderedCustomListAdapter<>(getActivity()); account = mock.getAccount(); } public void testAddItem() throws Exception { - adapter.addToBottom(new StatusViewModel(mock.getReplyMock())); + adapter.addItem(new StatusViewModel(mock.getReplyMock())); adapter.notifyDataSetChanged(); assertEquals(1, adapter.getCount()); } public void testUpdate() throws Exception { - adapter.addToBottom(new StatusViewModel(mock.getReplyMock())); + adapter.addItem(new StatusViewModel(mock.getReplyMock())); assertEquals(0, adapter.getCount()); adapter.notifyDataSetChanged(); assertEquals(1, adapter.getCount()); @@ -64,28 +64,20 @@ public class CustomListAdapterTest extends ActivityInstrumentationTestCase2<Main public void testAddItems() throws Exception { StatusViewModel viewModel1 = new StatusViewModel(mock.getReplyMock()); StatusViewModel viewModel2 = new StatusViewModel(mock.getReplyMock()); - adapter.addToBottom(viewModel1, viewModel2); + adapter.addItem(viewModel1, viewModel2); adapter.notifyDataSetChanged(); assertEquals(2, adapter.getCount()); } public void testRemoveItem() throws Exception { - StatusViewModel viewModel = new StatusViewModel(mock.getReplyMock()); - adapter.addToBottom(viewModel, viewModel); - adapter.notifyDataSetChanged(); - assertEquals(1, adapter.getCount()); - adapter.removeItem(0); + StatusViewModel viewModel1 = new StatusViewModel(mock.getReplyMock()); + StatusViewModel viewModel2 = new StatusViewModel(mock.getReplyMock()); + adapter.addItem(viewModel1, viewModel2); adapter.notifyDataSetChanged(); - assertEquals(0, adapter.getCount()); - } - - public void testAddPosition() throws Exception { - StatusViewModel status1 = new StatusViewModel(mock.getReplyMock()); - StatusViewModel status2 = new StatusViewModel(mock.getReplyMock()); - adapter.addToBottom(status1); - adapter.addToTop(status2); + assertEquals(2, adapter.getCount()); + adapter.removeItem(viewModel1); adapter.notifyDataSetChanged(); - assertEquals(status2, adapter.getItem(0)); + assertEquals(1, adapter.getCount()); } @Override diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/EditCommandActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/EditCommandActivity.java index 0a0b531d..6d47656e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/EditCommandActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/EditCommandActivity.java @@ -37,7 +37,7 @@ import net.lacolaco.smileessence.command.status.StatusCommand; import net.lacolaco.smileessence.command.user.UserCommand; import net.lacolaco.smileessence.entity.CommandSetting; import net.lacolaco.smileessence.logging.Logger; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import net.lacolaco.smileessence.viewmodel.CheckBoxModel; import java.util.ArrayList; @@ -47,7 +47,7 @@ public class EditCommandActivity extends Activity { // ------------------------------ FIELDS ------------------------------ - private CustomListAdapter<CheckBoxModel> adapter; + private UnorderedCustomListAdapter<CheckBoxModel> adapter; private List<Command> editedCommands; // --------------------- GETTER / SETTER METHODS --------------------- @@ -137,9 +137,9 @@ public class EditCommandActivity extends Activity { private void initializeViews() { ListView listView = getListView(); - adapter = new CustomListAdapter<>(this); + adapter = new UnorderedCustomListAdapter<>(this); listView.setAdapter(adapter); - adapter.addToTop(getCheckBoxItems()); + adapter.addItemToTop(getCheckBoxItems()); adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.java index c010734f..9db52c25 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.java @@ -37,9 +37,10 @@ import android.widget.TextView; import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.entity.ExtractionWord; +import net.lacolaco.smileessence.entity.IdObject; import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.view.DialogHelper; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.OrderedCustomListAdapter; import net.lacolaco.smileessence.view.dialog.EditTextDialogFragment; import net.lacolaco.smileessence.viewmodel.IViewModel; @@ -47,7 +48,7 @@ public class EditExtractionActivity extends Activity implements AdapterView.OnIt // ------------------------------ FIELDS ------------------------------ - private CustomListAdapter<ExtractionWordViewModel> adapter; + private OrderedCustomListAdapter<ExtractionWordViewModel> adapter; // --------------------- GETTER / SETTER METHODS --------------------- @@ -143,8 +144,9 @@ public class EditExtractionActivity extends Activity implements AdapterView.OnIt adapter.setNotifiable(false); for (int i = adapter.getCount() - 1; i > -1; i--) { if (checkedItems.get(i)) { - ExtractionWordViewModel vm = adapter.removeItem(i); + ExtractionWordViewModel vm = adapter.getItem(i); vm.getExtractionWord().remove(); + adapter.removeItem(vm); } } adapter.setNotifiable(true); @@ -177,7 +179,7 @@ public class EditExtractionActivity extends Activity implements AdapterView.OnIt return; } ExtractionWord extractionWord = ExtractionWord.add(text); - adapter.addToBottom(new ExtractionWordViewModel(extractionWord)); + adapter.addItem(new ExtractionWordViewModel(extractionWord)); adapter.notifyDataSetChanged(); updateListView(); } @@ -188,9 +190,9 @@ public class EditExtractionActivity extends Activity implements AdapterView.OnIt private void initializeViews() { ListView listView = getListView(); - adapter = new CustomListAdapter<>(this); + adapter = new OrderedCustomListAdapter<>(this); for (ExtractionWord ew : ExtractionWord.all()) { - adapter.addToBottom(new ExtractionWordViewModel(ew)); + adapter.addItem(new ExtractionWordViewModel(ew)); } adapter.update(); listView.setAdapter(adapter); @@ -207,7 +209,7 @@ public class EditExtractionActivity extends Activity implements AdapterView.OnIt // --------------------- Interface IViewModel --------------------- - private static class ExtractionWordViewModel implements IViewModel { + private static class ExtractionWordViewModel implements IViewModel, IdObject { private final ExtractionWord ew; public ExtractionWordViewModel(ExtractionWord ew) { @@ -227,5 +229,10 @@ public class EditExtractionActivity extends Activity implements AdapterView.OnIt textView.setText(ew.getPatternString()); return convertedView; } + + @Override + public long getId() { + return ew.getModelId(); + } } } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/EditTabActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/EditTabActivity.java index 521b0691..ac2200b6 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/EditTabActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/EditTabActivity.java @@ -34,45 +34,46 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.preference.UserPreferenceHelper; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.OrderedCustomListAdapter; import net.lacolaco.smileessence.viewmodel.EditableCheckBoxModel; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class EditTabActivity extends Activity { // ------------------------------ FIELDS ------------------------------ - private CustomListAdapter<EditableCheckBoxModel> adapter; + private OrderedCustomListAdapter<EditableCheckBoxModel> adapter; // --------------------- GETTER / SETTER METHODS --------------------- private EditableCheckBoxModel[] getCheckBoxItems() { List<EditableCheckBoxModel> models = new ArrayList<>(); - EditableCheckBoxModel post = new EditableCheckBoxModel(getString(R.string.page_name_post)); + EditableCheckBoxModel post = new EditableCheckBoxModel(0, getString(R.string.page_name_post)); post.setChecked(true).setInputText(String.valueOf(0)).setFreezing(true); models.add(post); - EditableCheckBoxModel home = new EditableCheckBoxModel(getString(R.string.page_name_home)); + EditableCheckBoxModel home = new EditableCheckBoxModel(1, getString(R.string.page_name_home)); home.setChecked(true).setInputText(String.valueOf(1)).setFreezing(true); models.add(home); - EditableCheckBoxModel mentions = new EditableCheckBoxModel(getString(R.string.page_name_mentions)); + EditableCheckBoxModel mentions = new EditableCheckBoxModel(2, getString(R.string.page_name_mentions)); mentions.setChecked(true).setInputText(String.valueOf(2)).setFreezing(true); models.add(mentions); - EditableCheckBoxModel messages = new EditableCheckBoxModel(getString(R.string.page_name_messages)); + EditableCheckBoxModel messages = new EditableCheckBoxModel(3, getString(R.string.page_name_messages)); messages.setChecked(getVisibility(R.string.key_page_messages_visibility)) .setInputText(String.valueOf(getPosition(R.string.key_page_messages_position, 3))); models.add(messages); - EditableCheckBoxModel history = new EditableCheckBoxModel(getString(R.string.page_name_history)); + EditableCheckBoxModel history = new EditableCheckBoxModel(4, getString(R.string.page_name_history)); history.setChecked(getVisibility(R.string.key_page_history_visibility)) .setInputText(String.valueOf(getPosition(R.string.key_page_history_position, 4))); models.add(history); - EditableCheckBoxModel search = new EditableCheckBoxModel(getString(R.string.page_name_search)); + EditableCheckBoxModel search = new EditableCheckBoxModel(5, getString(R.string.page_name_search)); search.setChecked(getVisibility(R.string.key_page_search_visibility)) .setInputText(String.valueOf(getPosition(R.string.key_page_search_position, 5))); models.add(search); - EditableCheckBoxModel list = new EditableCheckBoxModel(getString(R.string.page_name_list)); + EditableCheckBoxModel list = new EditableCheckBoxModel(6, getString(R.string.page_name_list)); list.setChecked(getVisibility(R.string.key_page_list_visibility)) .setInputText(String.valueOf(getPosition(R.string.key_page_list_position, 6))); models.add(list); @@ -131,9 +132,9 @@ public class EditTabActivity extends Activity { private void initializeViews() { ListView listView = getListView(); - adapter = new CustomListAdapter<>(this); + adapter = new OrderedCustomListAdapter<>(this, Collections.reverseOrder()); listView.setAdapter(adapter); - adapter.addToTop(getCheckBoxItems()); + adapter.addItem(getCheckBoxItems()); adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/EditTemplateActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/EditTemplateActivity.java index 1ae7376d..c322c845 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/EditTemplateActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/EditTemplateActivity.java @@ -38,7 +38,7 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.entity.Template; import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.view.DialogHelper; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import net.lacolaco.smileessence.view.dialog.EditTextDialogFragment; import java.util.List; @@ -48,7 +48,7 @@ public class EditTemplateActivity extends Activity implements AdapterView.OnItem // ------------------------------ FIELDS ------------------------------ - private CustomListAdapter<Template> adapter; + private UnorderedCustomListAdapter<Template> adapter; // --------------------- GETTER / SETTER METHODS --------------------- @@ -149,8 +149,9 @@ public class EditTemplateActivity extends Activity implements AdapterView.OnItem adapter.setNotifiable(false); for (int i = adapter.getCount() - 1; i > -1; i--) { if (checkedItems.get(i)) { - Template template = adapter.removeItem(i); + Template template = adapter.getItem(i); template.delete(); + adapter.removeItem(template); } } adapter.setNotifiable(true); @@ -186,7 +187,7 @@ public class EditTemplateActivity extends Activity implements AdapterView.OnItem } template.text = text; template.save(); - adapter.addToBottom(template); + adapter.addItemToBottom(template); adapter.notifyDataSetChanged(); updateListView(); } @@ -197,9 +198,9 @@ public class EditTemplateActivity extends Activity implements AdapterView.OnItem private void initializeViews() { ListView listView = getListView(); - adapter = new CustomListAdapter<>(this); + adapter = new UnorderedCustomListAdapter<>(this); listView.setAdapter(adapter); - adapter.addToTop(getTemplates()); + adapter.addItemToBottom(getTemplates()); adapter.update(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setOnItemClickListener(this); diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.java b/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.java new file mode 100644 index 00000000..444a627b --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.java @@ -0,0 +1,5 @@ +package net.lacolaco.smileessence.entity; + +public interface IdObject { + long getId(); +} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/CustomListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/CustomListAdapter.java index cae7dc82..ba888142 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/CustomListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/CustomListAdapter.java @@ -1,27 +1,3 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2012-2014 lacolaco.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - package net.lacolaco.smileessence.view.adapter; import android.app.Activity; @@ -31,20 +7,16 @@ import android.widget.BaseAdapter; import net.lacolaco.smileessence.util.UIHandler; import net.lacolaco.smileessence.viewmodel.IViewModel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; -public class CustomListAdapter<T extends IViewModel> extends BaseAdapter { +public abstract class CustomListAdapter<T extends IViewModel> extends BaseAdapter { // ------------------------------ FIELDS ------------------------------ protected final Object LOCK = new Object(); - protected List<T> list = new ArrayList<>(); - protected List<T> frozenList = new ArrayList<>(); private boolean isNotifiable = true; - protected Activity activity; + private List<T> frozenList = new ArrayList<>(); + private Activity activity; // --------------------------- CONSTRUCTORS --------------------------- @@ -54,30 +26,27 @@ public class CustomListAdapter<T extends IViewModel> extends BaseAdapter { // --------------------- GETTER / SETTER METHODS --------------------- - @Override - public int getCount() { - return frozenList.size(); - } - - public boolean isNotifiable() { + public final boolean isNotifiable() { synchronized (LOCK) { return isNotifiable; } } - public void setNotifiable(boolean notifiable) { + public final void setNotifiable(boolean notifiable) { synchronized (LOCK) { isNotifiable = notifiable; } } - // ------------------------ INTERFACE METHODS ------------------------ - + // --------------------- Interface BaseAdapter --------------------- - // --------------------- Interface Adapter --------------------- + @Override + public final int getCount() { + return frozenList.size(); + } @Override - public T getItem(int position) { + public final T getItem(int position) { return frozenList.get(position); } @@ -87,65 +56,21 @@ public class CustomListAdapter<T extends IViewModel> extends BaseAdapter { } @Override - public View getView(int position, View convertView, ViewGroup parent) { + public final View getView(int position, View convertView, ViewGroup parent) { return getItem(position).getView(activity, activity.getLayoutInflater(), convertView); } // ------------------------ OVERRIDE METHODS ------------------------ @Override - public void notifyDataSetChanged() { - sort(); - frozenList = Collections.unmodifiableList(new ArrayList<>(list)); + public final void notifyDataSetChanged() { + frozenList = getFrozenList(); super.notifyDataSetChanged(); } // -------------------------- OTHER METHODS -------------------------- - public void addToBottom(T... items) { - synchronized (LOCK) { - for (T item : items) { - if (list.contains(item)) { - list.remove(item); - } - list.add(item); - } - } - } - - public void addToTop(T... items) { - synchronized (LOCK) { - List<T> buffer = Arrays.asList(items); - Collections.reverse(buffer); - for (T item : buffer) { - if (list.contains(item)) { - list.remove(item); - } - list.add(0, item); - } - } - } - - public void clear() { - synchronized (LOCK) { - list.clear(); - } - } - - public T removeItem(int position) { - synchronized (LOCK) { - return list.remove(position); - } - } - - public boolean removeItem(T item) { - synchronized (LOCK) { - return list.remove(item); - } - } - - protected void sort() { - } + protected abstract List<T> getFrozenList(); public void update() { if (isNotifiable()) { @@ -154,8 +79,6 @@ public class CustomListAdapter<T extends IViewModel> extends BaseAdapter { } public void updateForce() { - synchronized (LOCK) { - new UIHandler().post(this::notifyDataSetChanged); - } + new UIHandler().post(this::notifyDataSetChanged); } -} +}
\ No newline at end of file diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/EventListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/EventListAdapter.java index d381e9ae..18741e02 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/EventListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/EventListAdapter.java @@ -27,7 +27,7 @@ package net.lacolaco.smileessence.view.adapter; import android.app.Activity; import net.lacolaco.smileessence.viewmodel.EventViewModel; -public class EventListAdapter extends CustomListAdapter<EventViewModel> { +public class EventListAdapter extends UnorderedCustomListAdapter<EventViewModel> { // --------------------------- CONSTRUCTORS --------------------------- diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.java index 9f9a39a0..114f9e58 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.java @@ -27,10 +27,7 @@ package net.lacolaco.smileessence.view.adapter; import android.app.Activity; import net.lacolaco.smileessence.viewmodel.MessageViewModel; -import java.util.Collections; -import java.util.Iterator; - -public class MessageListAdapter extends CustomListAdapter<MessageViewModel> { +public class MessageListAdapter extends OrderedCustomListAdapter<MessageViewModel> { // --------------------------- CONSTRUCTORS --------------------------- @@ -47,29 +44,4 @@ public class MessageListAdapter extends CustomListAdapter<MessageViewModel> { public long getTopID() { return getItem(0).getDirectMessage().getId(); } - - // ------------------------ OVERRIDE METHODS ------------------------ - - @Override - public void sort() { - synchronized (LOCK) { - Collections.sort(list, (lhs, rhs) -> rhs.getDirectMessage().getCreatedAt().compareTo(lhs.getDirectMessage().getCreatedAt())); - } - } - - // -------------------------- OTHER METHODS -------------------------- - - public MessageViewModel removeByMessageID(long messageID) { - synchronized (this.LOCK) { - Iterator<MessageViewModel> iterator = this.list.iterator(); - while (iterator.hasNext()) { - MessageViewModel message = iterator.next(); - if (message.getDirectMessage().getId() == messageID) { - iterator.remove(); - return message; - } - } - return null; - } - } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/OrderedCustomListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/OrderedCustomListAdapter.java new file mode 100644 index 00000000..965e51f0 --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/OrderedCustomListAdapter.java @@ -0,0 +1,89 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2012-2014 lacolaco.net + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.lacolaco.smileessence.view.adapter; + +import android.app.Activity; +import net.lacolaco.smileessence.entity.IdObject; +import net.lacolaco.smileessence.viewmodel.IViewModel; + +import java.util.*; + +public class OrderedCustomListAdapter<T extends IViewModel & IdObject> extends CustomListAdapter<T> { + + // ------------------------------ FIELDS ------------------------------ + + protected final Map<Long, T> treeMap; + + // --------------------------- CONSTRUCTORS --------------------------- + + public OrderedCustomListAdapter(Activity activity) { + this(activity, Long::compare); + } + + public OrderedCustomListAdapter(Activity activity, Comparator<Long> comparator) { + super(activity); + this.treeMap = new TreeMap<>(Collections.reverseOrder(comparator)); // 降順 + } + + // ------------------------ OVERRIDE METHODS ------------------------ + + @Override + protected List<T> getFrozenList() { + return Collections.unmodifiableList(new ArrayList<>(treeMap.values())); + } + + // -------------------------- OTHER METHODS -------------------------- + + public void addItem(T... items) { + synchronized (LOCK) { + for (T item : items) { + treeMap.put(item.getId(), item); + } + } + } + + public void clear() { + synchronized (LOCK) { + treeMap.clear(); + } + } + + public T removeItem(T item) { + synchronized (LOCK) { + return treeMap.remove(item.getId()); + } + } + + public int removeItemById(long id) { + synchronized (LOCK) { + T item = treeMap.remove(id); + if (item == null) { + return 0; + } else { + return 1; + } + } + } +} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java index 8c535c85..55f8ce9a 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/SearchListAdapter.java @@ -80,5 +80,4 @@ public class SearchListAdapter extends StatusListAdapter { void onQueryChange(String newQuery); } - } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/StatusListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/StatusListAdapter.java index 314353c4..b9f7929d 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/StatusListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/StatusListAdapter.java @@ -25,12 +25,10 @@ package net.lacolaco.smileessence.view.adapter; import android.app.Activity; +import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.viewmodel.StatusViewModel; -import java.util.Collections; -import java.util.Iterator; - -public class StatusListAdapter extends CustomListAdapter<StatusViewModel> { +public class StatusListAdapter extends OrderedCustomListAdapter<StatusViewModel> { // --------------------------- CONSTRUCTORS --------------------------- @@ -56,29 +54,20 @@ public class StatusListAdapter extends CustomListAdapter<StatusViewModel> { } } - // ------------------------ OVERRIDE METHODS ------------------------ + // -------------------------- OTHER METHODS -------------------------- - /** - * Sort list by Status ID - */ @Override - protected void sort() { + public int removeItemById(long statusID) { synchronized (LOCK) { - Collections.sort(list, (lhs, rhs) -> Long.valueOf(rhs.getTweet().getId()).compareTo(lhs.getTweet().getId())); - } - } - - // -------------------------- OTHER METHODS -------------------------- - - public void removeByStatusID(long statusID) { - synchronized (this.LOCK) { - Iterator<StatusViewModel> iterator = this.list.iterator(); - while (iterator.hasNext()) { - StatusViewModel statusViewModel = iterator.next(); - if (statusViewModel.getTweet().getOriginalTweet().getId() == statusID) { - iterator.remove(); + int count = 0; + count += super.removeItemById(statusID); + Tweet t = Tweet.fetch(statusID); + if (t != null) { + for (long retweetId : t.getRetweets().values()) { + count += super.removeItemById(retweetId); } } + return count; } } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/UnorderedCustomListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/UnorderedCustomListAdapter.java new file mode 100644 index 00000000..c115a0dc --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/UnorderedCustomListAdapter.java @@ -0,0 +1,84 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2012-2014 lacolaco.net + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.lacolaco.smileessence.view.adapter; + +import android.app.Activity; +import net.lacolaco.smileessence.viewmodel.IViewModel; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class UnorderedCustomListAdapter<T extends IViewModel> extends CustomListAdapter<T> { + + // ------------------------------ FIELDS ------------------------------ + + protected final List<T> linkedList; + + // --------------------------- CONSTRUCTORS --------------------------- + + public UnorderedCustomListAdapter(Activity activity) { + super(activity); + this.linkedList = new LinkedList<>(); + } + + // ------------------------ OVERRIDE METHODS ------------------------ + + @Override + protected List<T> getFrozenList() { + return Collections.unmodifiableList(new ArrayList<>(linkedList)); + } + + // -------------------------- OTHER METHODS -------------------------- + + public void addItemToTop(T... items) { + synchronized (LOCK) { + for (T item : items) { + linkedList.add(item); + } + } + } + + public void addItemToBottom(T... items) { + synchronized (LOCK) { + for (T item : items) { + linkedList.add(0, item); + } + } + } + + public void clear() { + synchronized (LOCK) { + linkedList.clear(); + } + } + + public boolean removeItem(T item) { + synchronized (LOCK) { + return linkedList.remove(item); + } + } +} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/UserListListAdapter.java b/app/src/main/java/net/lacolaco/smileessence/view/adapter/UserListListAdapter.java index 215416b5..81e33d7e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/UserListListAdapter.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/UserListListAdapter.java @@ -25,7 +25,6 @@ package net.lacolaco.smileessence.view.adapter; import android.app.Activity; -import net.lacolaco.smileessence.viewmodel.StatusViewModel; public class UserListListAdapter extends StatusListAdapter { @@ -48,16 +47,4 @@ public class UserListListAdapter extends StatusListAdapter { public void setListFullName(String listFullName) { this.listFullName = listFullName; } - - // ------------------------ OVERRIDE METHODS ------------------------ - - @Override - public void addToBottom(StatusViewModel... items) { - super.addToBottom(items); - } - - @Override - public void addToTop(StatusViewModel... items) { - super.addToTop(items); - } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/ChooseTemplateDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/ChooseTemplateDialogFragment.java index 4e7c6ab9..e4629c19 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/ChooseTemplateDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/ChooseTemplateDialogFragment.java @@ -27,7 +27,7 @@ package net.lacolaco.smileessence.view.dialog; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.post.PostCommandUseTemplate; import net.lacolaco.smileessence.entity.Template; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -37,10 +37,10 @@ public class ChooseTemplateDialogFragment extends MenuDialogFragment { // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { List<Command> commands = getCommands(); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/HashtagDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/HashtagDialogFragment.java index 7269508c..abc4539b 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/HashtagDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/HashtagDialogFragment.java @@ -31,7 +31,7 @@ import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandPasteToPost; import net.lacolaco.smileessence.command.CommandSaveAsTemplate; import net.lacolaco.smileessence.command.CommandSearchOnTwitter; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -57,12 +57,12 @@ public class HashtagDialogFragment extends MenuDialogFragment { // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { String text = getHashtagText(); List<Command> commands = getCommands(text); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MenuDialogFragment.java index 71355d61..0bf496c6 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MenuDialogFragment.java @@ -34,7 +34,7 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.IConfirmable; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; public abstract class MenuDialogFragment extends StackableDialogFragment implements AdapterView.OnItemClickListener { @Override @@ -42,7 +42,7 @@ public abstract class MenuDialogFragment extends StackableDialogFragment impleme final MainActivity activity = (MainActivity) getActivity(); View body = activity.getLayoutInflater().inflate(R.layout.dialog_menu_list, null); ListView listView = (ListView) body.findViewById(R.id.listview_dialog_menu_list); - final CustomListAdapter<Command> adapter = new CustomListAdapter<>(activity); + final UnorderedCustomListAdapter<Command> adapter = new UnorderedCustomListAdapter<>(activity); listView.setAdapter(adapter); listView.setOnItemClickListener(this); @@ -51,7 +51,7 @@ public abstract class MenuDialogFragment extends StackableDialogFragment impleme return new AlertDialog.Builder(activity).setView(body).create(); } - protected abstract void setMenuItems(final CustomListAdapter<Command> adapter); + protected abstract void setMenuItems(final UnorderedCustomListAdapter<Command> adapter); protected void executeCommand(Command command) { dismiss(); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java index 1a23bd28..f809807f 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.java @@ -125,7 +125,7 @@ public class MessageDetailDialogFragment extends StackableDialogFragment impleme } if (replyTo != null) { listView.setVisibility(View.VISIBLE); - adapter.addToTop(new MessageViewModel(replyTo)); + adapter.addItem(new MessageViewModel(replyTo)); adapter.updateForce(); } else { listView.setVisibility(View.GONE); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java index 27be3e54..228820f7 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageMenuDialogFragment.java @@ -28,7 +28,7 @@ import android.app.Activity; import android.os.Bundle; import net.lacolaco.smileessence.command.*; import net.lacolaco.smileessence.entity.DirectMessage; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -61,12 +61,12 @@ public class MessageMenuDialogFragment extends MenuDialogFragment { } @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { if (message != null) { List<Command> commands = getCommands(); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } else { diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/PostMenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/PostMenuDialogFragment.java index ccc45112..c00ea94d 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/PostMenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/PostMenuDialogFragment.java @@ -32,7 +32,7 @@ import net.lacolaco.smileessence.command.post.PostCommandMakeAnonymous; import net.lacolaco.smileessence.command.post.PostCommandMorse; import net.lacolaco.smileessence.command.post.PostCommandZekamashi; import net.lacolaco.smileessence.notification.Notificator; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -42,7 +42,7 @@ public class PostMenuDialogFragment extends MenuDialogFragment { // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { List<Command> commands = getCommands(); Command.filter(commands); if (commands.isEmpty()) { @@ -50,7 +50,7 @@ public class PostMenuDialogFragment extends MenuDialogFragment { dismiss(); } for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/QuoteDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/QuoteDialogFragment.java index ed03ddaa..81fda433 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/QuoteDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/QuoteDialogFragment.java @@ -30,7 +30,7 @@ import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.status.StatusCommandTextQuote; import net.lacolaco.smileessence.command.status.StatusCommandURLQuote; import net.lacolaco.smileessence.entity.Tweet; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -56,14 +56,14 @@ public class QuoteDialogFragment extends MenuDialogFragment { // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { Tweet tweet = Tweet.fetch(getStatusID()); if (tweet != null) { List<Command> commands = getCommands(tweet); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } else { diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectImageDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectImageDialogFragment.java index 2d8ecf28..79b552d2 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectImageDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectImageDialogFragment.java @@ -35,7 +35,7 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.util.IntentUtils; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -45,11 +45,11 @@ public class SelectImageDialogFragment extends MenuDialogFragment { // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { List<Command> commands = getCommands(); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectSearchQueryDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectSearchQueryDialogFragment.java index 6d95d3b6..4eb14413 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectSearchQueryDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectSearchQueryDialogFragment.java @@ -37,7 +37,7 @@ import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandOpenSearch; import net.lacolaco.smileessence.entity.SearchQuery; import net.lacolaco.smileessence.notification.Notificator; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -49,7 +49,7 @@ public class SelectSearchQueryDialogFragment extends MenuDialogFragment implemen @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { final CommandOpenSearch command = (CommandOpenSearch) parent.getItemAtPosition(position); - @SuppressWarnings("unchecked") final CustomListAdapter<Command> adapter = (CustomListAdapter<Command>) parent.getAdapter(); + @SuppressWarnings("unchecked") final UnorderedCustomListAdapter<Command> adapter = (UnorderedCustomListAdapter<Command>) parent.getAdapter(); ConfirmDialogFragment.show(getActivity(), getString(R.string.dialog_confirm_delete_query), () -> { adapter.removeItem(command); @@ -65,11 +65,11 @@ public class SelectSearchQueryDialogFragment extends MenuDialogFragment implemen // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { List<Command> commands = getCommands(); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } @@ -79,7 +79,7 @@ public class SelectSearchQueryDialogFragment extends MenuDialogFragment implemen final MainActivity activity = (MainActivity) getActivity(); View body = activity.getLayoutInflater().inflate(R.layout.dialog_menu_list, null); ListView listView = (ListView) body.findViewById(R.id.listview_dialog_menu_list); - final CustomListAdapter<Command> adapter = new CustomListAdapter<>(activity); + final UnorderedCustomListAdapter<Command> adapter = new UnorderedCustomListAdapter<>(activity); listView.setAdapter(adapter); listView.setOnItemClickListener(this); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectUserListDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectUserListDialogFragment.java index f36961d8..ddb87734 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectUserListDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectUserListDialogFragment.java @@ -31,7 +31,7 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandOpenUserList; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -41,11 +41,11 @@ public class SelectUserListDialogFragment extends MenuDialogFragment { // ------------------------ OVERRIDE METHODS ------------------------ @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { List<Command> commands = getCommands(); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java index bf69c0ed..2f0d7c91 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java @@ -133,12 +133,12 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen listView.setVisibility(View.VISIBLE); Tweet replyToIfPresent = tweet.getInReplyToIfPresent(); if (replyToIfPresent != null) { - adapter.addToTop(new StatusViewModel(replyToIfPresent)); + adapter.addItem(new StatusViewModel(replyToIfPresent)); adapter.updateForce(); } else { new ShowStatusTask(account, tweet.getInReplyToStatusId()) .onDoneUI(replyTo -> { - adapter.addToTop(new StatusViewModel(replyTo)); + adapter.addItem(new StatusViewModel(replyTo)); adapter.updateForce(); }) .execute(); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java index 7c626f57..d1b8649e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusMenuDialogFragment.java @@ -28,7 +28,7 @@ import android.app.Activity; import android.os.Bundle; import net.lacolaco.smileessence.command.*; import net.lacolaco.smileessence.entity.Tweet; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -62,12 +62,12 @@ public class StatusMenuDialogFragment extends MenuDialogFragment { } @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { if (tweet != null) { List<Command> commands = getCommands(); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } else { diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java index 6a965d94..e4ea83fc 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/TalkChainDialogFragment.java @@ -34,7 +34,7 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.twitter.task.GetTalkTask; -import net.lacolaco.smileessence.view.adapter.StatusListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import net.lacolaco.smileessence.viewmodel.StatusViewModel; public class TalkChainDialogFragment extends StackableDialogFragment { @@ -64,11 +64,11 @@ public class TalkChainDialogFragment extends StackableDialogFragment { View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_talk_list, null); ListView listView = (ListView) view.findViewById(R.id.listview_dialog_talk_list); - final StatusListAdapter adapter = new StatusListAdapter(getActivity()); + final UnorderedCustomListAdapter<StatusViewModel> adapter = new UnorderedCustomListAdapter<StatusViewModel>(getActivity()); listView.setAdapter(adapter); new GetTalkTask(account, getStatusID()).onProgressUI(tweet -> { - adapter.addToBottom(new StatusViewModel(tweet)); + adapter.addItemToBottom(new StatusViewModel(tweet)); adapter.updateForce(); }).execute(); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java index c2544f90..5862fdf1 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.java @@ -57,7 +57,7 @@ import net.lacolaco.smileessence.util.Themes; import net.lacolaco.smileessence.util.UIHandler; import net.lacolaco.smileessence.util.UIObserverBundle; import net.lacolaco.smileessence.view.DialogHelper; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.OrderedCustomListAdapter; import net.lacolaco.smileessence.view.adapter.StatusListAdapter; import net.lacolaco.smileessence.viewmodel.StatusViewModel; @@ -150,7 +150,7 @@ public class UserDetailDialogFragment extends StackableDialogFragment implements .onFail(x -> Notificator.getInstance().alert(R.string.notice_error_get_user_timeline)) .onDoneUI(tweets -> { for (int i = tweets.size() - 1; i >= 0; i--) { - adapter.addToTop(new StatusViewModel(tweets.get(i))); + adapter.addItem(new StatusViewModel(tweets.get(i))); } updateListView(refreshView.getRefreshableView(), adapter, true); refreshView.onRefreshComplete(); @@ -167,7 +167,7 @@ public class UserDetailDialogFragment extends StackableDialogFragment implements .onFail(x -> Notificator.getInstance().alert(R.string.notice_error_get_user_timeline)) .onDoneUI(tweets -> { for (Tweet tweet : tweets) { - adapter.addToBottom(new StatusViewModel(tweet)); + adapter.addItem(new StatusViewModel(tweet)); } updateListView(refreshView.getRefreshableView(), adapter, false); refreshView.onRefreshComplete(); @@ -250,7 +250,7 @@ public class UserDetailDialogFragment extends StackableDialogFragment implements .onFail(x -> Notificator.getInstance().alert(R.string.notice_error_get_user_timeline)) .onDoneUI(tweets -> { for (Tweet tweet : tweets) { - adapter.addToBottom(new StatusViewModel(tweet)); + adapter.addItem(new StatusViewModel(tweet)); } adapter.updateForce(); tabHost.getTabWidget().getChildTabViewAt(1).setVisibility(View.VISIBLE); @@ -379,7 +379,7 @@ public class UserDetailDialogFragment extends StackableDialogFragment implements } } - protected void updateListView(AbsListView absListView, CustomListAdapter<?> adapter, boolean addedToTop) { + protected void updateListView(AbsListView absListView, OrderedCustomListAdapter<?> adapter, boolean addedToTop) { int before = adapter.getCount(); adapter.notifyDataSetChanged(); // synchronized call (not adapter#updateForce()) int after = adapter.getCount(); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserMenuDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserMenuDialogFragment.java index c877ac25..338c3170 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserMenuDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserMenuDialogFragment.java @@ -29,7 +29,7 @@ import android.os.Bundle; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandSearchOnTwitter; import net.lacolaco.smileessence.entity.User; -import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; import java.util.List; @@ -62,12 +62,12 @@ public class UserMenuDialogFragment extends MenuDialogFragment { } @Override - protected void setMenuItems(final CustomListAdapter<Command> adapter) { + protected void setMenuItems(final UnorderedCustomListAdapter<Command> adapter) { if (user != null) { List<Command> commands = getCommands(); Command.filter(commands); for (Command command : commands) { - adapter.addToBottom(command); + adapter.addItemToBottom(command); } adapter.update(); } else { diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/HistoryFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/page/HistoryFragment.java index 9a889899..b139575e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/HistoryFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/HistoryFragment.java @@ -51,7 +51,7 @@ public class HistoryFragment extends CustomListFragment<EventListAdapter> { setAdapter(adapter); StatusFilter.getInstance().register(this, EventViewModel.class, (EventViewModel vm) -> { - adapter.addToTop(vm); + adapter.addItemToTop(vm); adapter.update(); }, null); } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/HomeFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/page/HomeFragment.java index c3d6df0e..53435faa 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/HomeFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/HomeFragment.java @@ -59,10 +59,10 @@ public class HomeFragment extends CustomListFragment<StatusListAdapter> { setAdapter(adapter); StatusFilter.getInstance().register(this, StatusViewModel.class, (StatusViewModel tweet) -> { - adapter.addToTop(tweet); + adapter.addItem(tweet); adapter.update(); }, id -> { - adapter.removeByStatusID(id); + adapter.removeItemById(id); adapter.updateForce(); }); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/MentionsFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/page/MentionsFragment.java index ca5d864a..f89550d0 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/MentionsFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/MentionsFragment.java @@ -57,19 +57,19 @@ public class MentionsFragment extends CustomListFragment<StatusListAdapter> { StatusFilter.getInstance().register(this, StatusViewModel.class, (StatusViewModel tweet) -> { if (tweet.getTweet().getMentions().contains(Application.getInstance().getCurrentAccount().getUser().getScreenName())) { - adapter.addToTop(tweet); + adapter.addItem(tweet); adapter.update(); } else { for (ExtractionWord word : ExtractionWord.all()) { if (word.getPattern().matcher(tweet.getTweet().getOriginalTweet().getText()).find()) { - adapter.addToTop(tweet); + adapter.addItem(tweet); adapter.update(); return; } } } }, id -> { - adapter.removeByStatusID(id); + adapter.removeItemById(id); adapter.updateForce(); }); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesFragment.java index 8cca14bc..440d68f4 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesFragment.java @@ -60,10 +60,10 @@ public class MessagesFragment extends CustomListFragment<MessageListAdapter> { setAdapter(adapter); StatusFilter.getInstance().register(this, MessageViewModel.class, (MessageViewModel message) -> { - adapter.addToTop(message); + adapter.addItem(message); adapter.update(); }, id -> { - adapter.removeByMessageID(id); + adapter.removeItemById(id); adapter.updateForce(); }); diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchFragment.java index 01bed430..fb4c0039 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchFragment.java @@ -335,7 +335,7 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem if (!tweet.isRetweet()) { StatusViewModel viewModel = new StatusViewModel(tweet); StatusFilter.getInstance().filter(viewModel); - adapter.addToTop(viewModel); + adapter.addItem(viewModel); } } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/UserListFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/page/UserListFragment.java index 646e6877..3fbdafee 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/UserListFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/UserListFragment.java @@ -209,7 +209,7 @@ public class UserListFragment extends CustomListFragment<UserListListAdapter> im for (Tweet tweet : tweets) { StatusViewModel statusViewModel = new StatusViewModel(tweet); StatusFilter.getInstance().filter(statusViewModel); - adapter.addToBottom(statusViewModel); + adapter.addItem(statusViewModel); } }) .onFinishUI(onFinish) diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/EditableCheckBoxModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/EditableCheckBoxModel.java index d79f4bdd..935f93b4 100644 --- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/EditableCheckBoxModel.java +++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/EditableCheckBoxModel.java @@ -32,11 +32,13 @@ import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import net.lacolaco.smileessence.R; +import net.lacolaco.smileessence.entity.IdObject; -public class EditableCheckBoxModel implements IViewModel { +public class EditableCheckBoxModel implements IViewModel, IdObject { // ------------------------------ FIELDS ------------------------------ + private final long id; private final String text; private boolean freezing; private String inputText; @@ -44,7 +46,8 @@ public class EditableCheckBoxModel implements IViewModel { // --------------------------- CONSTRUCTORS --------------------------- - public EditableCheckBoxModel(String text) { + public EditableCheckBoxModel(long id, String text) { + this.id = id; this.text = text; } @@ -77,6 +80,11 @@ public class EditableCheckBoxModel implements IViewModel { return this; } + @Override + public long getId() { + return id; + } + // ------------------------ INTERFACE METHODS ------------------------ diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java index 5e72b8d2..5b6dbe54 100644 --- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java +++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/MessageViewModel.java @@ -36,6 +36,7 @@ import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.data.ImageCache; import net.lacolaco.smileessence.entity.Account; import net.lacolaco.smileessence.entity.DirectMessage; +import net.lacolaco.smileessence.entity.IdObject; import net.lacolaco.smileessence.entity.RBinding; import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.util.NameStyles; @@ -49,7 +50,7 @@ import net.lacolaco.smileessence.view.listener.ListItemClickListener; import java.lang.ref.WeakReference; -public class MessageViewModel implements IViewModel { +public class MessageViewModel implements IViewModel, IdObject { // ------------------------------ FIELDS ------------------------------ @@ -70,6 +71,11 @@ public class MessageViewModel implements IViewModel { return directMessage; } + @Override + public long getId() { + return directMessage.getId(); + } + private String getFooterText(Account account) { StringBuilder builder = new StringBuilder(); builder.append(StringUtils.dateToString(directMessage.getCreatedAt())); diff --git a/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java b/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java index 0596b0bf..73eb0944 100644 --- a/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java +++ b/app/src/main/java/net/lacolaco/smileessence/viewmodel/StatusViewModel.java @@ -36,6 +36,7 @@ import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.data.ImageCache; +import net.lacolaco.smileessence.entity.IdObject; import net.lacolaco.smileessence.entity.RBinding; import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.preference.UserPreferenceHelper; @@ -49,7 +50,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -public class StatusViewModel implements IViewModel { +public class StatusViewModel implements IViewModel, IdObject { private Tweet tweet; private ArrayList<BackgroundTask> lastTasks = new ArrayList<>(); // internal @@ -66,6 +67,11 @@ public class StatusViewModel implements IViewModel { return tweet; } + @Override + public long getId() { + return tweet.getId(); + } + private String getFooterText() { StringBuilder builder = new StringBuilder(); if (tweet.isRetweet()) { |