Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2010 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.camera.ui;
     18 
     19 import android.content.Context;
     20 import android.util.AttributeSet;
     21 import android.util.Log;
     22 import android.view.View;
     23 import android.widget.AdapterView;
     24 import android.widget.GridView;
     25 import android.widget.SimpleAdapter;
     26 
     27 import com.android.camera.IconListPreference;
     28 import com.android.camera.R;
     29 
     30 import java.util.ArrayList;
     31 import java.util.HashMap;
     32 
     33 // A popup window that shows video effect setting. It has two grid view.
     34 // One shows the goofy face effects. The other shows the background replacer
     35 // effects.
     36 public class EffectSettingPopup extends AbstractSettingPopup implements
     37         AdapterView.OnItemClickListener, View.OnClickListener {
     38     private static final String TAG = "EffectSettingPopup";
     39     private String mNoEffect;
     40     private IconListPreference mPreference;
     41     private Listener mListener;
     42     private View mClearEffects;
     43     private GridView mSillyFacesGrid;
     44     private GridView mBackgroundGrid;
     45 
     46     // Data for silly face items. (text, image, and preference value)
     47     ArrayList<HashMap<String, Object>> mSillyFacesItem =
     48             new ArrayList<HashMap<String, Object>>();
     49 
     50     // Data for background replacer items. (text, image, and preference value)
     51     ArrayList<HashMap<String, Object>> mBackgroundItem =
     52             new ArrayList<HashMap<String, Object>>();
     53 
     54 
     55     static public interface Listener {
     56         public void onSettingChanged();
     57     }
     58 
     59     public EffectSettingPopup(Context context, AttributeSet attrs) {
     60         super(context, attrs);
     61         mNoEffect = context.getString(R.string.pref_video_effect_default);
     62     }
     63 
     64     @Override
     65     protected void onFinishInflate() {
     66         super.onFinishInflate();
     67         mClearEffects = findViewById(R.id.clear_effects);
     68         mClearEffects.setOnClickListener(this);
     69         mSillyFacesGrid = (GridView) findViewById(R.id.effect_silly_faces);
     70         mBackgroundGrid = (GridView) findViewById(R.id.effect_background);
     71     }
     72 
     73     public void initialize(IconListPreference preference) {
     74         mPreference = preference;
     75         Context context = getContext();
     76         CharSequence[] entries = mPreference.getEntries();
     77         CharSequence[] entryValues = mPreference.getEntryValues();
     78         int[] iconIds = mPreference.getImageIds();
     79         if (iconIds == null) {
     80             iconIds = mPreference.getLargeIconIds();
     81         }
     82 
     83         // Set title.
     84         mTitle.setText(mPreference.getTitle());
     85 
     86         for(int i = 0; i < entries.length; ++i) {
     87             String value = entryValues[i].toString();
     88             if (value.equals(mNoEffect)) continue;  // no effect, skip it.
     89             HashMap<String, Object> map = new HashMap<String, Object>();
     90             map.put("value", value);
     91             map.put("text", entries[i].toString());
     92             if (iconIds != null) map.put("image", iconIds[i]);
     93             if (value.startsWith("goofy_face")) {
     94                 mSillyFacesItem.add(map);
     95             } else if (value.startsWith("backdropper")) {
     96                 mBackgroundItem.add(map);
     97             }
     98         }
     99 
    100         boolean hasSillyFaces = mSillyFacesItem.size() > 0;
    101         boolean hasBackground = mBackgroundItem.size() > 0;
    102 
    103         // Initialize goofy face if it is supported.
    104         if (hasSillyFaces) {
    105             findViewById(R.id.effect_silly_faces_title).setVisibility(View.VISIBLE);
    106             findViewById(R.id.effect_silly_faces_title_separator).setVisibility(View.VISIBLE);
    107             mSillyFacesGrid.setVisibility(View.VISIBLE);
    108             SimpleAdapter sillyFacesItemAdapter = new SimpleAdapter(context,
    109                     mSillyFacesItem, R.layout.effect_setting_item,
    110                     new String[] {"text", "image"},
    111                     new int[] {R.id.text, R.id.image});
    112             mSillyFacesGrid.setAdapter(sillyFacesItemAdapter);
    113             mSillyFacesGrid.setOnItemClickListener(this);
    114         }
    115 
    116         if (hasSillyFaces && hasBackground) {
    117             findViewById(R.id.effect_background_separator).setVisibility(View.VISIBLE);
    118         }
    119 
    120         // Initialize background replacer if it is supported.
    121         if (hasBackground) {
    122             findViewById(R.id.effect_background_title).setVisibility(View.VISIBLE);
    123             findViewById(R.id.effect_background_title_separator).setVisibility(View.VISIBLE);
    124             mBackgroundGrid.setVisibility(View.VISIBLE);
    125             SimpleAdapter backgroundItemAdapter = new SimpleAdapter(context,
    126                     mBackgroundItem, R.layout.effect_setting_item,
    127                     new String[] {"text", "image"},
    128                     new int[] {R.id.text, R.id.image});
    129             mBackgroundGrid.setAdapter(backgroundItemAdapter);
    130             mBackgroundGrid.setOnItemClickListener(this);
    131         }
    132 
    133         reloadPreference();
    134     }
    135 
    136     @Override
    137     public void setVisibility(int visibility) {
    138         if (visibility == View.VISIBLE) {
    139             if (getVisibility() != View.VISIBLE) {
    140                 // Do not show or hide "Clear effects" button when the popup
    141                 // is already visible. Otherwise it looks strange.
    142                 boolean noEffect = mPreference.getValue().equals(mNoEffect);
    143                 mClearEffects.setVisibility(noEffect ? View.GONE : View.VISIBLE);
    144             }
    145             reloadPreference();
    146         }
    147         super.setVisibility(visibility);
    148     }
    149 
    150     // The value of the preference may have changed. Update the UI.
    151     @Override
    152     public void reloadPreference() {
    153         mBackgroundGrid.setItemChecked(mBackgroundGrid.getCheckedItemPosition(), false);
    154         mSillyFacesGrid.setItemChecked(mSillyFacesGrid.getCheckedItemPosition(), false);
    155 
    156         String value = mPreference.getValue();
    157         if (value.equals(mNoEffect)) return;
    158 
    159         for (int i = 0; i < mSillyFacesItem.size(); i++) {
    160             if (value.equals(mSillyFacesItem.get(i).get("value"))) {
    161                 mSillyFacesGrid.setItemChecked(i, true);
    162                 return;
    163             }
    164         }
    165 
    166         for (int i = 0; i < mBackgroundItem.size(); i++) {
    167             if (value.equals(mBackgroundItem.get(i).get("value"))) {
    168                 mBackgroundGrid.setItemChecked(i, true);
    169                 return;
    170             }
    171         }
    172 
    173         Log.e(TAG, "Invalid preference value: " + value);
    174         mPreference.print();
    175     }
    176 
    177     public void setSettingChangedListener(Listener listener) {
    178         mListener = listener;
    179     }
    180 
    181     @Override
    182     public void onItemClick(AdapterView<?> parent, View view,
    183             int index, long id) {
    184         String value;
    185         if (parent == mSillyFacesGrid) {
    186             value = (String) mSillyFacesItem.get(index).get("value");
    187         } else if (parent == mBackgroundGrid) {
    188             value = (String) mBackgroundItem.get(index).get("value");
    189         } else {
    190             return;
    191         }
    192 
    193         // Tapping the selected effect will deselect it (clear effects).
    194         if (value.equals(mPreference.getValue())) {
    195             mPreference.setValue(mNoEffect);
    196         } else {
    197             mPreference.setValue(value);
    198         }
    199         reloadPreference();
    200         if (mListener != null) mListener.onSettingChanged();
    201     }
    202 
    203     @Override
    204     public void onClick(View v) {
    205         // Clear the effect.
    206         mPreference.setValue(mNoEffect);
    207         reloadPreference();
    208         if (mListener != null) mListener.onSettingChanged();
    209     }
    210 }
    211