diff options
Diffstat (limited to 'org.fox.ttrss/src')
18 files changed, 275 insertions, 111 deletions
diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml index 53c5334c..3a8df8db 100755 --- a/org.fox.ttrss/src/main/AndroidManifest.xml +++ b/org.fox.ttrss/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.fox.ttrss" - android:versionCode="398" - android:versionName="1.166" > + android:versionCode="411" + android:versionName="1.177" > <uses-sdk android:minSdkVersion="16" @@ -17,6 +17,7 @@ android:name=".Application" android:allowBackup="true" android:backupAgent=".util.PrefsBackupAgent" + android:fullBackupOnly="true" android:hardwareAccelerated="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > 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 a1a2f019..1c0afca8 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 @@ -3,6 +3,7 @@ package org.fox.ttrss; import android.annotation.SuppressLint; import android.app.Activity; import android.content.SharedPreferences; +import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -181,7 +182,7 @@ public class ArticleFragment extends Fragment { m_contentView = view.findViewById(R.id.article_scrollview); m_customViewContainer = (FrameLayout) view.findViewById(R.id.article_fullscreen_video); - if (m_article.id == HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED) { + /* if (m_article.id == HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED) { TextView statusMessage = (TextView) view.findViewById(R.id.article_status_message); statusMessage.setText(R.string.headlines_row_top_changed); statusMessage.setVisibility(View.VISIBLE); @@ -190,7 +191,7 @@ public class ArticleFragment extends Fragment { view.findViewById(R.id.article_fab).setVisibility(View.GONE); return view; - } + } */ NotifyingScrollView scrollView = (NotifyingScrollView) view.findViewById(R.id.article_scrollview); m_fab = view.findViewById(R.id.article_fab); @@ -447,6 +448,10 @@ public class ArticleFragment extends Fragment { ws.setMediaPlaybackRequiresUserGesture(false); } + if (CommonActivity.THEME_DARK.equals(m_prefs.getString("theme", CommonActivity.THEME_DEFAULT))) { + m_web.setBackgroundColor(Color.BLACK); + } + if (m_prefs.getBoolean("justify_article_text", true)) { cssOverride += "body { text-align : justify; } "; } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java index 6c3f90da..f1c9eab0 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java @@ -81,7 +81,13 @@ public class ArticlePager extends Fragment { if (savedInstanceState != null) { m_article = savedInstanceState.getParcelable("article"); - m_articles = ((DetailActivity)m_activity).m_articles; + + if (! (m_activity instanceof DetailActivity)) { + m_articles = savedInstanceState.getParcelable("articles"); + } else { + m_articles = ((DetailActivity)m_activity).m_articles; + } + m_feed = savedInstanceState.getParcelable("feed"); m_firstId = savedInstanceState.getInt("firstId"); } @@ -159,8 +165,11 @@ public class ArticlePager extends Fragment { if (result != null) { - if (m_firstIdChanged) { - m_articles.add(new Article(HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED)); + if (m_firstIdChanged && !(m_activity instanceof DetailActivity && !m_activity.isPortrait())) { + // TODO: show an information message in viewpager without modifying m_articles + //m_articles.add(new Article(HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED)); + + m_activity.toast(R.string.headlines_row_top_changed); } ArticlePager.this.m_firstId = m_firstId; @@ -175,7 +184,7 @@ public class ArticlePager extends Fragment { } if (m_article != null) { - if (m_article.id == 0 || m_articles.indexOf(m_article) == -1) { + if (m_article.id == 0 || !m_articles.containsId(m_article.id)) { if (m_articles.size() > 0) { m_article = m_articles.get(0); m_listener.onArticleSelected(m_article, false); @@ -273,6 +282,7 @@ public class ArticlePager extends Fragment { out.setClassLoader(getClass().getClassLoader()); out.putParcelable("article", m_article); + out.putParcelable("articles", m_articles); out.putParcelable("feed", m_feed); out.putInt("firstId", m_firstId); } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java index 3b58b93a..51df75e3 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/BaseFeedlistFragment.java @@ -31,6 +31,8 @@ public abstract class BaseFeedlistFragment extends Fragment { if (true /*m_activity.findViewById(R.id.headlines_drawer) != null*/) { try { + boolean needSettingsFooter = false; + if (activity.isSmallScreen()) { View layout = inflater.inflate(R.layout.drawer_header, list, false); list.addHeaderView(layout, null, false); @@ -60,10 +62,12 @@ public abstract class BaseFeedlistFragment extends Fragment { ActivityCompat.startActivityForResult(getActivity(), intent, 0, options.toBundle()); } catch (Exception e) { - + e.printStackTrace(); } } }); + } else { + needSettingsFooter = true; } /* deal with ~material~ footers */ @@ -108,6 +112,41 @@ public abstract class BaseFeedlistFragment extends Fragment { }); if (isRoot) { + if (needSettingsFooter) { + // settings (as a list footer row) + + footer = inflater.inflate(R.layout.feeds_row, list, false); + footer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try { + Intent intent = new Intent(getActivity(), + PreferencesActivity.class); + + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation(getActivity(), v, "SETTINGS_REVEAL"); + + ActivityCompat.startActivityForResult(getActivity(), intent, 0, options.toBundle()); + + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + list.addFooterView(footer); + text = (TextView) footer.findViewById(R.id.title); + text.setText(R.string.action_settings); + + icon = (ImageView) footer.findViewById(R.id.icon); + tv = new TypedValue(); + getActivity().getTheme().resolveAttribute(R.attr.ic_settings, tv, true); + icon.setImageResource(tv.resourceId); + + TextView counter = (TextView) footer.findViewById(R.id.unread_counter); + counter.setText(R.string.blank); + } + // offline footer = inflater.inflate(R.layout.feeds_row, list, false); footer.setOnClickListener(new View.OnClickListener() { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java index 4cada7e0..5811a7f9 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java @@ -31,11 +31,18 @@ import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; +import com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiscCache; +import com.nostra13.universalimageloader.core.DefaultConfigurationFactory; +import com.nostra13.universalimageloader.core.ImageLoader; +import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; + import org.fox.ttrss.util.DatabaseHelper; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; +import java.io.File; +import java.io.IOException; import java.util.Arrays; public class CommonActivity extends ActionBarActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -160,6 +167,23 @@ public class CommonActivity extends ActionBarActivity implements SharedPreferenc CustomTabsClient.bindCustomTabsService(this, "com.android.chrome", m_customTabServiceConnection); + if (!ImageLoader.getInstance().isInited()) { + ImageLoaderConfiguration config; + + try { + config = new ImageLoaderConfiguration.Builder(getApplicationContext()) + .diskCache( + new LruDiscCache(new File(getCacheDir(), "article-images"), + DefaultConfigurationFactory.createFileNameGenerator(), + 100 * 1024 * 1024)) + .build(); + } catch (IOException e) { + config = new ImageLoaderConfiguration.Builder(getApplicationContext()) + .build(); + } + ImageLoader.getInstance().init(config); + } + super.onCreate(savedInstanceState); } @@ -256,11 +280,11 @@ public class CommonActivity extends ActionBarActivity implements SharedPreferenc } protected void shareText(String text) { - startActivity(getShareIntent(text, null)); + startActivity(Intent.createChooser(getShareIntent(text, null), text)); } protected void shareText(String text, String subject) { - startActivity(getShareIntent(text, subject)); + startActivity(Intent.createChooser(getShareIntent(text, subject), text)); } private void openUriWithCustomTab(Uri uri) { @@ -285,15 +309,30 @@ public class CommonActivity extends ActionBarActivity implements SharedPreferenc CustomTabsIntent intent = builder.build(); - intent.launchUrl(this, uri); + try { + intent.launchUrl(this, uri); + } catch (Exception e) { + e.printStackTrace(); + toast(e.getMessage()); + } } } // uses chrome custom tabs when available - public void openUri(final Uri uri) { + public void openUri(Uri uri) { boolean enableCustomTabs = m_prefs.getBoolean("enable_custom_tabs", true); final boolean askEveryTime = m_prefs.getBoolean("custom_tabs_ask_always", true); + if (uri.getScheme() == null) { + try { + uri = Uri.parse("https:" + uri.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + final Uri finalUri = uri; + if (enableCustomTabs && m_customTabClient != null) { if (askEveryTime) { @@ -316,7 +355,7 @@ public class CommonActivity extends ActionBarActivity implements SharedPreferenc editor.apply(); } - openUriWithCustomTab(uri); + openUriWithCustomTab(finalUri); } }) @@ -332,9 +371,14 @@ public class CommonActivity extends ActionBarActivity implements SharedPreferenc editor.apply(); } - Intent intent = new Intent(Intent.ACTION_VIEW, uri); + Intent intent = new Intent(Intent.ACTION_VIEW, finalUri); - startActivity(intent); + try { + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + toast(e.getMessage()); + } } }); @@ -362,7 +406,11 @@ public class CommonActivity extends ActionBarActivity implements SharedPreferenc } else { Intent intent = new Intent(Intent.ACTION_VIEW, uri); - startActivity(intent); + try { + startActivity(intent); + } catch (Exception e) { + toast(e.getMessage()); + } } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java index 8cab4845..dafcbe66 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java @@ -279,6 +279,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList Article article = hf.getActiveArticle(); if (article == null && hf.getAllArticles().size() > 0) { + article = hf.getAllArticles().get(0); hf.setActiveArticle(article); @@ -304,7 +305,12 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList setResult(Activity.RESULT_OK, resultIntent); - super.onBackPressed(); + try { + super.onBackPressed(); + } catch (IllegalStateException e) { + // java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState + e.printStackTrace(); + } } @Override diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java index 02fd7985..24be6292 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java @@ -315,7 +315,7 @@ public class FeedCategoriesFragment extends BaseFeedlistFragment implements OnIt @Override protected void onPostExecute(JsonElement result) { - if (isDetached()) return; + if (isDetached() || !isAdded()) return; if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java index 41c0f69c..6d567ff8 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java @@ -496,7 +496,7 @@ public class FeedsFragment extends BaseFeedlistFragment implements OnItemClickLi @Override protected void onPostExecute(JsonElement result) { - if (isDetached()) return; + if (isDetached() || !isAdded()) return; if (getView() != null) { View loadingBar = getView().findViewById(R.id.feeds_loading_bar); 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 b69fe3be..e3f0c26f 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 @@ -69,9 +69,7 @@ import com.shamanland.fab.ShowHideOnScroll; import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; import org.fox.ttrss.types.Feed; -import org.fox.ttrss.util.EnlargingImageView; import org.fox.ttrss.util.HeadlinesRequest; -import org.jsoup.Jsoup; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -90,8 +88,8 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, public static final int HEADLINES_REQUEST_SIZE = 30; public static final int HEADLINES_BUFFER_MAX = 500; - public static final int ARTICLE_SPECIAL_LOADMORE = -1; - public static final int ARTICLE_SPECIAL_TOP_CHANGED = -3; + //public static final int ARTICLE_SPECIAL_LOADMORE = -1; + //public static final int ARTICLE_SPECIAL_TOP_CHANGED = -3; private final String TAG = this.getClass().getSimpleName(); @@ -101,6 +99,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, private boolean m_refreshInProgress = false; private boolean m_autoCatchupDisabled = false; private int m_firstId = 0; + private boolean m_lazyLoadDisabled = false; private SharedPreferences m_prefs; @@ -117,6 +116,9 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, private int m_listPreviousVisibleItem; private ListView m_list; private ImageLoader m_imageLoader = ImageLoader.getInstance(); + private View m_listLoadingView; + private View m_topChangedView; + private View m_amrFooterView; public ArticleList getSelectedArticles() { ArticleList tmp = new ArticleList(); @@ -406,6 +408,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, m_searchQuery = (String) savedInstanceState.getCharSequence("searchQuery"); m_compactLayoutMode = savedInstanceState.getBoolean("compactLayoutMode"); m_firstId = savedInstanceState.getInt("firstId"); + m_lazyLoadDisabled = savedInstanceState.getBoolean("lazyLoadDisabled"); } String headlineMode = m_prefs.getString("headline_mode", "HL_DEFAULT"); @@ -433,24 +436,37 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, m_list = (ListView)view.findViewById(R.id.headlines_list); FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.headlines_fab); - m_list.setOnTouchListener(new ShowHideOnScroll(fab)); - fab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - refresh(false); - } - }); - if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) { + if (! (getActivity() instanceof DetailActivity)) { + + m_list.setOnTouchListener(new ShowHideOnScroll(fab)); + fab.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + refresh(false); + } + }); + } else { + fab.setVisibility(View.GONE); + } + + m_listLoadingView = inflater.inflate(R.layout.headlines_row_loadmore, m_list, false); + //m_list.addFooterView(m_listLoadingView, null, false); + //m_listLoadingView.setVisibility(View.GONE); + + m_topChangedView = inflater.inflate(R.layout.headlines_row_top_changed, m_list, false); + //m_list.addFooterView(m_topChangedView, null, false); + //m_topChangedView.setVisibility(View.GONE);*/ + + if (m_prefs.getBoolean("headlines_mark_read_scroll", false)) { WindowManager wm = (WindowManager) m_activity.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int screenHeight = display.getHeight(); - View layout = inflater.inflate(R.layout.headlines_footer, container, false); + m_amrFooterView = inflater.inflate(R.layout.headlines_footer, container, false); + m_amrFooterView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, screenHeight)); - layout.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, screenHeight)); - - m_list.addFooterView(layout, null, false); + m_list.addFooterView(m_amrFooterView, null, false); } if (m_activity.isSmallScreen()) { @@ -553,6 +569,12 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, @SuppressWarnings({ "serial" }) public void refresh(boolean append, boolean userInitiated) { + m_list.removeFooterView(m_listLoadingView); + m_list.removeFooterView(m_topChangedView); + m_list.removeFooterView(m_amrFooterView); + + if (!append) m_lazyLoadDisabled = false; + if (m_activity != null && m_feed != null) { m_refreshInProgress = true; @@ -591,18 +613,33 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, super.onPostExecute(result); - if (isAdded()) { - if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); - } + if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); + + //m_listLoadingView.setVisibility(View.GONE); + m_list.removeFooterView(m_listLoadingView); + m_list.removeFooterView(m_topChangedView); + m_list.removeFooterView(m_amrFooterView); if (result != null) { m_refreshInProgress = false; - if (m_articles.indexOf(m_activeArticle) == -1) + if (m_activeArticle != null && !m_articles.containsId(m_activeArticle.id)) { m_activeArticle = null; + } if (m_firstIdChanged) { - m_articles.add(new Article(ARTICLE_SPECIAL_TOP_CHANGED)); + m_lazyLoadDisabled = true; + + //m_activity.toast(R.string.headlines_row_top_changed); + + //m_topChangedView.setVisibility(View.VISIBLE); + //m_articles.add(new Article(ARTICLE_SPECIAL_TOP_CHANGED)); + + m_list.addFooterView(m_topChangedView, null, false); + } + + if (m_amountLoaded < HEADLINES_REQUEST_SIZE) { + m_lazyLoadDisabled = true; } HeadlinesFragment.this.m_firstId = m_firstId; @@ -613,7 +650,11 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, // not sure why but listview sometimes gets positioned while ignoring the header so // top headline content becomes partially obscured by the toolbar on phones // (not reproducible on avd) - if (!fappend) m_list.smoothScrollToPosition(0); + if (!fappend) { + m_list.smoothScrollToPosition(0); + } + + //m_listLoadingView.setVisibility(m_amountLoaded == HEADLINES_REQUEST_SIZE ? View.VISIBLE : View.GONE); } else { if (m_lastError == ApiError.LOGIN_FAILED) { @@ -629,6 +670,8 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, //m_activity.setLoadingStatus(getErrorMessage(), false); } } + + if (m_amrFooterView != null) m_list.addFooterView(m_amrFooterView, null, false); } }; @@ -657,7 +700,12 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, } else { skip = numAll; } - + + if (skip > 0) { + m_list.addFooterView(m_listLoadingView, null, false); + //m_listLoadingView.setVisibility(View.VISIBLE); + } + } else { //m_activity.setLoadingStatus(R.string.blank, true); } @@ -727,6 +775,7 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, out.putCharSequence("searchQuery", m_searchQuery); out.putBoolean("compactLayoutMode", m_compactLayoutMode); out.putInt("firstId", m_firstId); + out.putBoolean("lazyLoadDisabled", m_lazyLoadDisabled); } static class HeadlineViewHolder { @@ -760,10 +809,10 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, public static final int VIEW_UNREAD = 1; public static final int VIEW_SELECTED = 2; public static final int VIEW_SELECTED_UNREAD = 3; - public static final int VIEW_LOADMORE = 4; - public static final int VIEW_TOP_CHANGED = 5; + //public static final int VIEW_LOADMORE = 4; + //public static final int VIEW_TOP_CHANGED = 4; - public static final int VIEW_COUNT = VIEW_TOP_CHANGED+1; + public static final int VIEW_COUNT = VIEW_SELECTED_UNREAD + 1; private final Integer[] origTitleColors = new Integer[VIEW_COUNT]; private final int titleHighScoreUnreadColor; @@ -816,11 +865,11 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, public int getItemViewType(int position) { Article a = items.get(position); - if (a.id == ARTICLE_SPECIAL_LOADMORE) { - return VIEW_LOADMORE; - } else if (a.id == ARTICLE_SPECIAL_TOP_CHANGED) { + /*if (a.id == ARTICLE_SPECIAL_LOADMORE) { + return VIEW_LOADMORE; */ + /*if (a.id == ARTICLE_SPECIAL_TOP_CHANGED) { return VIEW_TOP_CHANGED; - } else if (m_activeArticle != null && a.id == m_activeArticle.id && a.unread) { + } else */ if (m_activeArticle != null && a.id == m_activeArticle.id && a.unread) { return VIEW_SELECTED_UNREAD; } else if (m_activeArticle != null && a.id == m_activeArticle.id) { return VIEW_SELECTED; @@ -916,12 +965,12 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, int layoutId = m_compactLayoutMode ? R.layout.headlines_row_compact : R.layout.headlines_row; switch (getItemViewType(position)) { - case VIEW_LOADMORE: + /*case VIEW_LOADMORE: layoutId = R.layout.headlines_row_loadmore; break; case VIEW_TOP_CHANGED: layoutId = R.layout.headlines_row_top_changed; - break; + break;*/ case VIEW_UNREAD: layoutId = m_compactLayoutMode ? R.layout.headlines_row_unread_compact : R.layout.headlines_row_unread; break; @@ -1567,10 +1616,6 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (!m_refreshInProgress && m_articles.findById(ARTICLE_SPECIAL_LOADMORE) != null && firstVisibleItem + visibleItemCount == m_articles.size()) { - refresh(true); - } - if (m_prefs.getBoolean("headlines_mark_read_scroll", false) && firstVisibleItem > (m_activity.isSmallScreen() ? 1 : 0) && !m_autoCatchupDisabled) { Article a = (Article) view.getItemAtPosition(firstVisibleItem - 1); @@ -1596,6 +1641,10 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, m_listPreviousVisibleItem = firstVisibleItem; } + + if (!m_refreshInProgress && !m_lazyLoadDisabled && /*m_articles.findById(ARTICLE_SPECIAL_LOADMORE) != null &&*/ firstVisibleItem + visibleItemCount == m_articles.size()) { + refresh(true); + } } @Override diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java index 1515883c..51781582 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java @@ -387,7 +387,12 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList m_drawerLayout.openDrawer(Gravity.START); } else { - super.onBackPressed(); + try { + super.onBackPressed(); + } catch (IllegalStateException e) { + // java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState + e.printStackTrace(); + } } } 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 7d4c2a19..355c5a58 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 @@ -168,23 +168,6 @@ public class OnlineActivity extends CommonActivity { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - if (!ImageLoader.getInstance().isInited()) { - ImageLoaderConfiguration config; - - try { - config = new ImageLoaderConfiguration.Builder(getApplicationContext()) - .diskCache( - new LruDiscCache(new File(getCacheDir(), "article-images"), - DefaultConfigurationFactory.createFileNameGenerator(), - 100 * 1024 * 1024)) - .build(); - } catch (IOException e) { - config = new ImageLoaderConfiguration.Builder(getApplicationContext()) - .build(); - } - ImageLoader.getInstance().init(config); - } - //m_pullToRefreshAttacher = PullToRefreshAttacher.get(this); if (isOffline) { @@ -289,8 +272,12 @@ public class OnlineActivity extends CommonActivity { @Override public void onPause() { super.onPause(); - - unregisterReceiver(m_broadcastReceiver); + + try { + unregisterReceiver(m_broadcastReceiver); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } } @Override 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 617787e1..9c7974ea 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 @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.SharedPreferences; import android.database.Cursor; +import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; @@ -29,6 +30,7 @@ import android.widget.TextView; import com.shamanland.fab.ShowHideOnScroll; +import org.fox.ttrss.CommonActivity; import org.fox.ttrss.R; import org.fox.ttrss.util.ImageCacheService; import org.fox.ttrss.util.NotifyingScrollView; @@ -238,6 +240,9 @@ public class OfflineArticleFragment extends Fragment { final WebView web = (WebView)view.findViewById(R.id.article_content); if (web != null) { + if (CommonActivity.THEME_DARK.equals(m_prefs.getString("theme", CommonActivity.THEME_DEFAULT))) { + web.setBackgroundColor(Color.BLACK); + } web.setWebViewClient(new WebViewClient() { @Override diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java index 6031d730..4b484566 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDetailActivity.java @@ -201,7 +201,12 @@ public class OfflineDetailActivity extends OfflineActivity implements OfflineHea @Override public void onBackPressed() { - super.onBackPressed(); + try { + super.onBackPressed(); + } catch (IllegalStateException e) { + // java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState + e.printStackTrace(); + } } @Override diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java index 90bcd93e..f1827d21 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java @@ -47,7 +47,7 @@ public class OfflineFeedCategoriesFragment extends BaseFeedlistFragment implemen menu.findItem(R.id.create_shortcut).setEnabled(false); AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - Cursor cursor = (Cursor)getCatAtPosition(info.position); + Cursor cursor = getCatAtPosition(info.position); if (cursor != null) menu.setHeaderTitle(cursor.getString(cursor.getColumnIndex("title"))); @@ -57,7 +57,7 @@ public class OfflineFeedCategoriesFragment extends BaseFeedlistFragment implemen } public Cursor createCursor() { - String unreadOnly = BaseColumns._ID + "> 0 AND " + (m_activity.getUnreadOnly() ? "unread > 0" : "1"); + String unreadOnly = BaseColumns._ID + ">= 0 AND " + (m_activity.getUnreadOnly() ? "unread > 0" : "1"); String order = m_prefs.getBoolean("sort_feeds_by_unread", false) ? "unread DESC, title" : "title"; diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java index 1823d133..ed146845 100644 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineMasterActivity.java @@ -275,7 +275,12 @@ public class OfflineMasterActivity extends OfflineActivity implements OfflineHea m_drawerLayout.openDrawer(Gravity.START); } else { - super.onBackPressed(); + try { + super.onBackPressed(); + } catch (IllegalStateException e) { + // java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState + e.printStackTrace(); + } } } 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 aaa78532..bffcb8da 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 @@ -2,7 +2,6 @@ package org.fox.ttrss.types; import android.os.Parcel; import android.os.Parcelable; -import android.util.Log; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -39,16 +38,13 @@ public class Article implements Parcelable { public boolean selected; /* not serialized */ - public Document articleDoc; - public Element flavorImage; + transient public Document articleDoc; + transient public Element flavorImage; - public String flavorImageUri; - public String flavorStreamUri; - public String youtubeVid; - - //public int flavorImageCount; - - public List<Element> mediaList = new ArrayList<>(); + transient public String flavorImageUri; + transient public String flavorStreamUri; + transient public String youtubeVid; + transient public List<Element> mediaList = new ArrayList<>(); public Article(Parcel in) { readFromParcel(in); diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java index 891d1d1a..54df9da4 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java @@ -32,6 +32,7 @@ public class HeadlinesRequest extends ApiRequest { protected boolean m_firstIdChanged = false; protected int m_firstId = 0; + protected int m_amountLoaded = 0; public HeadlinesRequest(Context context, OnlineActivity activity, final Feed feed, ArticleList articles) { super(context); @@ -86,12 +87,14 @@ public class HeadlinesRequest extends ApiRequest { m_articles.remove(0); } - if (m_articles.get(m_articles.size()-1).id == HeadlinesFragment.ARTICLE_SPECIAL_LOADMORE) { + /*if (m_articles.get(m_articles.size()-1).id == HeadlinesFragment.ARTICLE_SPECIAL_LOADMORE) { m_articles.remove(m_articles.size()-1); // remove previous placeholder - } + }*/ } - + + m_amountLoaded = articles.size(); + for (Article f : articles) if (!m_articles.containsId(f.id)) { f.collectMediaInfo(); @@ -99,10 +102,10 @@ public class HeadlinesRequest extends ApiRequest { m_articles.add(f); } - if (articles.size() == HEADLINES_REQUEST_SIZE) { + /*if (articles.size() == HEADLINES_REQUEST_SIZE) { Article placeholder = new Article(HeadlinesFragment.ARTICLE_SPECIAL_LOADMORE); m_articles.add(placeholder); - } + }*/ /* if (m_articles.size() == 0) m_activity.setLoadingStatus(R.string.no_headlines_to_display, false); diff --git a/org.fox.ttrss/src/main/res/values/style.xml b/org.fox.ttrss/src/main/res/values/style.xml index 74aad95a..71c8b612 100755 --- a/org.fox.ttrss/src/main/res/values/style.xml +++ b/org.fox.ttrss/src/main/res/values/style.xml @@ -18,14 +18,14 @@ <item name="headlineHeaderBackground">#ccffffff</item> <item name="headlineUnreadBackground">@android:color/white</item> <item name="feedsSelectedBackground">#dddddd</item> - <item name="feedlistTextColor">@android:color/primary_text_light</item> - <item name="feedlistSelectedTextColor">@android:color/primary_text_light</item> - <item name="headlineUnreadTextColor">@android:color/primary_text_light</item> - <item name="headlineSelectedTextColor">@android:color/primary_text_light</item> - <item name="headlineExcerptTextColor">@android:color/secondary_text_light</item> + <item name="feedlistTextColor">@android:color/black</item> + <item name="feedlistSelectedTextColor">@android:color/black</item> + <item name="headlineUnreadTextColor">@android:color/black</item> + <item name="headlineSelectedTextColor">@android:color/black</item> + <item name="headlineExcerptTextColor">#323232</item> <item name="headlineSecondaryTextColor">#909090</item> <item name="headlineSelectedSecondaryTextColor">?headlineSelectedExcerptTextColor</item> - <item name="headlineSelectedExcerptTextColor">@android:color/secondary_text_light</item> + <item name="headlineSelectedExcerptTextColor">#323232</item> <item name="headlineTitleHighScoreUnreadTextColor">#008000</item> <item name="linkColor">?colorPrimary</item> <item name="loadingBackground">@android:color/white</item> @@ -33,7 +33,7 @@ <item name="articleNoteBackground">#fff7d5</item> <item name="parentBtnBackground">#dddddd</item> <item name="articleHeader">@android:color/transparent</item> - <item name="articleHeaderTextColor">@android:color/primary_text_light</item> + <item name="articleHeaderTextColor">@android:color/black</item> <item name="articleTextColor">@android:color/black</item> <item name="floatingActionButtonStyle">@style/FabTheme</item> <item name="headlineFooterColor">?colorPrimary</item> @@ -71,34 +71,34 @@ <!-- <item name="statusBarHintColor">?colorPrimary</item> --> <item name="unreadCounterColor">#909090</item> - <item name="feedlistTextColor">@android:color/primary_text_dark</item> - <item name="headlineUnreadTextColor">@android:color/primary_text_dark</item> + <item name="feedlistTextColor">@android:color/white</item> + <item name="headlineUnreadTextColor">@android:color/white</item> <item name="headlineSelectedTextColor">@android:color/white</item> - <item name="headlineExcerptTextColor">@android:color/secondary_text_dark</item> + <item name="headlineExcerptTextColor">#bebebe</item> <item name="headlineSecondaryTextColor">#909090</item> <item name="headlineTitleHighScoreUnreadTextColor">#00FF00</item> - <item name="headlineSelectedExcerptTextColor">@android:color/secondary_text_dark</item> + <item name="headlineSelectedExcerptTextColor">#bebebe</item> <item name="headlineSelectedSecondaryTextColor">?headlineSelectedExcerptTextColor</item> <item name="headlineSelectedBackground">#1c1c1c</item> <item name="headlineHeaderBackground">#99000000</item> <item name="headlineUnreadBackground">#101010</item> <item name="linkColor">?colorPrimary</item> <item name="loadingBackground">@android:color/black</item> - <item name="articleNoteTextColor">@android:color/secondary_text_dark</item> + <item name="articleNoteTextColor">#bebebe</item> <item name="articleNoteBackground">#303030</item> <item name="parentBtnBackground">#101010</item> <item name="ttrssHorizontalDivider">@android:drawable/divider_horizontal_dark</item> <item name="feedlistBackground">#1c1d1e</item> <item name="headlinesBackground">#1c1d1e</item> - <item name="articleBackground">#1c1d1e</item> + <item name="articleBackground">@android:color/black</item> <item name="feedsSelectedBackground">#1c1c1c</item> - <item name="feedlistSelectedTextColor">@android:color/primary_text_dark</item> + <item name="feedlistSelectedTextColor">@android:color/white</item> <item name="articleHeader">@android:color/transparent</item> - <item name="articleHeaderTextColor">@android:color/primary_text_dark</item> + <item name="articleHeaderTextColor">@android:color/white</item> <item name="floatingActionButtonStyle">@style/FabTheme</item> <item name="articleTextColor">#e0e0e0</item> <item name="headlineFooterColor">?colorPrimary</item> - <item name="articleHeaderSeparator">@android:color/black</item> + <item name="articleHeaderSeparator">#303030</item> <item name="colorPrimary">#607D8B</item> <item name="colorPrimaryDark">#455A64</item> |