Skip to content

Commit

Permalink
Store persistent Read Aloud settings in profile prefs
Browse files Browse the repository at this point in the history
The stored voice list, speed, and highlighting settings will be fully
hooked up with their respective features later.

Bug: b/304332488
Change-Id: I06fa9b3f9a7bb4892c8b8fcc3fb7478c234884f7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4981473
Reviewed-by: Basia Zimirska <basiaz@google.com>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Commit-Queue: Ian Wells <iwells@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1217117}
  • Loading branch information
Ian Wells authored and Chromium LUCI CQ committed Oct 30, 2023
1 parent 5b40866 commit f485976
Show file tree
Hide file tree
Showing 11 changed files with 450 additions and 10 deletions.
1 change: 1 addition & 0 deletions chrome/android/modules/readaloud/public/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ android_library("java") {
"//chrome/browser/tab:java",
"//components/browser_ui/bottomsheet/android:java",
"//components/browser_ui/styles/android:java",
"//components/prefs/android:java",
"//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//ui/android:ui_no_recycler_view_java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.chrome.modules.readaloud.PlaybackArgs.PlaybackVoice;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.prefs.PrefService;

import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -44,6 +45,9 @@ interface Delegate {

/** Returns the Activity in which the player UI should live. */
Activity getActivity();

/** Returns the current profile's PrefService. */
PrefService getPrefService();
}

/** Observer interface to provide updates about player UI. */
Expand Down
21 changes: 21 additions & 0 deletions chrome/browser/readaloud/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import("//build/config/android/rules.gni")
android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java",
"java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefs.java",
"java/src/org/chromium/chrome/browser/readaloud/ReadAloudToolbarButtonController.java",
]
deps = [
Expand All @@ -27,6 +28,8 @@ android_library("java") {
"//components/browser_ui/bottomsheet/android:java",
"//components/embedder_support/android:util_java",
"//components/feature_engagement/public:public_java",
"//components/prefs/android:java",
"//components/user_prefs/android:java",
"//content/public/android:content_java",
"//third_party/android_deps:guava_android_java",
"//third_party/androidx:androidx_annotation_annotation_java",
Expand Down Expand Up @@ -109,10 +112,20 @@ android_library("hooks_public_impl_java") {
]
}

android_library("test_support_java") {
testonly = true
sources = [ "java/src/org/chromium/chrome/browser/readaloud/testing/MockPrefServiceHelper.java" ]
deps = [
"//components/prefs/android:java",
"//third_party/mockito:mockito_java",
]
}

robolectric_library("junit") {
testonly = true
sources = [
"java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java",
"java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefsUnitTest.java",
"java/src/org/chromium/chrome/browser/readaloud/ReadAloudToolbarButtonControllerUnitTest.java",
]
deps = [
Expand All @@ -121,6 +134,7 @@ robolectric_library("junit") {
":java_resources",
":player_java",
":player_junit_java",
":test_support_java",
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
Expand All @@ -137,6 +151,7 @@ robolectric_library("junit") {
"//chrome/test/android:chrome_java_unit_test_support",
"//components/browser_ui/bottomsheet/android:java",
"//components/feature_engagement/public:public_java",
"//components/prefs/android:java",
"//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_appcompat_appcompat_java",
Expand Down Expand Up @@ -177,9 +192,11 @@ android_library("player_java") {
"//base:base_java",
"//chrome/android:chrome_app_java_resources",
"//chrome/android/modules/readaloud/public:java",
"//chrome/browser/readaloud/android:java",
"//chrome/browser/readaloud/android/resources:ui_strings_grd",
"//components/browser_ui/bottomsheet/android:java",
"//components/browser_ui/styles/android:java",
"//components/prefs/android:java",
"//third_party/android_deps:material_design_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_appcompat_appcompat_java",
Expand Down Expand Up @@ -207,12 +224,16 @@ robolectric_library("player_junit_java") {
]
deps = [
":player_java",
":test_support_java",
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
"//chrome/android/modules/readaloud/public:java",
"//chrome/browser/preferences:java",
"//chrome/browser/readaloud/android:java",
"//chrome/browser/tab:java",
"//components/browser_ui/bottomsheet/android:java",
"//components/prefs/android:java",
"//third_party/androidx:androidx_appcompat_appcompat_java",
"//third_party/androidx:androidx_interpolator_interpolator_java",
"//third_party/androidx:androidx_test_core_java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import org.chromium.chrome.modules.readaloud.contentjs.Highlighter;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.prefs.PrefService;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.GlobalRenderFrameHostId;
import org.chromium.url.GURL;

Expand Down Expand Up @@ -234,9 +236,13 @@ public void playTab(Tab tab) {
mPlayback = null;
}

PlaybackArgs args = new PlaybackArgs(tab.getUrl().getSpec(),
TranslateBridge.getCurrentLanguage(tab),
/* voice=*/null, /* dateModifiedMsSinceEpock=*/0);
// TODO Create voice list from settings.
PlaybackArgs args =
new PlaybackArgs(
tab.getUrl().getSpec(),
TranslateBridge.getCurrentLanguage(tab),
/* voice= */ null,
/* dateModifiedMsSinceEpock= */ 0);
mPlaybackHooks.createPlayback(args, mPlaybackCallback);

// Notify player UI that playback is happening soon.
Expand Down Expand Up @@ -393,6 +399,11 @@ public Activity getActivity() {
return mActivity;
}

@Override
public PrefService getPrefService() {
return UserPrefs.get(mProfileSupplier.get());
}

// Player.Observer
@Override
public void onRequestClosePlayers() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.readaloud;

import org.json.JSONException;
import org.json.JSONObject;

import org.chromium.base.Log;
import org.chromium.components.prefs.PrefService;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/** Methods for storing and retrieving Read Aloud user settings in prefs. */
public class ReadAloudPrefs {
private static final String TAG = "ReadAloudSettings";

private static final String PREF_PATH_PREFIX = "readaloud";
private static final String VOICES_PATH = PREF_PATH_PREFIX + ".voices";
private static final String SPEED_PATH = PREF_PATH_PREFIX + ".speed";
private static final String HIGHLIGHTING_ENABLED_PATH =
PREF_PATH_PREFIX + ".highlighting_enabled";

private static final float DEFAULT_SPEED = 1f;
private static final boolean DEFAULT_HIGHLIGHTING_ENABLED = true;

private static JSONObject sVoices;

/**
* Get the language-to-voiceId map.
*
* @param prefs PrefService for profile.
* @return Read-only voice map. Voice settings should be updated with setVoice() instead.
*/
public static Map<String, String> getVoices(PrefService prefs) {
ensureVoicesInit(prefs);
var languageToVoice = new HashMap<String, String>();
sVoices.keys()
.forEachRemaining(
(language) -> languageToVoice.put(language, sVoices.optString(language)));

return Collections.unmodifiableMap(languageToVoice);
}

/**
* Store the voice ID to use for the given language.
*
* @param prefs PrefService for profile.
* @param language Language code.
* @param voiceId ID of the voice to use for this language.
*/
public static void setVoice(PrefService prefs, String language, String voiceId) {
if (language == null || language.isEmpty() || voiceId == null || voiceId.isEmpty()) {
return;
}

ensureVoicesInit(prefs);
try {
sVoices.put(language, voiceId);
prefs.setString(VOICES_PATH, sVoices.toString());
} catch (JSONException exception) {
Log.e(TAG, "Failed to store voice setting: %s", exception.getMessage());
}
}

/**
* Get the playback speed setting.
*
* @param prefs PrefService for profile.
* @return Playback speed setting.
*/
public static float getSpeed(PrefService prefs) {
float speed = DEFAULT_SPEED;
if (prefs.hasPrefPath(SPEED_PATH)) {
try {
speed = Float.parseFloat(prefs.getString(SPEED_PATH));
} catch (NumberFormatException exception) {
Log.e(
TAG,
"Failed to parse speed setting, using default. Details: %s",
exception.getMessage());
}
}
return speed;
}

/**
* Set the playback speed setting.
*
* @param prefs PrefService for profile.
* @param speed Playback speed to store.
*/
public static void setSpeed(PrefService prefs, float speed) {
prefs.setString(SPEED_PATH, Float.toString(speed));
}

/**
* Get the highlighting enabled setting.
*
* @param prefs PrefService for profile.
* @return Highlighting enabled setting.
*/
public static boolean isHighlightingEnabled(PrefService prefs) {
return prefs.hasPrefPath(HIGHLIGHTING_ENABLED_PATH)
? prefs.getBoolean(HIGHLIGHTING_ENABLED_PATH)
: DEFAULT_HIGHLIGHTING_ENABLED;
}

/**
* Set the highlighting enabled setting.
*
* @param prefs PrefService for profile.
* @param enabled True if highlighting should happen if available, false otherwise.
*/
public static void setHighlightingEnabled(PrefService prefs, boolean enabled) {
prefs.setBoolean(HIGHLIGHTING_ENABLED_PATH, enabled);
}

private static void ensureVoicesInit(PrefService prefs) {
if (sVoices != null) {
return;
}

sVoices = new JSONObject();

if (prefs.hasPrefPath(VOICES_PATH)) {
try {
sVoices = new JSONObject(prefs.getString(VOICES_PATH));
} catch (JSONException exception) {
Log.e(
TAG,
"Failed to parse voice settings, using defaults. Details: %s",
exception.getMessage());
}
}
}

static void resetForTesting() {
sVoices = null;
}
}

0 comments on commit f485976

Please sign in to comment.