From 285c1a977a1e68c565646fd98b09ab8b05b5efec Mon Sep 17 00:00:00 2001 From: Alex C Date: Fri, 21 Jan 2022 15:14:34 -0500 Subject: [PATCH] [Android] Brave news - rss --- android/brave_java_resources.gni | 1 + android/brave_java_sources.gni | 1 - .../LinearLayoutManagerWrapper.java | 4 + .../browser/settings/BraveAddNewsSources.java | 154 ------------------ .../settings/BraveNewsCategorySources.java | 4 +- .../settings/BraveNewsPreferences.java | 98 ++++++++++- .../java/res/layout/pref_edittext_dialog.xml | 44 +++++ .../java/res/xml/brave_news_preferences.xml | 9 +- .../android/strings/android_brave_strings.grd | 5 - 9 files changed, 154 insertions(+), 166 deletions(-) delete mode 100644 android/java/org/chromium/chrome/browser/settings/BraveAddNewsSources.java create mode 100644 android/java/res/layout/pref_edittext_dialog.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 4b116844c42..bb99f0e511b 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -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", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index f0ca515a7f0..ed8fad237c6 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -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", diff --git a/android/java/org/chromium/chrome/browser/brave_news/LinearLayoutManagerWrapper.java b/android/java/org/chromium/chrome/browser/brave_news/LinearLayoutManagerWrapper.java index 0e8fc4d3969..415a476714a 100644 --- a/android/java/org/chromium/chrome/browser/brave_news/LinearLayoutManagerWrapper.java +++ b/android/java/org/chromium/chrome/browser/brave_news/LinearLayoutManagerWrapper.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(); } } diff --git a/android/java/org/chromium/chrome/browser/settings/BraveAddNewsSources.java b/android/java/org/chromium/chrome/browser/settings/BraveAddNewsSources.java deleted file mode 100644 index 9b5794d7f64..00000000000 --- a/android/java/org/chromium/chrome/browser/settings/BraveAddNewsSources.java +++ /dev/null @@ -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 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 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 getPreferenceList(Preference p, ArrayList 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; - } -} diff --git a/android/java/org/chromium/chrome/browser/settings/BraveNewsCategorySources.java b/android/java/org/chromium/chrome/browser/settings/BraveNewsCategorySources.java index 3a2a08f5680..22468f47ccb 100644 --- a/android/java/org/chromium/chrome/browser/settings/BraveNewsCategorySources.java +++ b/android/java/org/chromium/chrome/browser/settings/BraveNewsCategorySources.java @@ -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); diff --git a/android/java/org/chromium/chrome/browser/settings/BraveNewsPreferences.java b/android/java/org/chromium/chrome/browser/settings/BraveNewsPreferences.java index 238c5420526..16753c8d567 100644 --- a/android/java/org/chromium/chrome/browser/settings/BraveNewsPreferences.java +++ b/android/java/org/chromium/chrome/browser/settings/BraveNewsPreferences.java @@ -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> 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 categoryPublishers = new ArrayList<>(); for (Map.Entry 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> publisherCategories) { for (Map.Entry> 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(); diff --git a/android/java/res/layout/pref_edittext_dialog.xml b/android/java/res/layout/pref_edittext_dialog.xml new file mode 100644 index 00000000000..83aad859c16 --- /dev/null +++ b/android/java/res/layout/pref_edittext_dialog.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + diff --git a/android/java/res/xml/brave_news_preferences.xml b/android/java/res/xml/brave_news_preferences.xml index 55dc99b61c3..7b8bda52e46 100644 --- a/android/java/res/xml/brave_news_preferences.xml +++ b/android/java/res/xml/brave_news_preferences.xml @@ -19,11 +19,16 @@ android:summaryOn="@string/brave_news_optin_subtitle" android:summaryOff="@string/brave_news_optin_subtitle" /> - + android:title="@string/news_your_sources_section"/> + Show Brave News - Default sources