Commit 7495e2b6 authored by Clemens Arbesser's avatar Clemens Arbesser Committed by Commit Bot

[Autofill Assistant] Moved overlay color parsing logic to native.

There are two benefits: First, we want to move all logic from Java to native anyway. Second, we are about to add more colors to the overlay (see bug), which exacerbates the problem.

This is a refactoring and does not contain any user-facing changes.

Bug: b/143452916
Change-Id: Ic418ce6993c1cbfd60746fa6df7f9ec493afdba3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1881560
Commit-Queue: Clemens Arbesser <arbesser@google.com>
Reviewed-by: default avatarMathias Carlen <mcarlen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#710319}
parent 82a9a58d
...@@ -87,41 +87,60 @@ public class AssistantOverlayModel extends PropertyModel { ...@@ -87,41 +87,60 @@ public class AssistantOverlayModel extends PropertyModel {
} }
@CalledByNative @CalledByNative
private boolean setBackgroundColor(String colorString) { private void setBackgroundColor(@ColorInt int color) {
return setColor(BACKGROUND_COLOR, colorString); set(BACKGROUND_COLOR, color);
} }
@CalledByNative @CalledByNative
private boolean setHighlightBorderColor(String colorString) { private void clearBackgroundColor() {
return setColor(HIGHLIGHT_BORDER_COLOR, colorString); set(BACKGROUND_COLOR, null);
} }
@CalledByNative @CalledByNative
private void setTapTracking(int count, long durationMs) { private void setHighlightBorderColor(@ColorInt int color) {
set(TAP_TRACKING_COUNT, count); set(HIGHLIGHT_BORDER_COLOR, color);
set(TAP_TRACKING_DURATION_MS, durationMs); }
@CalledByNative
private void clearHighlightBorderColor() {
set(HIGHLIGHT_BORDER_COLOR, null);
} }
/** /**
* Sets the given color property. * Parses {@code colorString} and returns the corresponding color integer. This is only safe to
* * call for valid strings, which should be checked with {@code isValidColorString} before
* @param property property to set * calling this method!
* @param colorString color value as a property. The empty string means use the default color * @return the 32-bit integer representation of {@code colorString} or an unspecified fallback
* @return true if the color string was parsed and set properly * value if {@code colorString} is not a valid color string.
*/ */
private boolean setColor(WritableObjectPropertyKey<Integer> property, String colorString) { @CalledByNative
private static @ColorInt int parseColorString(String colorString) {
if (!isValidColorString(colorString)) {
return Color.BLACK;
}
return Color.parseColor(colorString);
}
/**
* Returns whether {@code colorString} is a valid string representation of a color. Supported
* color formats are #RRGGBB and #AARRGGBB.
*/
@CalledByNative
private static boolean isValidColorString(String colorString) {
if (colorString.isEmpty()) { if (colorString.isEmpty()) {
set(property, null); return false;
return true;
} }
@ColorInt
int colorInt;
try { try {
set(property, Color.parseColor(colorString)); Color.parseColor(colorString);
return true; return true;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
set(property, null);
return false; return false;
} }
} }
@CalledByNative
private void setTapTracking(int count, long durationMs) {
set(TAP_TRACKING_COUNT, count);
set(TAP_TRACKING_DURATION_MS, durationMs);
}
} }
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/metrics/field_trial_params.h" #include "base/metrics/field_trial_params.h"
#include "base/optional.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/android/features/autofill_assistant/jni_headers/AssistantCollectUserDataModel_jni.h" #include "chrome/android/features/autofill_assistant/jni_headers/AssistantCollectUserDataModel_jni.h"
...@@ -78,6 +79,22 @@ base::android::ScopedJavaLocalRef<jobject> CreateJavaDateTime( ...@@ -78,6 +79,22 @@ base::android::ScopedJavaLocalRef<jobject> CreateJavaDateTime(
proto.time().hour(), proto.time().minute(), proto.time().second()); proto.time().hour(), proto.time().minute(), proto.time().second());
} }
// Returns a 32-bit integer representing |color_string| in Java. Uses
// base::Optional to distinguish between valid and invalid colors.
base::Optional<int> CreateJavaColor(JNIEnv* env,
const std::string& color_string) {
if (!Java_AssistantOverlayModel_isValidColorString(
env, base::android::ConvertUTF8ToJavaString(env, color_string))) {
if (!color_string.empty()) {
DVLOG(1) << "Encountered invalid color string: " << color_string;
}
return base::Optional<int>();
}
return Java_AssistantOverlayModel_parseColorString(
env, base::android::ConvertUTF8ToJavaString(env, color_string));
}
// Creates the java equivalent to the text inputs specified in |section|. // Creates the java equivalent to the text inputs specified in |section|.
base::android::ScopedJavaLocalRef<jobject> CreateJavaTextInputsForSection( base::android::ScopedJavaLocalRef<jobject> CreateJavaTextInputsForSection(
JNIEnv* env, JNIEnv* env,
...@@ -381,18 +398,21 @@ void UiControllerAndroid::OnOverlayColorsChanged( ...@@ -381,18 +398,21 @@ void UiControllerAndroid::OnOverlayColorsChanged(
const UiDelegate::OverlayColors& colors) { const UiDelegate::OverlayColors& colors) {
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
auto overlay_model = GetOverlayModel(); auto overlay_model = GetOverlayModel();
if (!Java_AssistantOverlayModel_setBackgroundColor(
env, overlay_model, auto background_color = CreateJavaColor(env, colors.background);
base::android::ConvertUTF8ToJavaString(env, colors.background))) { if (background_color.has_value()) {
DVLOG(1) << __func__ Java_AssistantOverlayModel_setBackgroundColor(env, overlay_model,
<< ": Ignoring invalid overlay color: " << colors.background; *background_color);
} else {
Java_AssistantOverlayModel_clearBackgroundColor(env, overlay_model);
} }
if (!Java_AssistantOverlayModel_setHighlightBorderColor(
env, overlay_model, auto highlight_border_color = CreateJavaColor(env, colors.highlight_border);
base::android::ConvertUTF8ToJavaString(env, if (highlight_border_color.has_value()) {
colors.highlight_border))) { Java_AssistantOverlayModel_setHighlightBorderColor(env, overlay_model,
DVLOG(1) << __func__ << ": Ignoring invalid highlight border color: " *highlight_border_color);
<< colors.highlight_border; } else {
Java_AssistantOverlayModel_clearHighlightBorderColor(env, overlay_model);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment