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