[Android] Brave news - rss

This commit is contained in:
Alex C
2022-02-22 18:14:08 -05:00
parent 2d19a15ee8
commit 285c1a977a
9 changed files with 154 additions and 166 deletions
+1
View File
@@ -892,6 +892,7 @@ brave_java_resources = [
"java/res/layout/ntp_non_disruptive_banner.xml",
"java/res/layout/ntp_widget_list_item_layout.xml",
"java/res/layout/optin_layout.xml",
"java/res/layout/pref_edittext_dialog.xml",
"java/res/layout/qa_code_check.xml",
"java/res/layout/qa_command_line.xml",
"java/res/layout/radio_button_group_ens_resolve_method_preference.xml",
-1
View File
@@ -211,7 +211,6 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/set_default_browser/SetDefaultBrowserBottomSheetFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java",
"../../brave/android/java/org/chromium/chrome/browser/settings/BackgroundImagesPreferences.java",
"../../brave/android/java/org/chromium/chrome/browser/settings/BraveAddNewsSources.java",
"../../brave/android/java/org/chromium/chrome/browser/settings/BraveCustomTabsPreference.java",
"../../brave/android/java/org/chromium/chrome/browser/settings/BraveDialogPreference.java",
"../../brave/android/java/org/chromium/chrome/browser/settings/BraveLicensePreference.java",
@@ -35,6 +35,10 @@ public class LinearLayoutManagerWrapper extends LinearLayoutManager {
try {
super.onLayoutChildren(recycler, state);
} catch (IndexOutOfBoundsException e) {
Log.e("bn", "LinearLayoutManagerWrapper IndexOutOfBoundsException e:"+e.getMessage());
e.printStackTrace();
} catch (ClassCastException e) {
Log.e("bn", "LinearLayoutManagerWrapper ClassCastException e:"+e.getMessage());
e.printStackTrace();
}
}
@@ -1,154 +0,0 @@
/* Copyright (c) 2021 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.settings;
import android.os.Bundle;
import android.widget.EditText;
import androidx.preference.CheckBoxPreference;
import androidx.preference.EditTextPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import org.chromium.base.ContextUtils;
import org.chromium.brave_news.mojom.BraveNewsController;
import org.chromium.brave_news.mojom.Publisher;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveLaunchIntentDispatcher;
import org.chromium.chrome.browser.brave_news.BraveNewsControllerFactory;
import org.chromium.chrome.browser.settings.BravePreferenceFragment;
import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
import java.util.ArrayList;
import java.util.Map;
public class BraveAddNewsSources extends BravePreferenceFragment
implements Preference.OnPreferenceChangeListener, ConnectionErrorHandler {
private static final String PREF_ADD_SOURCES = "news_source_1";
private EditTextPreference addSource;
private EditText mEditText;
private PreferenceScreen mainScreen;
private BraveNewsController mBraveNewsController;
private ArrayList<Publisher> mPublishers;
public static int getPreferenceSummary() {
return BraveLaunchIntentDispatcher.useCustomTabs() ? R.string.text_on : R.string.text_off;
}
@Override
public void onConnectionError(MojoException e) {
if (mBraveNewsController != null) {
mBraveNewsController.close();
}
mBraveNewsController = null;
InitBraveNewsController();
}
private void InitBraveNewsController() {
if (mBraveNewsController != null) {
return;
}
mBraveNewsController =
BraveNewsControllerFactory.getInstance().getBraveNewsController(this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTitle(R.string.news_add_source);
SettingsUtils.addPreferencesFromResource(this, R.xml.brave_news_sources_default);
findPreference(PREF_ADD_SOURCES).setOnPreferenceChangeListener(this);
InitBraveNewsController();
mainScreen = getPreferenceManager().getPreferenceScreen();
addSource = (EditTextPreference) findPreference(PREF_ADD_SOURCES);
addSource.setPositiveButtonText(R.string.search_title);
mPublishers = new ArrayList<>();
mBraveNewsController.getPublishers((publishers) -> {
for (Map.Entry<String, Publisher> entry : publishers.entrySet()) {
String key = entry.getKey();
Publisher publisher = entry.getValue();
mPublishers.add(publisher);
CheckBoxPreference source =
new CheckBoxPreference(ContextUtils.getApplicationContext());
source.setTitle(publisher.publisherName);
mainScreen.addPreference(source);
}
});
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (PREF_ADD_SOURCES.equals(key)) {
PreferenceManager manager = getPreferenceManager();
PreferenceScreen sourcesScreen =
manager.createPreferenceScreen(ContextUtils.getApplicationContext());
sourcesScreen.setTitle((String) newValue);
// fetch results from API
// populate checkboxes
CheckBoxPreference source1 =
new CheckBoxPreference(ContextUtils.getApplicationContext());
source1.setTitle((String) newValue + " 1");
source1.setChecked(true);
sourcesScreen.addPreference(source1);
CheckBoxPreference source2 =
new CheckBoxPreference(ContextUtils.getApplicationContext());
source2.setTitle((String) newValue + " 2");
source2.setChecked(true);
sourcesScreen.addPreference(source2);
// end fetch. finish the layout
Preference button = new Preference(ContextUtils.getApplicationContext());
button.setTitle("Add");
button.setKey("add_news_source");
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
setPreferencesFromResource(R.xml.brave_news_preferences, null);
return true;
}
});
sourcesScreen.addPreference(button);
setPreferenceScreen(sourcesScreen);
return true;
}
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mBraveNewsController != null) {
mBraveNewsController.close();
}
}
private ArrayList<Preference> getPreferenceList(Preference p, ArrayList<Preference> list) {
if (p instanceof PreferenceCategory || p instanceof PreferenceScreen) {
PreferenceGroup pGroup = (PreferenceGroup) p;
int pCount = pGroup.getPreferenceCount();
for (int i = 0; i < pCount; i++) {
getPreferenceList(pGroup.getPreference(i), list); // recursive call
}
} else {
list.add(p);
}
return list;
}
}
@@ -72,7 +72,9 @@ public class BraveNewsCategorySources
Publisher publisher = entry.getValue();
if (publisher.categoryName.toLowerCase(Locale.ROOT)
.equals(mCategoryArg.toLowerCase(Locale.ROOT))) {
categoryPublishers.add(publisher);
if (!publisher.categoryName.equals("")) {
categoryPublishers.add(publisher);
}
}
mCategsPublishers.put(publisher.categoryName, categoryPublishers);
@@ -10,6 +10,8 @@ import android.os.Bundle;
import android.widget.EditText;
import androidx.annotation.Nullable;
import androidx.preference.CheckBoxPreference;
import androidx.preference.EditTextPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
@@ -18,18 +20,26 @@ import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.brave_news.mojom.BraveNewsController;
import org.chromium.brave_news.mojom.Publisher;
import org.chromium.brave_news.mojom.PublisherType;
import org.chromium.brave_news.mojom.UserEnabled;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveLaunchIntentDispatcher;
import org.chromium.chrome.browser.brave_news.BraveNewsControllerFactory;
import org.chromium.chrome.browser.preferences.BravePrefServiceBridge;
import org.chromium.chrome.browser.preferences.BravePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.settings.BravePreferenceFragment;
import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
import org.chromium.components.browser_ui.settings.ChromeBasePreference;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.components.browser_ui.settings.SettingsLauncher;
import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
import org.chromium.url.mojom.Url;
import java.util.ArrayList;
import java.util.HashMap;
@@ -44,10 +54,14 @@ public class BraveNewsPreferences extends BravePreferenceFragment
public static final String PREF_SHOW_OPTIN = "show_optin";
public static final String PREF_SOURCES_SECTION = "your_sources_section";
public static final String PREF_ADD_SOURCES = "add_source_news";
public static final String PREF_ADD_RSS_SOURCES = "news_source_1";
private static final String PREF_RSS_SOURCES = "rss_sources";
private ChromeSwitchPreference mTurnOnNews;
private ChromeSwitchPreference mShowNews;
private EditTextPreference addSource;
private PreferenceScreen mMainScreen;
private PreferenceCategory mRssCategory;
private PreferenceManager mPreferenceManager;
private TreeMap<String, List<Publisher>> mCategsPublishers;
@@ -62,9 +76,12 @@ public class BraveNewsPreferences extends BravePreferenceFragment
@Override
public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
SettingsUtils.addPreferencesFromResource(this, R.xml.brave_news_preferences);
InitBraveNewsController();
mTurnOnNews = (ChromeSwitchPreference) findPreference(PREF_TURN_ON_NEWS);
mShowNews = (ChromeSwitchPreference) findPreference(PREF_SHOW_NEWS);
mRssCategory = (PreferenceCategory) findPreference(PREF_SOURCES_SECTION);
mRssCategory.setOrderingAsAdded(true);
mSettingsFragment = this;
mTurnOnNews.setOnPreferenceChangeListener(this);
@@ -76,18 +93,60 @@ public class BraveNewsPreferences extends BravePreferenceFragment
List<Publisher> categoryPublishers = new ArrayList<>();
for (Map.Entry<String, Publisher> entry : publishers.entrySet()) {
Publisher publisher = entry.getValue();
categoryPublishers.add(publisher);
mCategsPublishers.put(publisher.categoryName, categoryPublishers);
if (publisher.type != PublisherType.DIRECT_SOURCE) {
categoryPublishers.add(publisher);
mCategsPublishers.put(publisher.categoryName, categoryPublishers);
} else {
addRss(publisher);
}
}
mCategsPublishers.put("All Sources", allPublishers);
addCategs(mCategsPublishers);
});
}
private void addRss(Publisher publisher) {
if (publisher.type != PublisherType.DIRECT_SOURCE) {
return;
}
SwitchPreference source = new SwitchPreference(ContextUtils.getApplicationContext());
boolean enabled = false;
if (publisher.userEnabledStatus == UserEnabled.ENABLED) {
enabled = true;
} else if (publisher.userEnabledStatus == UserEnabled.NOT_MODIFIED) {
enabled = publisher.isEnabled;
}
source.setTitle(publisher.publisherName);
source.setKey(publisher.publisherName);
source.setChecked(enabled);
source.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
@UserEnabled.EnumType
int type = UserEnabled.NOT_MODIFIED;
if ((boolean) newValue) {
type = UserEnabled.ENABLED;
} else {
type = UserEnabled.DISABLED;
}
SharedPreferencesManager.getInstance().writeBoolean(
BravePreferenceKeys.BRAVE_NEWS_CHANGE_SOURCE, true);
if (mBraveNewsController != null) {
mBraveNewsController.setPublisherPref(publisher.publisherId, type);
}
source.setChecked((boolean) newValue);
return false;
}
});
mRssCategory.addPreference(source);
}
private void addCategs(TreeMap<String, List<Publisher>> publisherCategories) {
for (Map.Entry<String, List<Publisher>> map : publisherCategories.entrySet()) {
String category = map.getKey();
ChromeBasePreference source =
new ChromeBasePreference(ContextUtils.getApplicationContext());
source.setTitle(category);
@@ -127,6 +186,13 @@ public class BraveNewsPreferences extends BravePreferenceFragment
mPreferenceManager = getPreferenceManager();
mMainScreen = mPreferenceManager.getPreferenceScreen();
addSource = (EditTextPreference) findPreference(PREF_RSS_SOURCES);
if (addSource != null) {
addSource.setPositiveButtonText(R.string.search_title);
addSource.setOnPreferenceChangeListener(this);
addSource.setText("");
}
boolean isNewsOn = BravePrefServiceBridge.getInstance().getNewsOptIn();
if (!isNewsOn) {
@@ -159,6 +225,30 @@ public class BraveNewsPreferences extends BravePreferenceFragment
}
} else if (PREF_SHOW_NEWS.equals(key)) {
BravePrefServiceBridge.getInstance().setShowNews((boolean) newValue);
} else if (PREF_RSS_SOURCES.equals(key)) {
if (((String) newValue).equals("")) {
return true;
}
PreferenceManager manager = getPreferenceManager();
PreferenceScreen sourcesScreen =
manager.createPreferenceScreen(ContextUtils.getApplicationContext());
sourcesScreen.setTitle((String) newValue);
// fetch results from API
Url rssUrl = new Url();
rssUrl.url = (String) newValue;
mBraveNewsController.subscribeToNewDirectFeed(
rssUrl, (isValidFeed, isDuplicate, result) -> {
if (isValidFeed && !isDuplicate && result != null) {
SharedPreferencesManager.getInstance().writeBoolean(
BravePreferenceKeys.BRAVE_NEWS_CHANGE_SOURCE, true);
getActivity().finish();
SettingsLauncher settingsLauncher = new SettingsLauncherImpl();
settingsLauncher.launchSettingsActivity(
getActivity(), BraveNewsPreferences.class);
}
});
return true;
}
setSourcesVisibility((boolean) newValue);
return true;
@@ -173,6 +263,8 @@ public class BraveNewsPreferences extends BravePreferenceFragment
}
}
private void createRssDialog(String newValue) {}
@Override
public void onDestroy() {
super.onDestroy();
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<!--* Copyright (c) 2021 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!-- Used because of an Android bu causing IllegalStateException on EditTextPreference in brave_news_preferences.xml -->
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="48dp"
android:layout_marginBottom="48dp"
android:overScrollMode="ifContentScrolls">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:paddingStart="?dialogPreferredPadding"
android:paddingLeft="?dialogPreferredPadding"
android:paddingEnd="?dialogPreferredPadding"
android:paddingRight="?dialogPreferredPadding"
android:orientation="vertical">
<TextView
android:id="@android:id/message"
style="?android:attr/textAppearanceSmall"
android:layout_marginBottom="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorSecondary" />
<EditText
android:id="@android:id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autofillHints="@NULL"
android:inputType="textUri"
android:hint="@string/news_feed_site_url" />
</LinearLayout>
</ScrollView>
@@ -19,11 +19,16 @@
android:summaryOn="@string/brave_news_optin_subtitle"
android:summaryOff="@string/brave_news_optin_subtitle" />
<!-- <PreferenceCategory
<PreferenceCategory
android:key="your_sources_section"
android:dependency="kNewTabPageShowToday"
android:title="@string/news_your_sources_section"/> -->
android:title="@string/news_your_sources_section"/>
<EditTextPreference
android:key="rss_sources"
android:title="@string/news_add_source"
android:defaultValue="@string/news_feed_site_url"
android:dialogLayout="@layout/pref_edittext_dialog" />
<PreferenceCategory
android:key="default_sources_section"
@@ -273,17 +273,12 @@ This file contains all "about" strings. It is set to NOT be translated, in tran
<message name="IDS_NEWS_TURN_ON_BUTTON" desc="Text for turn on button">
Show Brave News
</message>
<!-- // for RSS
<message name="IDS_NEWS_YOUR_SOURCES_SECTION" desc="Text for custom sources section">
Your sources
</message>
<message name="IDS_NEWS_SOURCES" desc="Text for show brave news toggle">
Your sources
</message>
<message name="IDS_NEWS_FEED_SITE_URL" desc="Text for news feed input">
Feed or Site URL
</message>
-->
<message name="IDS_NEWS_DEFAULT_SOURCES_SECTION" desc="Text for the default sources section">
Default sources
</message>