mobile/android/base/preferences/PanelsPreference.java

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 package org.mozilla.gecko.preferences;
     7 import org.mozilla.gecko.animation.PropertyAnimator;
     8 import org.mozilla.gecko.animation.PropertyAnimator.Property;
     9 import org.mozilla.gecko.animation.ViewHelper;
    10 import org.mozilla.gecko.R;
    12 import android.app.AlertDialog;
    13 import android.app.Dialog;
    14 import android.content.Context;
    15 import android.content.DialogInterface;
    16 import android.content.DialogInterface.OnClickListener;
    17 import android.content.DialogInterface.OnShowListener;
    18 import android.content.res.Resources;
    19 import android.util.Log;
    20 import android.view.View;
    21 import android.view.ViewGroup;
    22 import android.widget.TextView;
    24 public class PanelsPreference extends CustomListPreference {
    25     protected String LOGTAG = "PanelsPreference";
    27     // Position state of this Preference in enclosing category.
    28     private static final int STATE_IS_FIRST = 0;
    29     private static final int STATE_IS_LAST = 1;
    31     /**
    32      * Index of the context menu button for controlling display options.
    33      * For (removable) Dynamic panels, this button removes the panel.
    34      * For built-in panels, this button toggles showing or hiding the panel.
    35      */
    36     private static final int INDEX_DISPLAY_BUTTON = 1;
    37     private static final int INDEX_REORDER_BUTTON = 2;
    39     // Indices of buttons in context menu for reordering.
    40     private static final int INDEX_MOVE_UP_BUTTON = 0;
    41     private static final int INDEX_MOVE_DOWN_BUTTON = 1;
    43     private String LABEL_HIDE;
    44     private String LABEL_SHOW;
    46     private View preferenceView;
    47     protected boolean mIsHidden = false;
    48     private boolean mIsRemovable;
    50     private boolean mAnimate;
    51     private static final int ANIMATION_DURATION_MS = 400;
    53     // State for reordering.
    54     private int mPositionState = -1;
    55     private final int mIndex;
    57     public PanelsPreference(Context context, CustomListCategory parentCategory, boolean isRemovable, int index, boolean animate) {
    58         super(context, parentCategory);
    59         mIsRemovable = isRemovable;
    60         mIndex = index;
    61         mAnimate = animate;
    62     }
    64     @Override
    65     protected int getPreferenceLayoutResource() {
    66         return R.layout.preference_panels;
    67     }
    69     @Override
    70     protected void onBindView(View view) {
    71         super.onBindView(view);
    73         // Override view handling so we can grey out "hidden" PanelPreferences.
    74         view.setEnabled(!mIsHidden);
    76         if (view instanceof ViewGroup) {
    77             final ViewGroup group = (ViewGroup) view;
    78             for (int i = 0; i < group.getChildCount(); i++) {
    79                 group.getChildAt(i).setEnabled(!mIsHidden);
    80             }
    81             preferenceView = group;
    82         }
    84         if (mAnimate) {
    85             ViewHelper.setAlpha(preferenceView, 0);
    87             final PropertyAnimator animator = new PropertyAnimator(ANIMATION_DURATION_MS);
    88             animator.attach(preferenceView, Property.ALPHA, 1);
    89             animator.start();
    91             // Clear animate flag.
    92             mAnimate = false;
    93         }
    94     }
    96     @Override
    97     protected String[] createDialogItems() {
    98         final Resources res = getContext().getResources();
    99         final String labelReorder = res.getString(R.string.pref_panels_reorder);
   101         if (mIsRemovable) {
   102             return new String[] { LABEL_SET_AS_DEFAULT, LABEL_REMOVE, labelReorder };
   103         }
   105         // Built-in panels can't be removed, so use show/hide options.
   106         LABEL_HIDE = res.getString(R.string.pref_panels_hide);
   107         LABEL_SHOW = res.getString(R.string.pref_panels_show);
   109         return new String[] { LABEL_SET_AS_DEFAULT, LABEL_HIDE, labelReorder };
   110     }
   112     @Override
   113     public void setIsDefault(boolean isDefault) {
   114         mIsDefault = isDefault;
   115         if (isDefault) {
   116             setSummary(LABEL_IS_DEFAULT);
   117             if (mIsHidden) {
   118                 // Unhide the panel if it's being set as the default.
   119                 setHidden(false);
   120             }
   121         } else {
   122             setSummary("");
   123         }
   124     }
   126     @Override
   127     protected void onDialogIndexClicked(int index) {
   128         switch(index) {
   129             case INDEX_SET_DEFAULT_BUTTON:
   130                 mParentCategory.setDefault(this);
   131                 break;
   133             case INDEX_DISPLAY_BUTTON:
   134                 // Handle display options for the panel.
   135                 if (mIsRemovable) {
   136                     // For removable panels, the button displays text for removing the panel.
   137                     mParentCategory.uninstall(this);
   138                 } else {
   139                     // Otherwise, the button toggles between text for showing or hiding the panel.
   140                     ((PanelsPreferenceCategory) mParentCategory).setHidden(this, !mIsHidden);
   141                 }
   142                 break;
   144             case INDEX_REORDER_BUTTON:
   145                 // Display dialog for changing preference order.
   146                 final Dialog orderDialog = makeReorderDialog();
   147                 orderDialog.show();
   148                 break;
   150             default:
   151                 Log.w(LOGTAG, "Selected index out of range: " + index);
   152         }
   153     }
   155     @Override
   156     protected void configureShownDialog() {
   157         super.configureShownDialog();
   159         // Handle Show/Hide buttons.
   160         if (!mIsRemovable) {
   161             final TextView hideButton = (TextView) mDialog.getListView().getChildAt(INDEX_DISPLAY_BUTTON);
   162             hideButton.setText(mIsHidden ? LABEL_SHOW : LABEL_HIDE);
   163         }
   164     }
   167     private Dialog makeReorderDialog() {
   168         final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
   170         final Resources res = getContext().getResources();
   171         final String labelUp = res.getString(R.string.pref_panels_move_up);
   172         final String labelDown = res.getString(R.string.pref_panels_move_down);
   174         builder.setTitle(getTitle());
   175         builder.setItems(new String[] { labelUp, labelDown }, new OnClickListener() {
   176             @Override
   177             public void onClick(DialogInterface dialog, int index) {
   178                 dialog.dismiss();
   179                 switch (index) {
   180                     case INDEX_MOVE_UP_BUTTON:
   181                         ((PanelsPreferenceCategory) mParentCategory).moveUp(PanelsPreference.this);
   182                         break;
   184                     case INDEX_MOVE_DOWN_BUTTON:
   185                         ((PanelsPreferenceCategory) mParentCategory).moveDown(PanelsPreference.this);
   186                         break;
   187                 }
   188             }
   189         });
   191         final Dialog dialog = builder.create();
   192         dialog.setOnShowListener(new OnShowListener() {
   193             @Override
   194             public void onShow(DialogInterface dialog) {
   195                setReorderItemsEnabled(dialog);
   196             }
   197         });
   199         return dialog;
   200     }
   202     public void setIsFirst() {
   203         mPositionState = STATE_IS_FIRST;
   204     }
   206     public void setIsLast() {
   207         mPositionState = STATE_IS_LAST;
   208     }
   210     /**
   211      * Configure enabled state of the reorder dialog, which must be done after the dialog is shown.
   212      * @param dialog Dialog to configure
   213      */
   214     private void setReorderItemsEnabled(DialogInterface dialog) {
   215         // Update button enabled-ness for reordering.
   216         switch (mPositionState) {
   217             case STATE_IS_FIRST:
   218                 final TextView itemUp = (TextView) ((AlertDialog) dialog).getListView().getChildAt(INDEX_MOVE_UP_BUTTON);
   219                 itemUp.setEnabled(false);
   220                 // Disable clicks to this view.
   221                 itemUp.setOnClickListener(null);
   222                 break;
   224             case STATE_IS_LAST:
   225                 final TextView itemDown = (TextView) ((AlertDialog) dialog).getListView().getChildAt(INDEX_MOVE_DOWN_BUTTON);
   226                 itemDown.setEnabled(false);
   227                 // Disable clicks to this view.
   228                 itemDown.setOnClickListener(null);
   229                 break;
   231             default:
   232                 // Do nothing.
   233                 break;
   234         }
   235     }
   237     public void setHidden(boolean toHide) {
   238         if (toHide) {
   239             setIsDefault(false);
   240         }
   242         if (mIsHidden != toHide) {
   243             mIsHidden = toHide;
   244             notifyChanged();
   245         }
   246     }
   248     public boolean isHidden() {
   249         return mIsHidden;
   250     }
   252     public int getIndex() {
   253         return mIndex;
   254     }
   255 }

mercurial