Home | History | Annotate | Download | only in editor
      1 /*
      2  * Copyright 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.notificationstudio.editor;
     18 
     19 import android.content.res.Resources;
     20 import android.view.MotionEvent;
     21 import android.view.SoundEffectConstants;
     22 import android.view.View;
     23 import android.view.View.OnTouchListener;
     24 import android.view.ViewGroup;
     25 import android.widget.FrameLayout;
     26 import android.widget.HorizontalScrollView;
     27 import android.widget.ImageView;
     28 import android.widget.ImageView.ScaleType;
     29 import android.widget.LinearLayout;
     30 
     31 import com.android.notificationstudio.R;
     32 import com.android.notificationstudio.editor.Editors.Editor;
     33 import com.android.notificationstudio.model.EditableItem;
     34 
     35 public class IconEditor implements Editor {
     36 
     37     public Runnable bindEditor(View v, final EditableItem item, final Runnable afterChange) {
     38         final LinearLayout iconEditor = (LinearLayout) v.findViewById(R.id.icon_editor_layout);
     39         final HorizontalScrollView scroller =
     40                 (HorizontalScrollView) v.findViewById(R.id.icon_editor_scroller);
     41         scroller.setVisibility(View.VISIBLE);
     42 
     43         final Object[] displayValues = getAvailableValuesForDisplay(item);
     44         final Runnable updateSelection = new Runnable() {
     45             public void run() {
     46                 for (int i=0;i<iconEditor.getChildCount();i++) {
     47                     View imageViewHolder = iconEditor.getChildAt(i);
     48                     Object iconResId = imageViewHolder.getTag();
     49                     boolean selected = item.hasValue() && item.getValue().equals(iconResId) ||
     50                             !item.hasValue() && iconResId == null;
     51                     imageViewHolder.setSelected(selected);
     52                     if (selected) {
     53                         int x = imageViewHolder.getLeft();
     54                         if (x < scroller.getScrollX() ||
     55                             x > scroller.getScrollX() + scroller.getWidth()) {
     56                             scroller.scrollTo(imageViewHolder.getLeft(), 0);
     57                         }
     58                     }
     59                 }
     60             }};
     61 
     62         int iconSize = getIconSize(v.getResources());
     63         int outerMargin = v.getResources().getDimensionPixelSize(R.dimen.editor_icon_outer_margin);
     64         int innerMargin = v.getResources().getDimensionPixelSize(R.dimen.editor_icon_inner_margin);
     65 
     66         for (final Object iconResId : displayValues) {
     67             final FrameLayout imageViewHolder = new FrameLayout(v.getContext());
     68             imageViewHolder.setTag(iconResId);
     69             final ImageView imageView = new ImageView(v.getContext());
     70             imageView.setScaleType(ScaleType.CENTER);
     71             imageView.setOnTouchListener(new OnTouchListener(){
     72                 public boolean onTouch(View v, MotionEvent event) {
     73                     if (event.getAction() == MotionEvent.ACTION_UP) {
     74                         v.playSoundEffect(SoundEffectConstants.CLICK);
     75                         item.setValue(iconResId);
     76                         updateSelection.run();
     77                         afterChange.run();
     78                     }
     79                     return true;
     80                 }});
     81 
     82             imageViewHolder.setBackgroundResource(R.drawable.icon_bg);
     83             if (iconResId != null)
     84                 setImage(imageView, iconResId);
     85 
     86             LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(iconSize, iconSize);
     87             lp.bottomMargin = lp.topMargin = lp.leftMargin = lp.rightMargin = outerMargin;
     88             imageViewHolder.setLayoutParams(lp);
     89 
     90             FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(
     91                     ViewGroup.LayoutParams.MATCH_PARENT,
     92                     ViewGroup.LayoutParams.MATCH_PARENT);
     93             flp.bottomMargin = flp.topMargin = flp.leftMargin = flp.rightMargin = innerMargin;
     94             imageView.setLayoutParams(flp);
     95 
     96             imageViewHolder.addView(imageView);
     97             iconEditor.addView(imageViewHolder);
     98         }
     99         updateSelection.run();
    100         return updateSelection;
    101     }
    102 
    103     protected int getIconSize(Resources res) {
    104         return res.getDimensionPixelSize(R.dimen.editor_icon_size_small);
    105     }
    106 
    107     protected void setImage(ImageView imageView, Object value) {
    108         imageView.setImageResource((Integer) value);
    109     }
    110 
    111     private Object[] getAvailableValuesForDisplay(EditableItem item) {
    112         Object[] avail = item.getAvailableValues();
    113         Object[] rt = new Object[avail.length + 1];
    114         System.arraycopy(avail, 0, rt, 1, avail.length);
    115         return rt;
    116     }
    117 
    118 }