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