Commit 86244992 authored by Nate Fischer's avatar Nate Fischer Committed by Commit Bot

AW: add "reset all" button to flags UI

No change to production behavior.

This adds a "reset all to default" button for the flags UI. This button
updates the visual appearance of the Spinners and sends the new (empty)
flag override state to the service (which then stops itself).

Fixed: 1026381
Test: Manual - verify the button resets spinners and the services stops
Change-Id: Ia3324653471a43d24ed1cd269ddf717af0a89c57
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1925596
Commit-Queue: Nate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#718373}
parent 83c95a58
......@@ -32,10 +32,18 @@
android:paddingTop="5dp"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!--suppress HardcodedText -->
<Button
android:text="Reset all to default"
android:id="@+id/reset_flags_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<ListView
android:id="@+id/flags_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="25dp"/>
android:layout_marginTop="5dp"/>
</LinearLayout>
......@@ -20,6 +20,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
......@@ -31,9 +32,7 @@ import org.chromium.android_webview.common.services.ServiceNames;
import org.chromium.android_webview.devui.util.NavigationMenuHelper;
import org.chromium.base.Log;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
......@@ -43,8 +42,6 @@ import java.util.Map;
public class FlagsActivity extends Activity {
private static final String TAG = "WebViewDevTools";
private final Map<String, Boolean> mOverriddenFlags = new HashMap<>();
private static final String STATE_DEFAULT = "Default";
private static final String STATE_ENABLED = "Enabled";
private static final String STATE_DISABLED = "Disabled";
......@@ -55,6 +52,8 @@ public class FlagsActivity extends Activity {
};
private WebViewPackageError mDifferentPackageError;
private final Map<String, Boolean> mOverriddenFlags = new HashMap<>();
private FlagsListAdapter mListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -68,8 +67,11 @@ public class FlagsActivity extends Activity {
+ "lose app data or compromise your security or privacy. Enabled features apply to "
+ "WebViews across all apps on the device.");
List<Flag> flagsList = Arrays.asList(ProductionSupportedFlagList.sFlagList);
flagsListView.setAdapter(new FlagsListAdapter(flagsList));
mListAdapter = new FlagsListAdapter();
flagsListView.setAdapter(mListAdapter);
Button resetFlagsButton = findViewById(R.id.reset_flags_button);
resetFlagsButton.setOnClickListener((View view) -> { resetAllFlags(); });
mDifferentPackageError =
new WebViewPackageError(this, findViewById(R.id.flags_activity_layout));
......@@ -90,6 +92,15 @@ public class FlagsActivity extends Activity {
mDifferentPackageError.showMessageIfDifferent();
}
private static int booleanToState(Boolean b) {
if (b == null) {
return /* STATE_DEFAULT */ 0;
} else if (b) {
return /* STATE_ENABLED */ 1;
}
return /* STATE_DISABLED */ 2;
}
private class FlagStateSpinnerSelectedListener implements AdapterView.OnItemSelectedListener {
private Flag mFlag;
......@@ -99,19 +110,28 @@ public class FlagsActivity extends Activity {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String flagName = mFlag.getName();
int oldState = booleanToState(mOverriddenFlags.get(flagName));
switch (sFlagStates[position]) {
case STATE_DEFAULT:
mOverriddenFlags.remove(mFlag.getName());
mOverriddenFlags.remove(flagName);
break;
case STATE_ENABLED:
mOverriddenFlags.put(mFlag.getName(), true);
mOverriddenFlags.put(flagName, true);
break;
case STATE_DISABLED:
mOverriddenFlags.put(mFlag.getName(), false);
mOverriddenFlags.put(flagName, false);
break;
}
sendFlagsToService();
// Only communicate with the service if the map actually updated. This optimizes the
// number of IPCs we make, but this also allows for atomic batch updates by updating
// mOverriddenFlags prior to updating the Spinner state.
int newState = booleanToState(mOverriddenFlags.get(flagName));
if (oldState != newState) {
sendFlagsToService();
}
}
@Override
......@@ -122,11 +142,9 @@ public class FlagsActivity extends Activity {
* Adapter to create rows of toggleable Flags.
*/
private class FlagsListAdapter extends ArrayAdapter<Flag> {
private final List<Flag> mFlagsList;
public FlagsListAdapter(List<Flag> flagsList) {
super(FlagsActivity.this, R.layout.toggleable_flag, flagsList);
mFlagsList = flagsList;
public FlagsListAdapter() {
super(FlagsActivity.this, R.layout.toggleable_flag,
ProductionSupportedFlagList.sFlagList);
}
@Override
......@@ -148,6 +166,10 @@ public class FlagsActivity extends Activity {
new ArrayAdapter<>(FlagsActivity.this, R.layout.flag_states, sFlagStates);
adapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice);
flagToggle.setAdapter(adapter);
// Populate spinner state from map.
int state = booleanToState(mOverriddenFlags.get(flag.getName()));
flagToggle.setSelection(state);
flagToggle.setOnItemSelectedListener(new FlagStateSpinnerSelectedListener(flag));
return view;
......@@ -210,4 +232,11 @@ public class FlagsActivity extends Activity {
this.getPackageManager().setComponentEnabledSetting(developerModeService,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
private void resetAllFlags() {
// Clear the map, then update the Spinners from the map value.
mOverriddenFlags.clear();
mListAdapter.notifyDataSetChanged();
sendFlagsToService();
}
}
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