mobile/android/base/prompts/IconGridInput.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 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
     2  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 package org.mozilla.gecko.prompts;
     8 import java.util.ArrayList;
     9 import java.util.List;
    11 import org.json.JSONArray;
    12 import org.json.JSONObject;
    13 import org.mozilla.gecko.GeckoAppShell;
    14 import org.mozilla.gecko.R;
    15 import org.mozilla.gecko.gfx.BitmapUtils;
    17 import android.content.Context;
    18 import android.graphics.drawable.Drawable;
    19 import android.text.TextUtils;
    20 import android.view.Display;
    21 import android.view.LayoutInflater;
    22 import android.view.View;
    23 import android.view.ViewGroup;
    24 import android.view.WindowManager;
    25 import android.widget.AdapterView;
    26 import android.widget.AdapterView.OnItemClickListener;
    27 import android.widget.ArrayAdapter;
    28 import android.widget.GridView;
    29 import android.widget.ImageView;
    30 import android.widget.TextView;
    32 public class IconGridInput extends PromptInput implements OnItemClickListener {
    33     public static final String INPUT_TYPE = "icongrid";
    34     public static final String LOGTAG = "GeckoIconGridInput";
    36     private ArrayAdapter<IconGridItem> mAdapter; // An adapter holding a list of items to show in the grid
    38     private static int mColumnWidth = -1;  // The maximum width of columns
    39     private static int mMaxColumns = -1;  // The maximum number of columns to show
    40     private static int mIconSize = -1;    // Size of icons in the grid
    41     private int mSelected = -1;           // Current selection
    42     private JSONArray mArray;
    44     public IconGridInput(JSONObject obj) {
    45         super(obj);
    46         mArray = obj.optJSONArray("items");
    47     }
    49     @Override
    50     public View getView(Context context) throws UnsupportedOperationException {
    51         if (mColumnWidth < 0) {
    52             // getColumnWidth isn't available on pre-ICS, so we pull it out and assign it here
    53             mColumnWidth = context.getResources().getDimensionPixelSize(R.dimen.icongrid_columnwidth);
    54         }
    56         if (mIconSize < 0) {
    57             mIconSize = GeckoAppShell.getPreferredIconSize();
    58         }
    60         if (mMaxColumns < 0) {
    61             mMaxColumns = context.getResources().getInteger(R.integer.max_icon_grid_columns);
    62         }
    64         // TODO: Dynamically handle size changes
    65         final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    66         final Display display = wm.getDefaultDisplay();
    67         final int screenWidth = display.getWidth();
    68         int maxColumns = Math.min(mMaxColumns, screenWidth / mColumnWidth);
    70         final GridView view = (GridView) LayoutInflater.from(context).inflate(R.layout.icon_grid, null, false);
    71         view.setColumnWidth(mColumnWidth);
    73         final ArrayList<IconGridItem> items = new ArrayList<IconGridItem>(mArray.length());
    74         for (int i = 0; i < mArray.length(); i++) {
    75             IconGridItem item = new IconGridItem(context, mArray.optJSONObject(i));
    76             items.add(item);
    77             if (item.selected) {
    78                 mSelected = i;
    79                 view.setSelection(i);
    80             }
    81         }
    83         view.setNumColumns(Math.min(items.size(), maxColumns));
    84         view.setOnItemClickListener(this);
    86         mAdapter = new IconGridAdapter(context, -1, items);
    87         view.setAdapter(mAdapter);
    88         mView = view;
    89         return mView;
    90     }
    92     @Override
    93     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    94         mSelected = position;
    95         notifyListeners(Integer.toString(position));
    96     }
    98     @Override
    99     public Object getValue() {
   100         return new Integer(mSelected);
   101     }
   103     @Override
   104     public boolean getScrollable() {
   105         return true;
   106     }
   108     private class IconGridAdapter extends ArrayAdapter<IconGridItem> {
   109         public IconGridAdapter(Context context, int resource, List<IconGridItem> items) {
   110             super(context, resource, items);
   111         }
   113         @Override
   114         public View getView(int position, View convert, ViewGroup parent) {
   115             final Context context = parent.getContext();
   116             if (convert == null) {
   117                 convert = LayoutInflater.from(context).inflate(R.layout.icon_grid_item, parent, false);
   118             }
   119             bindView(convert, context, position);
   120             return convert;
   121         }
   123         private void bindView(View v, Context c, int position) {
   124             final IconGridItem item = getItem(position);
   125             final TextView text1 = (TextView) v.findViewById(android.R.id.text1);
   126             text1.setText(item.label);
   128             final TextView text2 = (TextView) v.findViewById(android.R.id.text2);
   129             if (TextUtils.isEmpty(item.description)) {
   130                 text2.setVisibility(View.GONE);
   131             } else {
   132                 text2.setVisibility(View.VISIBLE);
   133                 text2.setText(item.description);
   134             }
   136             final ImageView icon = (ImageView) v.findViewById(R.id.icon);
   137             icon.setImageDrawable(item.icon);
   138             ViewGroup.LayoutParams lp = icon.getLayoutParams();
   139             lp.width = lp.height = mIconSize;
   140         }
   141     }
   143     private class IconGridItem {
   144         final String label;
   145         final String description;
   146         final boolean selected;
   147         Drawable icon;
   149         public IconGridItem(final Context context, final JSONObject obj) {
   150             label = obj.optString("name");
   151             final String iconUrl = obj.optString("iconUri");
   152             description = obj.optString("description");
   153             selected = obj.optBoolean("selected");
   155             BitmapUtils.getDrawable(context, iconUrl, new BitmapUtils.BitmapLoader() {
   156                 public void onBitmapFound(Drawable d) {
   157                     icon = d;
   158                     if (mAdapter != null) {
   159                         mAdapter.notifyDataSetChanged();
   160                     }
   161                 }
   162             });
   163         }
   164     }
   165 }

mercurial