summaryrefslogtreecommitdiffstats
path: root/mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java')
-rw-r--r--mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java255
1 files changed, 255 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java b/mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java
new file mode 100644
index 000000000..337d9dd2f
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/PanelsPreference.java
@@ -0,0 +1,255 @@
+/* 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.mozilla.gecko.preferences;
+
+import org.mozilla.gecko.animation.PropertyAnimator;
+import org.mozilla.gecko.animation.PropertyAnimator.Property;
+import org.mozilla.gecko.animation.ViewHelper;
+import org.mozilla.gecko.R;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnShowListener;
+import android.content.res.Resources;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class PanelsPreference extends CustomListPreference {
+ protected String LOGTAG = "PanelsPreference";
+
+ // Position state of this Preference in enclosing category.
+ private static final int STATE_IS_FIRST = 0;
+ private static final int STATE_IS_LAST = 1;
+
+ /**
+ * Index of the context menu button for controlling display options.
+ * For (removable) Dynamic panels, this button removes the panel.
+ * For built-in panels, this button toggles showing or hiding the panel.
+ */
+ private static final int INDEX_DISPLAY_BUTTON = 1;
+ private static final int INDEX_REORDER_BUTTON = 2;
+
+ // Indices of buttons in context menu for reordering.
+ private static final int INDEX_MOVE_UP_BUTTON = 0;
+ private static final int INDEX_MOVE_DOWN_BUTTON = 1;
+
+ private String LABEL_HIDE;
+ private String LABEL_SHOW;
+
+ private View preferenceView;
+ protected boolean mIsHidden;
+ private final boolean mIsRemovable;
+
+ private boolean mAnimate;
+ private static final int ANIMATION_DURATION_MS = 400;
+
+ // State for reordering.
+ private int mPositionState = -1;
+ private final int mIndex;
+
+ public PanelsPreference(Context context, CustomListCategory parentCategory, boolean isRemovable, int index, boolean animate) {
+ super(context, parentCategory);
+ mIsRemovable = isRemovable;
+ mIndex = index;
+ mAnimate = animate;
+ }
+
+ @Override
+ protected int getPreferenceLayoutResource() {
+ return R.layout.preference_panels;
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+
+ // Override view handling so we can grey out "hidden" PanelPreferences.
+ view.setEnabled(!mIsHidden);
+
+ if (view instanceof ViewGroup) {
+ final ViewGroup group = (ViewGroup) view;
+ for (int i = 0; i < group.getChildCount(); i++) {
+ group.getChildAt(i).setEnabled(!mIsHidden);
+ }
+ preferenceView = group;
+ }
+
+ if (mAnimate) {
+ ViewHelper.setAlpha(preferenceView, 0);
+
+ final PropertyAnimator animator = new PropertyAnimator(ANIMATION_DURATION_MS);
+ animator.attach(preferenceView, Property.ALPHA, 1);
+ animator.start();
+
+ // Clear animate flag.
+ mAnimate = false;
+ }
+ }
+
+ @Override
+ protected String[] createDialogItems() {
+ final Resources res = getContext().getResources();
+ final String labelReorder = res.getString(R.string.pref_panels_reorder);
+
+ if (mIsRemovable) {
+ return new String[] { LABEL_SET_AS_DEFAULT, LABEL_REMOVE, labelReorder };
+ }
+
+ // Built-in panels can't be removed, so use show/hide options.
+ LABEL_HIDE = res.getString(R.string.pref_panels_hide);
+ LABEL_SHOW = res.getString(R.string.pref_panels_show);
+
+ return new String[] { LABEL_SET_AS_DEFAULT, LABEL_HIDE, labelReorder };
+ }
+
+ @Override
+ public void setIsDefault(boolean isDefault) {
+ mIsDefault = isDefault;
+ if (isDefault) {
+ setSummary(LABEL_IS_DEFAULT);
+ if (mIsHidden) {
+ // Unhide the panel if it's being set as the default.
+ setHidden(false);
+ }
+ } else {
+ setSummary("");
+ }
+ }
+
+ @Override
+ protected void onDialogIndexClicked(int index) {
+ switch (index) {
+ case INDEX_SET_DEFAULT_BUTTON:
+ mParentCategory.setDefault(this);
+ break;
+
+ case INDEX_DISPLAY_BUTTON:
+ // Handle display options for the panel.
+ if (mIsRemovable) {
+ // For removable panels, the button displays text for removing the panel.
+ mParentCategory.uninstall(this);
+ } else {
+ // Otherwise, the button toggles between text for showing or hiding the panel.
+ ((PanelsPreferenceCategory) mParentCategory).setHidden(this, !mIsHidden);
+ }
+ break;
+
+ case INDEX_REORDER_BUTTON:
+ // Display dialog for changing preference order.
+ final Dialog orderDialog = makeReorderDialog();
+ orderDialog.show();
+ break;
+
+ default:
+ Log.w(LOGTAG, "Selected index out of range: " + index);
+ }
+ }
+
+ @Override
+ protected void configureShownDialog() {
+ super.configureShownDialog();
+
+ // Handle Show/Hide buttons.
+ if (!mIsRemovable) {
+ final TextView hideButton = (TextView) mDialog.getListView().getChildAt(INDEX_DISPLAY_BUTTON);
+ hideButton.setText(mIsHidden ? LABEL_SHOW : LABEL_HIDE);
+ }
+ }
+
+
+ private Dialog makeReorderDialog() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+
+ final Resources res = getContext().getResources();
+ final String labelUp = res.getString(R.string.pref_panels_move_up);
+ final String labelDown = res.getString(R.string.pref_panels_move_down);
+
+ builder.setTitle(getTitle());
+ builder.setItems(new String[] { labelUp, labelDown }, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int index) {
+ dialog.dismiss();
+ switch (index) {
+ case INDEX_MOVE_UP_BUTTON:
+ ((PanelsPreferenceCategory) mParentCategory).moveUp(PanelsPreference.this);
+ break;
+
+ case INDEX_MOVE_DOWN_BUTTON:
+ ((PanelsPreferenceCategory) mParentCategory).moveDown(PanelsPreference.this);
+ break;
+ }
+ }
+ });
+
+ final Dialog dialog = builder.create();
+ dialog.setOnShowListener(new OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialog) {
+ setReorderItemsEnabled(dialog);
+ }
+ });
+
+ return dialog;
+ }
+
+ public void setIsFirst() {
+ mPositionState = STATE_IS_FIRST;
+ }
+
+ public void setIsLast() {
+ mPositionState = STATE_IS_LAST;
+ }
+
+ /**
+ * Configure enabled state of the reorder dialog, which must be done after the dialog is shown.
+ * @param dialog Dialog to configure
+ */
+ private void setReorderItemsEnabled(DialogInterface dialog) {
+ // Update button enabled-ness for reordering.
+ switch (mPositionState) {
+ case STATE_IS_FIRST:
+ final TextView itemUp = (TextView) ((AlertDialog) dialog).getListView().getChildAt(INDEX_MOVE_UP_BUTTON);
+ itemUp.setEnabled(false);
+ // Disable clicks to this view.
+ itemUp.setOnClickListener(null);
+ break;
+
+ case STATE_IS_LAST:
+ final TextView itemDown = (TextView) ((AlertDialog) dialog).getListView().getChildAt(INDEX_MOVE_DOWN_BUTTON);
+ itemDown.setEnabled(false);
+ // Disable clicks to this view.
+ itemDown.setOnClickListener(null);
+ break;
+
+ default:
+ // Do nothing.
+ break;
+ }
+ }
+
+ public void setHidden(boolean toHide) {
+ if (toHide) {
+ setIsDefault(false);
+ }
+
+ if (mIsHidden != toHide) {
+ mIsHidden = toHide;
+ notifyChanged();
+ }
+ }
+
+ public boolean isHidden() {
+ return mIsHidden;
+ }
+
+ public int getIndex() {
+ return mIndex;
+ }
+}