aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2016-12-07 20:26:49 +0900
committerKazuki Yamaguchi <k@rhe.jp>2016-12-07 22:07:24 +0900
commitdd1a0764274ef3c22b3d7e62a28184768755f411 (patch)
treeeb2642116fcfa27b4c601a516fb754df6f222e96
parent47b16cd68f45bf21efe1c25590a7d912d2e68a81 (diff)
downloadSmileEssence-topic/saved-search-from-twitter.tar.gz
saved search from twittertopic/saved-search-from-twitter
-rw-r--r--app/app.iml19
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java1
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/command/CommandOpenSearch.java23
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/data/Account.java6
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/data/SearchQuery.java66
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/entity/SavedSearch.java44
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/twitter/task/SavedSearches.java54
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/dialog/SelectSearchQueryDialogFragment.java15
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/SearchFragment.java19
-rw-r--r--app/src/main/res/values/strings.xml2
10 files changed, 143 insertions, 106 deletions
diff --git a/app/app.iml b/app/app.iml
index 11e66cd4..e43fb25e 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -70,14 +70,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
@@ -86,9 +78,17 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/data-binding-info" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/data-binding-layout-out" />
@@ -117,6 +117,7 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
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>