summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttrss/src/main/java')
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java83
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java73
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java62
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java5
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java6
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java3
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java2
7 files changed, 230 insertions, 4 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java
index ed961e38..d75a4e5a 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java
@@ -2,7 +2,11 @@ package org.fox.ttrss;
import android.annotation.SuppressLint;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
import android.content.SharedPreferences;
+import android.content.res.Resources;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
@@ -23,6 +27,7 @@ import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebView.HitTestResult;
import android.webkit.WebViewClient;
+import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -210,6 +215,70 @@ public class ArticleFragment extends StateSavedFragment {
}
+ final ImageView scoreView = view.findViewById(R.id.score);
+
+ if (scoreView != null) {
+ setScoreImage(scoreView, m_article.score);
+
+ Resources.Theme theme = m_activity.getTheme();
+ TypedValue tv = new TypedValue();
+ theme.resolveAttribute(R.attr.headlineTitleHighScoreUnreadTextColor, tv, true);
+ int titleHighScoreUnreadColor = tv.data;
+
+ if (m_article.score > Article.SCORE_HIGH)
+ scoreView.setColorFilter(titleHighScoreUnreadColor);
+ else
+ scoreView.setColorFilter(null);
+
+ if (m_activity.getApiLevel() >= 16) {
+ scoreView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ final EditText edit = new EditText(getActivity());
+ edit.setText(String.valueOf(m_article.score));
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.score_for_this_article)
+ .setPositiveButton(R.string.set_score,
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ try {
+ int newScore = Integer.parseInt(edit.getText().toString());
+
+ m_article.score = newScore;
+
+ m_activity.saveArticleScore(m_article);
+
+ setScoreImage(scoreView, newScore);
+ } catch (NumberFormatException e) {
+ m_activity.toast(R.string.score_invalid);
+ e.printStackTrace();
+ }
+ }
+ })
+ .setNegativeButton(getString(R.string.cancel),
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ //
+
+ }
+ }).setView(edit);
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+ });
+ }
+ }
+
ImageView attachments = view.findViewById(R.id.attachments);
if (attachments != null) {
@@ -360,6 +429,20 @@ public class ArticleFragment extends StateSavedFragment {
return view;
}
+ private void setScoreImage(ImageView scoreView, int score) {
+ TypedValue tv = new TypedValue();
+ int scoreAttr = R.attr.ic_action_trending_flat;
+
+ if (m_article.score > 0)
+ scoreAttr = R.attr.ic_action_trending_up;
+ else if (m_article.score < 0)
+ scoreAttr = R.attr.ic_action_trending_down;
+
+ m_activity.getTheme().resolveAttribute(scoreAttr, tv, true);
+
+ scoreView.setImageResource(tv.resourceId);
+ }
+
protected void renderContent(Bundle savedInstanceState) {
if (!isAdded() || m_web == null) return;
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
index b92324da..672da44e 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
@@ -43,6 +43,7 @@ import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.CheckBox;
+import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
@@ -704,6 +705,7 @@ public class HeadlinesFragment extends StateSavedFragment {
public TextView titleView;
public TextView feedTitleView;
public ImageView markedView;
+ public ImageView scoreView;
public ImageView publishedView;
public TextView excerptView;
public ImageView flavorImageView;
@@ -747,6 +749,7 @@ public class HeadlinesFragment extends StateSavedFragment {
feedTitleView = v.findViewById(R.id.feed_title);
markedView = v.findViewById(R.id.marked);
+ scoreView = v.findViewById(R.id.score);
publishedView = v.findViewById(R.id.published);
excerptView = v.findViewById(R.id.excerpt);
flavorImageView = v.findViewById(R.id.flavor_image);
@@ -1034,6 +1037,72 @@ public class HeadlinesFragment extends StateSavedFragment {
});
}
+ if (holder.scoreView != null) {
+ TypedValue tv = new TypedValue();
+ int scoreAttr = R.attr.ic_action_trending_flat;
+
+ if (article.score > 0)
+ scoreAttr = R.attr.ic_action_trending_up;
+ else if (article.score < 0)
+ scoreAttr = R.attr.ic_action_trending_down;
+
+ m_activity.getTheme().resolveAttribute(scoreAttr, tv, true);
+
+ holder.scoreView.setImageResource(tv.resourceId);
+
+ if (article.score > Article.SCORE_HIGH)
+ holder.scoreView.setColorFilter(titleHighScoreUnreadColor);
+ else
+ holder.scoreView.setColorFilter(null);
+
+ if (m_activity.getApiLevel() >= 16) {
+ holder.scoreView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ final EditText edit = new EditText(getActivity());
+ edit.setText(String.valueOf(article.score));
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.score_for_this_article)
+ .setPositiveButton(R.string.set_score,
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ try {
+ int newScore = Integer.parseInt(edit.getText().toString());
+
+ article.score = newScore;
+
+ m_activity.saveArticleScore(article);
+
+ m_adapter.notifyItemChanged(m_list.getChildPosition(holder.view));
+ } catch (NumberFormatException e) {
+ m_activity.toast(R.string.score_invalid);
+ e.printStackTrace();
+ }
+ }
+ })
+ .setNegativeButton(getString(R.string.cancel),
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ //
+
+ }
+ }).setView(edit);
+
+ Dialog dialog = builder.create();
+ dialog.show();
+ }
+ });
+ }
+ }
if (holder.publishedView != null) {
TypedValue tv = new TypedValue();
@@ -1662,9 +1731,9 @@ public class HeadlinesFragment extends StateSavedFragment {
// store original color
origTitleColors[viewType] = Integer.valueOf(tv.getCurrentTextColor());
- if (score < -500) {
+ if (score < Article.SCORE_LOW) {
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
- } else if (score > 500) {
+ } else if (score > Article.SCORE_HIGH) {
tv.setTextColor(titleHighScoreUnreadColor);
tv.setPaintFlags(tv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
} else {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
index e8559d3e..bac7042b 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
@@ -31,6 +31,8 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
+import com.github.javiersantos.appupdater.AppUpdater;
+import com.github.javiersantos.appupdater.enums.UpdateFrom;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -256,11 +258,20 @@ public class OnlineActivity extends CommonActivity {
switchOfflineSuccess();
} else {
checkTrial(false);
+ checkUpdates();
m_headlinesActionModeCallback = new HeadlinesActionModeCallback();
}
}
+ protected void checkUpdates() {
+ if (BuildConfig.DEBUG || BuildConfig.ENABLE_UPDATER) {
+ new AppUpdater(this)
+ .setUpdateFrom(UpdateFrom.JSON)
+ .setUpdateJSON(String.format("https://srv.tt-rss.org/fdroid/updates/%1$s.json", this.getPackageName()))
+ .start();
+ }
+ }
protected void switchOffline() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
@@ -1208,6 +1219,27 @@ public class OnlineActivity extends CommonActivity {
req.execute(map);
}
+ public void saveArticleScore(final Article article) {
+ ApiRequest req = new ApiRequest(getApplicationContext()) {
+ protected void onPostExecute(JsonElement result) {
+ //toast(article.marked ? R.string.notify_article_marked : R.string.notify_article_unmarked);
+ invalidateOptionsMenu();
+ }
+ };
+
+ HashMap<String, String> map = new HashMap<String, String>() {
+ {
+ put("sid", getSessionId());
+ put("op", "updateArticle");
+ put("article_ids", String.valueOf(article.id));
+ put("data", String.valueOf(article.score));
+ put("field", "4");
+ }
+ };
+
+ req.execute(map);
+ }
+
public void saveArticleMarked(final Article article) {
ApiRequest req = new ApiRequest(getApplicationContext()) {
protected void onPostExecute(JsonElement result) {
@@ -1291,8 +1323,36 @@ public class OnlineActivity extends CommonActivity {
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
+ ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
+ HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
+
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ if (ap != null && ap.isAdded()) {
+ ap.selectArticle(false);
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ if (ap != null && ap.isAdded()) {
+ ap.selectArticle(true);
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_ESCAPE:
+ moveTaskToBack(true);
+ return true;
+ case KeyEvent.KEYCODE_U:
+ if (ap != null && ap.getSelectedArticle() != null) {
+ Article a = ap.getSelectedArticle();
+ a.unread = !a.unread;
+ saveArticleUnread(a);
+ if (hf != null) hf.notifyUpdated();
+ }
+ return true;
+ }
+
if (m_prefs.getBoolean("use_volume_keys", false)) {
- ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
if (ap != null && ap.isAdded()) {
switch (keyCode) {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java
index 441ec62b..a3b152a7 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java
@@ -235,6 +235,11 @@ public class OfflineArticleFragment extends Fragment {
}
+ ImageView score = view.findViewById(R.id.score);
+
+ if (score != null) {
+ score.setVisibility(View.GONE);
+ }
ImageView attachments = view.findViewById(R.id.attachments);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
index 3d9e1229..470b0aac 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java
@@ -505,6 +505,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
public View flavorImageOverflow;
public View headlineHeader;
public ImageView attachmentsView;
+ public ImageView scoreView;
public ArticleViewHolder(View v) {
@@ -549,6 +550,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
headlineHeader = v.findViewById(R.id.headline_header);
flavorImageOverflow = v.findViewById(R.id.gallery_overflow);
attachmentsView = v.findViewById(R.id.attachments);
+ scoreView = v.findViewById(R.id.score);
}
}
@@ -794,6 +796,10 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
holder.attachmentsView.setVisibility(View.GONE);
}
+ if (holder.scoreView != null) {
+ holder.scoreView.setVisibility(View.GONE);
+ }
+
if (holder.markedView != null) {
TypedValue tv = new TypedValue();
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java
index a11cd0ac..2daaba49 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java
@@ -21,6 +21,9 @@ public class Article implements Parcelable {
public static final int FLAVOR_KIND_VIDEO = 2;
public static final int FLAVOR_KIND_YOUTUBE = 3;
+ public static final int SCORE_LOW = -500;
+ public static final int SCORE_HIGH = 500;
+
public int id;
public boolean unread;
public boolean marked;
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java
index f07e23c2..24a7a732 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java
@@ -132,7 +132,7 @@ public class ImageCacheService extends IntentService {
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
- StringBuffer hexString = new StringBuffer();
+ StringBuilder hexString = new StringBuilder();
for (int i=0; i<messageDigest.length; i++)
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));