diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2016-12-07 20:26:49 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2016-12-07 22:07:24 +0900 |
commit | dd1a0764274ef3c22b3d7e62a28184768755f411 (patch) | |
tree | eb2642116fcfa27b4c601a516fb754df6f222e96 /app/src/main | |
parent | 47b16cd68f45bf21efe1c25590a7d912d2e68a81 (diff) | |
download | SmileEssence-dd1a0764274ef3c22b3d7e62a28184768755f411.tar.gz |
saved search from twittertopic/saved-search-from-twitter
Diffstat (limited to 'app/src/main')
9 files changed, 133 insertions, 97 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java index a61255ac..43e54399 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java @@ -413,6 +413,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou // update cache account.refreshListSubscriptions(); account.refreshUserMuteList(); + account.refreshSavedSearches(); new ShowUserTask(account, account.getUserId()).execute(); User user = account.getUser(); diff --git a/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenSearch.java b/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenSearch.java index 032b1354..f4a4321a 100644 --- a/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenSearch.java +++ b/app/src/main/java/net/lacolaco/smileessence/command/CommandOpenSearch.java @@ -26,37 +26,28 @@ package net.lacolaco.smileessence.command; import android.app.Activity; import net.lacolaco.smileessence.activity.MainActivity; -import net.lacolaco.smileessence.data.SearchQuery; +import net.lacolaco.smileessence.entity.SavedSearch; public class CommandOpenSearch extends Command { + private final SavedSearch query; - // ------------------------------ FIELDS ------------------------------ - - private final SearchQuery query; - - // --------------------------- CONSTRUCTORS --------------------------- - - public CommandOpenSearch(Activity activity, SearchQuery searchQuery) { + public CommandOpenSearch(Activity activity, SavedSearch query) { super(activity); - this.query = searchQuery; + this.query = query; } - // --------------------- GETTER / SETTER METHODS --------------------- - - public SearchQuery getQuery() { + public SavedSearch getQuery() { return query; } @Override public String getText() { - return query.query; + return query.getQuery(); } - // -------------------------- OTHER METHODS -------------------------- - @Override public boolean execute() { - ((MainActivity) getActivity()).openSearchPage(query.query); + ((MainActivity) getActivity()).openSearchPage(query.getQuery()); return true; } } diff --git a/app/src/main/java/net/lacolaco/smileessence/data/Account.java b/app/src/main/java/net/lacolaco/smileessence/data/Account.java index e14250ea..01b62b0b 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/Account.java +++ b/app/src/main/java/net/lacolaco/smileessence/data/Account.java @@ -28,11 +28,13 @@ import com.github.gfx.android.orma.annotation.Column; import com.github.gfx.android.orma.annotation.PrimaryKey; import com.github.gfx.android.orma.annotation.Table; import net.lacolaco.smileessence.entity.DirectMessage; +import net.lacolaco.smileessence.entity.SavedSearch; import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.entity.User; import net.lacolaco.smileessence.twitter.task.BlockIDsTask; import net.lacolaco.smileessence.twitter.task.GetUserListsTask; import net.lacolaco.smileessence.twitter.task.MutesIDsTask; +import net.lacolaco.smileessence.twitter.task.SavedSearches; import net.lacolaco.smileessence.util.BackgroundTask; import twitter4j.Twitter; import twitter4j.TwitterFactory; @@ -198,4 +200,8 @@ public class Account { public boolean isMutedUserListContains(long id) { return muteUserIds.contains(id); } + + public BackgroundTask<List<SavedSearch>, Void> refreshSavedSearches() { + return new SavedSearches.All(this).onDone(SavedSearch::replace).execute(); + } }
\ No newline at end of file diff --git a/app/src/main/java/net/lacolaco/smileessence/data/SearchQuery.java b/app/src/main/java/net/lacolaco/smileessence/data/SearchQuery.java deleted file mode 100644 index 83235d31..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/data/SearchQuery.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.data; - -import com.github.gfx.android.orma.annotation.Column; -import com.github.gfx.android.orma.annotation.OnConflict; -import com.github.gfx.android.orma.annotation.PrimaryKey; -import com.github.gfx.android.orma.annotation.Table; - -import java.util.List; - -@Table -public class SearchQuery { - - // ------------------------------ FIELDS ------------------------------ - - @PrimaryKey - public String query; - - // -------------------------- STATIC METHODS -------------------------- - - public SearchQuery() { } - - public SearchQuery(String query) { - this.query = query; - } - - public static List<SearchQuery> getAll() { - OrmaDatabase orma = OrmaHolder.getORMA(); - return orma.selectFromSearchQuery().toList(); - } - - private static SearchQuery_Relation relation() { - return OrmaHolder.getORMA().relationOfSearchQuery(); - } - - public static void add(String query) { - relation().upserter().execute(new SearchQuery(query)); - } - - public void delete() { - relation().deleter().queryEq(query); - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/SavedSearch.java b/app/src/main/java/net/lacolaco/smileessence/entity/SavedSearch.java new file mode 100644 index 00000000..0ac26ccc --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/entity/SavedSearch.java @@ -0,0 +1,44 @@ +package net.lacolaco.smileessence.entity; + +import java.util.*; + +public class SavedSearch implements IdObject { + private static Map<Long, SavedSearch> storage = new HashMap<>(); + + public synchronized static Collection<SavedSearch> cached() { + return storage.values(); + } + + public synchronized static void replace(List<SavedSearch> list) { + storage = new HashMap<>(); + for (SavedSearch ss : list) + storage.put(ss.getId(), ss); + } + + public synchronized static SavedSearch fromTwitter(twitter4j.SavedSearch obj) { + SavedSearch cached = storage.get(obj.getId()); + + /* SavedSearch should be immutable */ + if (cached == null) { + cached = new SavedSearch(obj.getId(), obj.getQuery()); + } + return cached; + } + + // インスタンス + private long id; + private String query; + + private SavedSearch(long id, String query) { + this.id = id; + this.query = query; + } + + public long getId() { + return id; + } + + public String getQuery() { + return query; + } +} diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/task/SavedSearches.java b/app/src/main/java/net/lacolaco/smileessence/twitter/task/SavedSearches.java new file mode 100644 index 00000000..38177274 --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/twitter/task/SavedSearches.java @@ -0,0 +1,54 @@ +package net.lacolaco.smileessence.twitter.task; + +import net.lacolaco.smileessence.data.Account; +import net.lacolaco.smileessence.entity.SavedSearch; +import net.lacolaco.smileessence.util.BackgroundTask; +import net.lacolaco.smileessence.util.ListUtils; + +import java.util.List; + +public class SavedSearches { + public static class Create extends BackgroundTask<SavedSearch, Void> { + private final Account account; + private final String query; + + public Create(Account account, String query) { + this.account = account; + this.query = query; + } + + @Override + protected SavedSearch doInBackground() throws Exception { + return SavedSearch.fromTwitter(account.getTwitter().savedSearches().createSavedSearch(query)); + } + } + + public static class Destroy extends BackgroundTask<Void, Void> { + private final Account account; + private final long id; + + public Destroy(Account account, long id) { + this.account = account; + this.id = id; + } + + @Override + protected Void doInBackground() throws Exception { + account.getTwitter().savedSearches().destroySavedSearch(id); + return null; + } + } + + public static class All extends BackgroundTask<List<SavedSearch>, Void> { + private final Account account; + + public All(Account account) { + this.account = account; + } + + @Override + protected List<SavedSearch> doInBackground() throws Exception { + return ListUtils.map(account.getTwitter().savedSearches().getSavedSearches(), SavedSearch::fromTwitter); + } + } +} 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 a0435d6f..7ebf5efe 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 @@ -31,11 +31,13 @@ import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; +import net.lacolaco.smileessence.Application; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandOpenSearch; -import net.lacolaco.smileessence.data.SearchQuery; +import net.lacolaco.smileessence.entity.SavedSearch; import net.lacolaco.smileessence.notification.Notificator; +import net.lacolaco.smileessence.twitter.task.SavedSearches; import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; import java.util.ArrayList; @@ -53,8 +55,13 @@ public class SelectSearchQueryDialogFragment extends MenuDialogFragment implemen ConfirmDialogFragment.show(getActivity(), getString(R.string.dialog_confirm_delete_query), () -> { adapter.removeItem(command); adapter.update(); - command.getQuery().delete(); - Notificator.getInstance().publish(R.string.notice_search_query_deleted); + new SavedSearches.Destroy(Application.getInstance().getCurrentAccount(), command.getQuery().getId()) + .onDoneUI(x -> { + Notificator.getInstance().publish(R.string.notice_search_query_deleted); + Application.getInstance().getCurrentAccount().refreshSavedSearches(); + }) + .onFailUI(x -> Notificator.getInstance().publish("unable to delete search query")) + .execute(); }, false); return true; @@ -66,7 +73,7 @@ public class SelectSearchQueryDialogFragment extends MenuDialogFragment implemen protected List<Command> getMenuCommands() { Activity activity = getActivity(); List<Command> commands = new ArrayList<>(); - for (final SearchQuery query : SearchQuery.getAll()) { + for (SavedSearch query : SavedSearch.cached()) { commands.add(new CommandOpenSearch(activity, query)); } return commands; 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 6e0995c4..393ad7df 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 @@ -42,10 +42,11 @@ import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.command.Command; import net.lacolaco.smileessence.command.CommandOpenSearch; import net.lacolaco.smileessence.data.Account; -import net.lacolaco.smileessence.data.SearchQuery; +import net.lacolaco.smileessence.entity.SavedSearch; import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.preference.InternalPreferenceHelper; +import net.lacolaco.smileessence.twitter.task.SavedSearches; import net.lacolaco.smileessence.twitter.task.SearchTask; import net.lacolaco.smileessence.util.SystemServiceHelper; import net.lacolaco.smileessence.util.UIHandler; @@ -256,16 +257,12 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem } private void openSearchQueryDialog() { - if (SearchQuery.getAll().size() == 0) { - Notificator.getInstance().alert(R.string.notice_no_query_exists); - return; - } DialogHelper.showDialog(getActivity(), new SelectSearchQueryDialogFragment() { @Override protected void executeCommand(Command command) { super.executeCommand(command); - SearchQuery query = ((CommandOpenSearch) command).getQuery(); - editText.setText(query.query); + SavedSearch ss = ((CommandOpenSearch) command).getQuery(); + editText.setText(ss.getQuery()); SystemServiceHelper.hideIM(SearchFragment.this.getActivity(), editText); } }); @@ -276,8 +273,12 @@ public class SearchFragment extends CustomListFragment<SearchListAdapter> implem if (TextUtils.isEmpty(text)) { Notificator.getInstance().alert(R.string.notice_query_is_empty); } else { - SearchQuery.add(text); - Notificator.getInstance().publish(R.string.notice_query_saved); + new SavedSearches.Create(Application.getInstance().getCurrentAccount(), text).onDoneUI(cb -> { + Notificator.getInstance().publish(R.string.notice_query_saved); + Application.getInstance().getCurrentAccount().refreshSavedSearches(); + }).onFailUI(ex -> { + Notificator.getInstance().publish("Query is not saved"); + }).execute(); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9bba4a86..35649e41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,8 +150,6 @@ <string name="notice_userlist_not_selected">No List is selected</string> <string name="notice_search_query_deleted">Query was deleted</string> <string name="notice_query_is_empty">Query is empty</string> - <string name="notice_no_template_exists">No templates exist</string> - <string name="notice_no_query_exists">No queries exist</string> <string name="notice_query_saved">Query is saved</string> <string name="notice_error_show_user">Can\'t show this user</string> <string name="notice_error_show_status">Can\'t show this status</string> |