mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-31 21:41:33 +00:00
Merge branch 'sictiru'
* sictiru: Android v10.1b1. #1282 Adding feed to root folder #1319 In app and external browser options #1335 Auto theme option for OS level dark mode #1347 Show pager with stories after using the intel trainer and refreshing #1272 Load HTML in comments
This commit is contained in:
commit
cb6fe9d801
19 changed files with 274 additions and 23 deletions
|
@ -125,6 +125,9 @@
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.FolderReading"/>
|
android:name=".activity.FolderReading"/>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activity.InAppBrowser" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.SearchForFeeds" android:launchMode="singleTop" >
|
android:name=".activity.SearchForFeeds" android:launchMode="singleTop" >
|
||||||
|
|
|
@ -38,8 +38,8 @@ android {
|
||||||
applicationId "com.newsblur"
|
applicationId "com.newsblur"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
versionCode 166
|
versionCode 168
|
||||||
versionName "10.0b4"
|
versionName "10.1"
|
||||||
}
|
}
|
||||||
compileOptions.with {
|
compileOptions.with {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_7
|
sourceCompatibility = JavaVersion.VERSION_1_7
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<WebView
|
||||||
|
android:id="@+id/web_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress_bar"
|
||||||
|
style="?android:attr/progressBarStyleHorizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="-6dp"
|
||||||
|
android:max="100"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
</FrameLayout>
|
|
@ -34,6 +34,8 @@
|
||||||
android:title="@string/menu_theme_choose" >
|
android:title="@string/menu_theme_choose" >
|
||||||
<menu>
|
<menu>
|
||||||
<group android:checkableBehavior="single">
|
<group android:checkableBehavior="single">
|
||||||
|
<item android:id="@+id/menu_theme_auto"
|
||||||
|
android:title="@string/auto" />
|
||||||
<item android:id="@+id/menu_theme_light"
|
<item android:id="@+id/menu_theme_light"
|
||||||
android:title="@string/light" />
|
android:title="@string/light" />
|
||||||
<item android:id="@+id/menu_theme_dark"
|
<item android:id="@+id/menu_theme_dark"
|
||||||
|
|
|
@ -52,6 +52,8 @@
|
||||||
android:title="@string/menu_theme_choose" >
|
android:title="@string/menu_theme_choose" >
|
||||||
<menu>
|
<menu>
|
||||||
<group android:checkableBehavior="single">
|
<group android:checkableBehavior="single">
|
||||||
|
<item android:id="@+id/menu_theme_auto"
|
||||||
|
android:title="@string/auto" />
|
||||||
<item android:id="@+id/menu_theme_light"
|
<item android:id="@+id/menu_theme_light"
|
||||||
android:title="@string/light" />
|
android:title="@string/light" />
|
||||||
<item android:id="@+id/menu_theme_dark"
|
<item android:id="@+id/menu_theme_dark"
|
||||||
|
|
|
@ -52,6 +52,8 @@
|
||||||
android:title="@string/menu_theme_choose" >
|
android:title="@string/menu_theme_choose" >
|
||||||
<menu>
|
<menu>
|
||||||
<group android:checkableBehavior="single">
|
<group android:checkableBehavior="single">
|
||||||
|
<item android:id="@+id/menu_theme_auto"
|
||||||
|
android:title="@string/auto" />
|
||||||
<item android:id="@+id/menu_theme_light"
|
<item android:id="@+id/menu_theme_light"
|
||||||
android:title="@string/light" />
|
android:title="@string/light" />
|
||||||
<item android:id="@+id/menu_theme_dark"
|
<item android:id="@+id/menu_theme_dark"
|
||||||
|
|
|
@ -402,6 +402,7 @@
|
||||||
<string name="feed_intel_author_header">AUTHORS</string>
|
<string name="feed_intel_author_header">AUTHORS</string>
|
||||||
<string name="intel_feed_header">EVERYTHING BY PUBLISHER</string>
|
<string name="intel_feed_header">EVERYTHING BY PUBLISHER</string>
|
||||||
|
|
||||||
|
<string name="auto">Auto</string>
|
||||||
<string name="light">Light</string>
|
<string name="light">Light</string>
|
||||||
<string name="dark">Dark</string>
|
<string name="dark">Dark</string>
|
||||||
<string name="black">Black</string>
|
<string name="black">Black</string>
|
||||||
|
@ -493,6 +494,7 @@
|
||||||
</string-array>
|
</string-array>
|
||||||
<string name="rtl_gesture_action_value">GEST_ACTION_MARKUNREAD</string>
|
<string name="rtl_gesture_action_value">GEST_ACTION_MARKUNREAD</string>
|
||||||
|
|
||||||
|
<string name="default_browser">Default browser</string>
|
||||||
<string name="font">Font</string>
|
<string name="font">Font</string>
|
||||||
<string name="default_font">Default</string>
|
<string name="default_font">Default</string>
|
||||||
<string name="whitney_font">Whitney</string>
|
<string name="whitney_font">Whitney</string>
|
||||||
|
@ -510,6 +512,25 @@
|
||||||
<string name="noto_sans_font_prefvalue">NOTO_SANS</string>
|
<string name="noto_sans_font_prefvalue">NOTO_SANS</string>
|
||||||
<string name="noto_serif_font_prefvalue">NOTO_SERIF</string>
|
<string name="noto_serif_font_prefvalue">NOTO_SERIF</string>
|
||||||
<string name="open_sans_condensed_font_prefvalue">OPEN_SANS_CONDENSED</string>
|
<string name="open_sans_condensed_font_prefvalue">OPEN_SANS_CONDENSED</string>
|
||||||
|
<string name="system_default_prefvalue">SYSTEM_DEFAULT</string>
|
||||||
|
<string name="in_app_browser_prefvalue">IN_APP_BROWSER</string>
|
||||||
|
<string name="chrome_prefvalue">CHROME</string>
|
||||||
|
<string name="firefox_prefvalue">FIREFOX</string>
|
||||||
|
<string name="opera_mini_prefvalue">OPERA_MINI</string>
|
||||||
|
<string-array name="default_browser_entries">
|
||||||
|
<item>System default</item>
|
||||||
|
<item>In-app browser</item>
|
||||||
|
<item>Chrome</item>
|
||||||
|
<item>Firefox</item>
|
||||||
|
<item>Opera Mini</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="default_browser_values">
|
||||||
|
<item>@string/system_default_prefvalue</item>
|
||||||
|
<item>@string/in_app_browser_prefvalue</item>
|
||||||
|
<item>@string/chrome_prefvalue</item>
|
||||||
|
<item>@string/firefox_prefvalue</item>
|
||||||
|
<item>@string/opera_mini_prefvalue</item>
|
||||||
|
</string-array>
|
||||||
<string-array name="default_font_entries">
|
<string-array name="default_font_entries">
|
||||||
<item>@string/anonymous_pro_font</item>
|
<item>@string/anonymous_pro_font</item>
|
||||||
<item>@string/chronicle_font</item>
|
<item>@string/chronicle_font</item>
|
||||||
|
@ -531,6 +552,7 @@
|
||||||
<item>@string/whitney_font_prefvalue</item>
|
<item>@string/whitney_font_prefvalue</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string name="default_font_value">DEFAULT</string>
|
<string name="default_font_value">DEFAULT</string>
|
||||||
|
<string name="default_default_browser">@string/system_default_prefvalue</string>
|
||||||
|
|
||||||
<string name="story_notification_channel_id">story_notification_channel</string>
|
<string name="story_notification_channel_id">story_notification_channel</string>
|
||||||
<string name="story_notification_channel_name">New Stories</string>
|
<string name="story_notification_channel_name">New Stories</string>
|
||||||
|
|
|
@ -105,6 +105,13 @@
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/settings_reading"
|
android:title="@string/settings_reading"
|
||||||
android:key="reading">
|
android:key="reading">
|
||||||
|
<ListPreference
|
||||||
|
android:key="default_browser"
|
||||||
|
android:title="@string/default_browser"
|
||||||
|
android:dialogTitle="@string/default_browser"
|
||||||
|
android:entries="@array/default_browser_entries"
|
||||||
|
android:entryValues="@array/default_browser_values"
|
||||||
|
android:defaultValue="@string/default_default_browser" />
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:key="reading_font"
|
android:key="reading_font"
|
||||||
android:title="@string/font"
|
android:title="@string/font"
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.newsblur.activity;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.app.FragmentActivity;
|
||||||
|
import android.view.View;
|
||||||
|
import android.webkit.WebChromeClient;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.webkit.WebViewClient;
|
||||||
|
|
||||||
|
import com.newsblur.databinding.ActivityInAppBrowserBinding;
|
||||||
|
import com.newsblur.util.PrefsUtils;
|
||||||
|
|
||||||
|
public class InAppBrowser extends FragmentActivity {
|
||||||
|
|
||||||
|
public static final String URI = "uri";
|
||||||
|
|
||||||
|
private ActivityInAppBrowserBinding binding;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
PrefsUtils.applyThemePreference(this);
|
||||||
|
binding = ActivityInAppBrowserBinding.inflate(getLayoutInflater());
|
||||||
|
setContentView(binding.getRoot());
|
||||||
|
|
||||||
|
String url = getIntent().getParcelableExtra(URI).toString();
|
||||||
|
|
||||||
|
binding.webView.getSettings().setJavaScriptEnabled(true);
|
||||||
|
binding.webView.getSettings().setLoadWithOverviewMode(true);
|
||||||
|
binding.webView.getSettings().setSupportZoom(true);
|
||||||
|
|
||||||
|
binding.webView.setWebViewClient(new WebViewClient() {
|
||||||
|
@Override
|
||||||
|
public void onPageStarted(WebView view, String url, Bitmap favicon) {
|
||||||
|
super.onPageStarted(view, url, favicon);
|
||||||
|
binding.progressBar.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageFinished(WebView view, String url) {
|
||||||
|
super.onPageFinished(view, url);
|
||||||
|
binding.progressBar.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
binding.webView.setWebChromeClient(new WebChromeClient() {
|
||||||
|
@Override
|
||||||
|
public void onProgressChanged(WebView view, int newProgress) {
|
||||||
|
super.onProgressChanged(view, newProgress);
|
||||||
|
binding.progressBar.setProgress(newProgress);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
binding.webView.loadUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBackPressed() {
|
||||||
|
if (binding.webView.canGoBack()) {
|
||||||
|
binding.webView.goBack();
|
||||||
|
} else {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -222,6 +222,8 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL
|
||||||
menu.findItem(R.id.menu_theme_dark).setChecked(true);
|
menu.findItem(R.id.menu_theme_dark).setChecked(true);
|
||||||
} else if (themeValue == ThemeValue.BLACK) {
|
} else if (themeValue == ThemeValue.BLACK) {
|
||||||
menu.findItem(R.id.menu_theme_black).setChecked(true);
|
menu.findItem(R.id.menu_theme_black).setChecked(true);
|
||||||
|
} else if (themeValue == ThemeValue.AUTO) {
|
||||||
|
menu.findItem(R.id.menu_theme_auto).setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(binding.itemlistSearchQuery.getText())) {
|
if (!TextUtils.isEmpty(binding.itemlistSearchQuery.getText())) {
|
||||||
|
@ -263,6 +265,9 @@ public abstract class ItemsList extends NbActivity implements StoryOrderChangedL
|
||||||
binding.itemlistSearchQuery.setVisibility(View.GONE);
|
binding.itemlistSearchQuery.setVisibility(View.GONE);
|
||||||
checkSearchQuery();
|
checkSearchQuery();
|
||||||
}
|
}
|
||||||
|
} else if(item.getItemId() == R.id.menu_theme_auto) {
|
||||||
|
PrefsUtils.setSelectedTheme(this, ThemeValue.AUTO);
|
||||||
|
UIUtils.restartActivity(this);
|
||||||
} else if (item.getItemId() == R.id.menu_theme_light) {
|
} else if (item.getItemId() == R.id.menu_theme_light) {
|
||||||
PrefsUtils.setSelectedTheme(this, ThemeValue.LIGHT);
|
PrefsUtils.setSelectedTheme(this, ThemeValue.LIGHT);
|
||||||
UIUtils.restartActivity(this);
|
UIUtils.restartActivity(this);
|
||||||
|
|
|
@ -72,7 +72,6 @@ public class Main extends NbActivity implements StateChangedListener, SwipeRefre
|
||||||
|
|
||||||
fragmentManager = getSupportFragmentManager();
|
fragmentManager = getSupportFragmentManager();
|
||||||
folderFeedList = (FolderListFragment) fragmentManager.findFragmentByTag("folderFeedListFragment");
|
folderFeedList = (FolderListFragment) fragmentManager.findFragmentByTag("folderFeedListFragment");
|
||||||
folderFeedList.setRetainInstance(true);
|
|
||||||
((FeedIntelligenceSelectorFragment) fragmentManager.findFragmentByTag("feedIntelligenceSelector")).setState(folderFeedList.currentState);
|
((FeedIntelligenceSelectorFragment) fragmentManager.findFragmentByTag("feedIntelligenceSelector")).setState(folderFeedList.currentState);
|
||||||
|
|
||||||
// make sure the interval sync is scheduled, since we are the root Activity
|
// make sure the interval sync is scheduled, since we are the root Activity
|
||||||
|
@ -303,6 +302,8 @@ public class Main extends NbActivity implements StateChangedListener, SwipeRefre
|
||||||
menu.findItem(R.id.menu_theme_dark).setChecked(true);
|
menu.findItem(R.id.menu_theme_dark).setChecked(true);
|
||||||
} else if (themeValue == ThemeValue.BLACK) {
|
} else if (themeValue == ThemeValue.BLACK) {
|
||||||
menu.findItem(R.id.menu_theme_black).setChecked(true);
|
menu.findItem(R.id.menu_theme_black).setChecked(true);
|
||||||
|
} else if (themeValue == ThemeValue.AUTO) {
|
||||||
|
menu.findItem(R.id.menu_theme_auto).setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.findItem(R.id.menu_widget).setVisible(WidgetUtils.hasActiveAppWidgets(this));
|
menu.findItem(R.id.menu_widget).setVisible(WidgetUtils.hasActiveAppWidgets(this));
|
||||||
|
@ -360,6 +361,9 @@ public class Main extends NbActivity implements StateChangedListener, SwipeRefre
|
||||||
DialogFragment newFragment = new LoginAsDialogFragment();
|
DialogFragment newFragment = new LoginAsDialogFragment();
|
||||||
newFragment.show(getSupportFragmentManager(), "dialog");
|
newFragment.show(getSupportFragmentManager(), "dialog");
|
||||||
return true;
|
return true;
|
||||||
|
} else if (item.getItemId() == R.id.menu_theme_auto) {
|
||||||
|
PrefsUtils.setSelectedTheme(this, ThemeValue.AUTO);
|
||||||
|
UIUtils.restartActivity(this);
|
||||||
} else if (item.getItemId() == R.id.menu_theme_light) {
|
} else if (item.getItemId() == R.id.menu_theme_light) {
|
||||||
PrefsUtils.setSelectedTheme(this, ThemeValue.LIGHT);
|
PrefsUtils.setSelectedTheme(this, ThemeValue.LIGHT);
|
||||||
UIUtils.restartActivity(this);
|
UIUtils.restartActivity(this);
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -76,7 +77,6 @@ public abstract class Reading extends NbActivity implements OnPageChangeListener
|
||||||
private View contentView; // we use this a ton, so cache it
|
private View contentView; // we use this a ton, so cache it
|
||||||
|
|
||||||
ViewPager pager;
|
ViewPager pager;
|
||||||
ReadingPagerFragment readingFragment;
|
|
||||||
|
|
||||||
protected ReadingAdapter readingAdapter;
|
protected ReadingAdapter readingAdapter;
|
||||||
private boolean stopLoading;
|
private boolean stopLoading;
|
||||||
|
@ -249,6 +249,7 @@ public abstract class Reading extends NbActivity implements OnPageChangeListener
|
||||||
// the system can and will re-use activities, so during the initial mismatch of
|
// the system can and will re-use activities, so during the initial mismatch of
|
||||||
// data, don't show the old stories
|
// data, don't show the old stories
|
||||||
pager.setVisibility(View.INVISIBLE);
|
pager.setVisibility(View.INVISIBLE);
|
||||||
|
binding.readingEmptyViewText.setVisibility(View.VISIBLE);
|
||||||
stories = null;
|
stories = null;
|
||||||
triggerRefresh(AppConstants.READING_STORY_PRELOAD);
|
triggerRefresh(AppConstants.READING_STORY_PRELOAD);
|
||||||
return;
|
return;
|
||||||
|
@ -287,7 +288,11 @@ public abstract class Reading extends NbActivity implements OnPageChangeListener
|
||||||
|
|
||||||
private void skipPagerToStoryHash() {
|
private void skipPagerToStoryHash() {
|
||||||
// if we already started and found our target story, this will be unset
|
// if we already started and found our target story, this will be unset
|
||||||
if (storyHash == null) return;
|
if (storyHash == null) {
|
||||||
|
pager.setVisibility(View.VISIBLE);
|
||||||
|
binding.readingEmptyViewText.setVisibility(View.INVISIBLE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
int position = -1;
|
int position = -1;
|
||||||
if (storyHash.equals(FIND_FIRST_UNREAD)) {
|
if (storyHash.equals(FIND_FIRST_UNREAD)) {
|
||||||
position = readingAdapter.findFirstUnread();
|
position = readingAdapter.findFirstUnread();
|
||||||
|
@ -330,6 +335,15 @@ public abstract class Reading extends NbActivity implements OnPageChangeListener
|
||||||
pager.setPageMarginDrawable(R.drawable.divider_light);
|
pager.setPageMarginDrawable(R.drawable.divider_light);
|
||||||
} else if (themeValue == ThemeValue.DARK) {
|
} else if (themeValue == ThemeValue.DARK) {
|
||||||
pager.setPageMarginDrawable(R.drawable.divider_dark);
|
pager.setPageMarginDrawable(R.drawable.divider_dark);
|
||||||
|
} else if (themeValue == ThemeValue.AUTO) {
|
||||||
|
int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
|
||||||
|
pager.setPageMarginDrawable(R.drawable.divider_dark);
|
||||||
|
} else if (nightModeFlags == Configuration.UI_MODE_NIGHT_NO) {
|
||||||
|
pager.setPageMarginDrawable(R.drawable.divider_light);
|
||||||
|
} else if (nightModeFlags == Configuration.UI_MODE_NIGHT_UNDEFINED) {
|
||||||
|
pager.setPageMarginDrawable(R.drawable.divider_light);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean showFeedMetadata = true;
|
boolean showFeedMetadata = true;
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.GradientDrawable;
|
import android.graphics.drawable.GradientDrawable;
|
||||||
|
@ -320,6 +321,8 @@ public class ReadingItemFragment extends NbFragment implements PopupMenu.OnMenuI
|
||||||
menu.findItem(R.id.menu_theme_dark).setChecked(true);
|
menu.findItem(R.id.menu_theme_dark).setChecked(true);
|
||||||
} else if (themeValue == ThemeValue.BLACK) {
|
} else if (themeValue == ThemeValue.BLACK) {
|
||||||
menu.findItem(R.id.menu_theme_black).setChecked(true);
|
menu.findItem(R.id.menu_theme_black).setChecked(true);
|
||||||
|
} else if (themeValue == ThemeValue.AUTO) {
|
||||||
|
menu.findItem(R.id.menu_theme_auto).setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
pm.setOnMenuItemClickListener(this);
|
pm.setOnMenuItemClickListener(this);
|
||||||
|
@ -367,7 +370,11 @@ public class ReadingItemFragment extends NbFragment implements PopupMenu.OnMenuI
|
||||||
} else if (item.getItemId() == R.id.menu_reading_markunread) {
|
} else if (item.getItemId() == R.id.menu_reading_markunread) {
|
||||||
FeedUtils.markStoryUnread(story, getActivity());
|
FeedUtils.markStoryUnread(story, getActivity());
|
||||||
return true;
|
return true;
|
||||||
} else if (item.getItemId() == R.id.menu_theme_light) {
|
} else if (item.getItemId() == R.id.menu_theme_auto) {
|
||||||
|
PrefsUtils.setSelectedTheme(getActivity(), ThemeValue.AUTO);
|
||||||
|
UIUtils.restartActivity(getActivity());
|
||||||
|
return true;
|
||||||
|
} else if (item.getItemId() == R.id.menu_theme_light) {
|
||||||
PrefsUtils.setSelectedTheme(getActivity(), ThemeValue.LIGHT);
|
PrefsUtils.setSelectedTheme(getActivity(), ThemeValue.LIGHT);
|
||||||
UIUtils.restartActivity(getActivity());
|
UIUtils.restartActivity(getActivity());
|
||||||
return true;
|
return true;
|
||||||
|
@ -789,6 +796,15 @@ public class ReadingItemFragment extends NbFragment implements PopupMenu.OnMenuI
|
||||||
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"dark_reading.css\" />");
|
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"dark_reading.css\" />");
|
||||||
} else if (themeValue == ThemeValue.BLACK) {
|
} else if (themeValue == ThemeValue.BLACK) {
|
||||||
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"black_reading.css\" />");
|
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"black_reading.css\" />");
|
||||||
|
} else if (themeValue == ThemeValue.AUTO) {
|
||||||
|
int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
|
||||||
|
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"dark_reading.css\" />");
|
||||||
|
} else if (nightModeFlags == Configuration.UI_MODE_NIGHT_NO) {
|
||||||
|
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"light_reading.css\" />");
|
||||||
|
} else if (nightModeFlags == Configuration.UI_MODE_NIGHT_UNDEFINED) {
|
||||||
|
builder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"light_reading.css\" />");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
builder.append("</head><body><div class=\"NB-story\">");
|
builder.append("</head><body><div class=\"NB-story\">");
|
||||||
builder.append(storyText);
|
builder.append(storyText);
|
||||||
|
|
|
@ -31,6 +31,7 @@ import com.newsblur.domain.UserProfile;
|
||||||
import com.newsblur.fragment.ReplyDialogFragment;
|
import com.newsblur.fragment.ReplyDialogFragment;
|
||||||
import com.newsblur.util.FeedUtils;
|
import com.newsblur.util.FeedUtils;
|
||||||
import com.newsblur.util.PrefsUtils;
|
import com.newsblur.util.PrefsUtils;
|
||||||
|
import com.newsblur.util.UIUtils;
|
||||||
import com.newsblur.util.ViewUtils;
|
import com.newsblur.util.ViewUtils;
|
||||||
import com.newsblur.view.FlowLayout;
|
import com.newsblur.view.FlowLayout;
|
||||||
|
|
||||||
|
@ -96,7 +97,7 @@ public class SetupCommentSectionTask extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
View commentView = inflater.inflate(R.layout.include_comment, null);
|
View commentView = inflater.inflate(R.layout.include_comment, null);
|
||||||
TextView commentText = (TextView) commentView.findViewById(R.id.comment_text);
|
TextView commentText = (TextView) commentView.findViewById(R.id.comment_text);
|
||||||
commentText.setText(comment.commentText);
|
commentText.setText(UIUtils.fromHtml(comment.commentText));
|
||||||
ImageView commentImage = (ImageView) commentView.findViewById(R.id.comment_user_image);
|
ImageView commentImage = (ImageView) commentView.findViewById(R.id.comment_user_image);
|
||||||
|
|
||||||
TextView commentSharedDate = (TextView) commentView.findViewById(R.id.comment_shareddate);
|
TextView commentSharedDate = (TextView) commentView.findViewById(R.id.comment_shareddate);
|
||||||
|
@ -161,7 +162,7 @@ public class SetupCommentSectionTask extends AsyncTask<Void, Void, Void> {
|
||||||
for (final Reply reply : replies) {
|
for (final Reply reply : replies) {
|
||||||
View replyView = inflater.inflate(R.layout.include_reply, null);
|
View replyView = inflater.inflate(R.layout.include_reply, null);
|
||||||
TextView replyText = (TextView) replyView.findViewById(R.id.reply_text);
|
TextView replyText = (TextView) replyView.findViewById(R.id.reply_text);
|
||||||
replyText.setText(reply.text);
|
replyText.setText(UIUtils.fromHtml(reply.text));
|
||||||
ImageView replyImage = (ImageView) replyView.findViewById(R.id.reply_user_image);
|
ImageView replyImage = (ImageView) replyView.findViewById(R.id.reply_user_image);
|
||||||
|
|
||||||
final UserProfile replyUser = FeedUtils.dbHelper.getUserProfile(reply.userId);
|
final UserProfile replyUser = FeedUtils.dbHelper.getUserProfile(reply.userId);
|
||||||
|
|
|
@ -561,7 +561,7 @@ public class APIManager {
|
||||||
public AddFeedResponse addFeed(String feedUrl, @Nullable String folderName) {
|
public AddFeedResponse addFeed(String feedUrl, @Nullable String folderName) {
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(APIConstants.PARAMETER_URL, feedUrl);
|
values.put(APIConstants.PARAMETER_URL, feedUrl);
|
||||||
if (!TextUtils.isEmpty(folderName)) {
|
if (!TextUtils.isEmpty(folderName) && !folderName.equals(AppConstants.ROOT_FOLDER)) {
|
||||||
values.put(APIConstants.PARAMETER_FOLDER, folderName);
|
values.put(APIConstants.PARAMETER_FOLDER, folderName);
|
||||||
}
|
}
|
||||||
APIResponse response = post(buildUrl(APIConstants.PATH_ADD_FEED), values);
|
APIResponse response = post(buildUrl(APIConstants.PATH_ADD_FEED), values);
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.newsblur.util;
|
||||||
|
|
||||||
|
public enum DefaultBrowser {
|
||||||
|
SYSTEM_DEFAULT,
|
||||||
|
IN_APP_BROWSER,
|
||||||
|
CHROME,
|
||||||
|
FIREFOX,
|
||||||
|
OPERA_MINI;
|
||||||
|
|
||||||
|
public static DefaultBrowser getDefaultBrowser(String preferenceValue) {
|
||||||
|
switch (preferenceValue) {
|
||||||
|
case "IN_APP_BROWSER":
|
||||||
|
return IN_APP_BROWSER;
|
||||||
|
case "CHROME":
|
||||||
|
return CHROME;
|
||||||
|
case "FIREFOX":
|
||||||
|
return FIREFOX;
|
||||||
|
case "OPERA_MINI":
|
||||||
|
return OPERA_MINI;
|
||||||
|
case "SYSTEM_DEFAULT":
|
||||||
|
default:
|
||||||
|
return SYSTEM_DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -51,6 +51,8 @@ public class PrefConstants {
|
||||||
|
|
||||||
public static final String FEED_DEFAULT_FEED_VIEW_PREFIX = "feed_default_feed_view_";
|
public static final String FEED_DEFAULT_FEED_VIEW_PREFIX = "feed_default_feed_view_";
|
||||||
|
|
||||||
|
public static final String DEFAULT_BROWSER = "default_browser";
|
||||||
|
|
||||||
public static final String READ_STORIES_FOLDER_NAME = "read_stories";
|
public static final String READ_STORIES_FOLDER_NAME = "read_stories";
|
||||||
public static final String SAVED_STORIES_FOLDER_NAME = "saved_stories";
|
public static final String SAVED_STORIES_FOLDER_NAME = "saved_stories";
|
||||||
public static final String READING_ENTER_IMMERSIVE_SINGLE_TAP = "immersive_enter_single_tap";
|
public static final String READING_ENTER_IMMERSIVE_SINGLE_TAP = "immersive_enter_single_tap";
|
||||||
|
@ -85,6 +87,7 @@ public class PrefConstants {
|
||||||
|
|
||||||
public static final String THEME = "theme";
|
public static final String THEME = "theme";
|
||||||
public enum ThemeValue {
|
public enum ThemeValue {
|
||||||
|
AUTO,
|
||||||
LIGHT,
|
LIGHT,
|
||||||
DARK,
|
DARK,
|
||||||
BLACK;
|
BLACK;
|
||||||
|
|
|
@ -14,7 +14,11 @@ import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.SharedPreferences.Editor;
|
import android.content.SharedPreferences.Editor;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
|
import android.content.res.Configuration;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
@ -777,6 +781,15 @@ public class PrefsUtils {
|
||||||
activity.setTheme(R.style.NewsBlurDarkTheme);
|
activity.setTheme(R.style.NewsBlurDarkTheme);
|
||||||
} else if (value == ThemeValue.BLACK) {
|
} else if (value == ThemeValue.BLACK) {
|
||||||
activity.setTheme(R.style.NewsBlurBlackTheme);
|
activity.setTheme(R.style.NewsBlurBlackTheme);
|
||||||
|
} else if (value == ThemeValue.AUTO) {
|
||||||
|
int nightModeFlags = activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
|
||||||
|
activity.setTheme(R.style.NewsBlurDarkTheme);
|
||||||
|
} else if (nightModeFlags == Configuration.UI_MODE_NIGHT_NO) {
|
||||||
|
activity.setTheme(R.style.NewsBlurTheme);
|
||||||
|
} else if (nightModeFlags == Configuration.UI_MODE_NIGHT_UNDEFINED) {
|
||||||
|
activity.setTheme(R.style.NewsBlurTheme);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -945,4 +958,13 @@ public class PrefsUtils {
|
||||||
editor.putString(PrefConstants.WIDGET_BACKGROUND, widgetBackground.toString());
|
editor.putString(PrefConstants.WIDGET_BACKGROUND, widgetBackground.toString());
|
||||||
editor.commit();
|
editor.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DefaultBrowser getDefaultBrowser(Context context) {
|
||||||
|
return DefaultBrowser.getDefaultBrowser(getDefaultBrowserString(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDefaultBrowserString(Context context) {
|
||||||
|
SharedPreferences preferences = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
|
||||||
|
return preferences.getString(PrefConstants.DEFAULT_BROWSER, DefaultBrowser.SYSTEM_DEFAULT.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.newsblur.view;
|
package com.newsblur.view;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
@ -16,8 +17,11 @@ import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import com.newsblur.activity.InAppBrowser;
|
||||||
import com.newsblur.activity.Reading;
|
import com.newsblur.activity.Reading;
|
||||||
import com.newsblur.fragment.ReadingItemFragment;
|
import com.newsblur.fragment.ReadingItemFragment;
|
||||||
|
import com.newsblur.util.DefaultBrowser;
|
||||||
|
import com.newsblur.util.PrefsUtils;
|
||||||
|
|
||||||
public class NewsblurWebview extends WebView {
|
public class NewsblurWebview extends WebView {
|
||||||
|
|
||||||
|
@ -88,21 +92,15 @@ public class NewsblurWebview extends WebView {
|
||||||
|
|
||||||
class NewsblurWebViewClient extends WebViewClient {
|
class NewsblurWebViewClient extends WebViewClient {
|
||||||
@Override
|
@Override
|
||||||
// this was deprecated in API 24 but the replacement only added in the same release.
|
|
||||||
// the suppression can be removed when we move past 24
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
// as of v43.0.2357.121 of the system WebView, links no longer open in the user's chosen
|
|
||||||
// browser, but open in-app. Override the default behaviour so it works as expected on
|
|
||||||
// all devices.
|
|
||||||
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
||||||
Uri uri = Uri.parse(url);
|
handleUri(Uri.parse(url));
|
||||||
try {
|
return true;
|
||||||
Intent i = new Intent(Intent.ACTION_VIEW);
|
}
|
||||||
i.setData(uri);
|
|
||||||
context.startActivity(i);
|
@TargetApi(Build.VERSION_CODES.N)
|
||||||
} catch (Exception e) {
|
@Override
|
||||||
com.newsblur.util.Log.e(this.getClass().getName(), "device cannot open URLs");
|
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||||
}
|
handleUri(request.getUrl());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +113,46 @@ public class NewsblurWebview extends WebView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleUri(Uri uri) {
|
||||||
|
DefaultBrowser defaultBrowser = PrefsUtils.getDefaultBrowser(context);
|
||||||
|
if (defaultBrowser == DefaultBrowser.SYSTEM_DEFAULT) {
|
||||||
|
openSystemDefaultBrowser(uri);
|
||||||
|
} else if (defaultBrowser == DefaultBrowser.IN_APP_BROWSER) {
|
||||||
|
Intent intent = new Intent(context, InAppBrowser.class);
|
||||||
|
intent.putExtra(InAppBrowser.URI, uri);
|
||||||
|
context.startActivity(intent);
|
||||||
|
} else if (defaultBrowser == DefaultBrowser.CHROME) {
|
||||||
|
openExternalBrowserApp(uri, "com.android.chrome");
|
||||||
|
} else if (defaultBrowser == DefaultBrowser.FIREFOX) {
|
||||||
|
openExternalBrowserApp(uri, "org.mozilla.firefox");
|
||||||
|
} else if (defaultBrowser == DefaultBrowser.OPERA_MINI) {
|
||||||
|
openExternalBrowserApp(uri, "com.opera.mini.native");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openSystemDefaultBrowser(Uri uri) {
|
||||||
|
try {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
|
intent.setData(uri);
|
||||||
|
context.startActivity(intent);
|
||||||
|
} catch (Exception e) {
|
||||||
|
com.newsblur.util.Log.e(this.getClass().getName(), "device cannot open URLs");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openExternalBrowserApp(Uri uri, String packageName) {
|
||||||
|
try {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
|
intent.setData(uri);
|
||||||
|
intent.setPackage(packageName);
|
||||||
|
context.startActivity(intent);
|
||||||
|
} catch (Exception e) {
|
||||||
|
com.newsblur.util.Log.e(this.getClass().getName(), "apps not available to open URLs");
|
||||||
|
// fallback to system default if apps cannot be opened
|
||||||
|
openSystemDefaultBrowser(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// this WCC implements the bare minimum callbacks to get HTML5 fullscreen video working
|
// this WCC implements the bare minimum callbacks to get HTML5 fullscreen video working
|
||||||
class NewsblurWebChromeClient extends WebChromeClient {
|
class NewsblurWebChromeClient extends WebChromeClient {
|
||||||
public View customView;
|
public View customView;
|
||||||
|
|
Loading…
Add table
Reference in a new issue