diff options
author | Wu-cheng Li <wuchengli@google.com> | 2011-09-22 16:47:22 +0800 |
---|---|---|
committer | Wu-cheng Li <wuchengli@google.com> | 2011-09-23 20:41:30 +0800 |
commit | 1e99673af90451eaffeb100735f38e6ce0f18456 (patch) | |
tree | cd63dd416c69eceaedd7451ee8fd375ebf80ce09 /src/com | |
parent | 022d6d7e809fcd47ebc751deaea84e2d3639069a (diff) | |
download | LegacyCamera-1e99673af90451eaffeb100735f38e6ce0f18456.zip LegacyCamera-1e99673af90451eaffeb100735f38e6ce0f18456.tar.gz LegacyCamera-1e99673af90451eaffeb100735f38e6ce0f18456.tar.bz2 |
Add clear effects button, silly faces title, and background title.
bug:5226051
Change-Id: I61609e31fb8f18041f6885cb923507aeecfd9c9f
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/camera/EffectsRecorder.java | 1 | ||||
-rw-r--r-- | src/com/android/camera/ui/BasicSettingPopup.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/ui/EffectSettingPopup.java | 173 | ||||
-rw-r--r-- | src/com/android/camera/ui/ExpandedGridView.java | 36 | ||||
-rw-r--r-- | src/com/android/camera/ui/IndicatorButton.java | 21 |
5 files changed, 224 insertions, 11 deletions
diff --git a/src/com/android/camera/EffectsRecorder.java b/src/com/android/camera/EffectsRecorder.java index 6d4faf4..19d9106 100644 --- a/src/com/android/camera/EffectsRecorder.java +++ b/src/com/android/camera/EffectsRecorder.java @@ -56,6 +56,7 @@ public class EffectsRecorder { public static final int EFFECT_GF_SMALL_MOUTH = 3; public static final int EFFECT_GF_BIG_NOSE = 4; public static final int EFFECT_GF_SMALL_EYES = 5; + public static final int NUM_OF_GF_EFFECTS = EFFECT_GF_SMALL_EYES + 1; public static final int EFFECT_MSG_STARTED_LEARNING = 0; public static final int EFFECT_MSG_DONE_LEARNING = 1; diff --git a/src/com/android/camera/ui/BasicSettingPopup.java b/src/com/android/camera/ui/BasicSettingPopup.java index 9220c3b..dd50912 100644 --- a/src/com/android/camera/ui/BasicSettingPopup.java +++ b/src/com/android/camera/ui/BasicSettingPopup.java @@ -47,7 +47,7 @@ public class BasicSettingPopup extends AbstractSettingPopup implements super(context, attrs); } - public void initialize(IconListPreference preference, int settingItemLayoutId) { + public void initialize(IconListPreference preference) { mPreference = preference; Context context = getContext(); CharSequence[] entries = mPreference.getEntries(); @@ -69,7 +69,7 @@ public class BasicSettingPopup extends AbstractSettingPopup implements listItem.add(map); } SimpleAdapter listItemAdapter = new SimpleAdapter(context, listItem, - settingItemLayoutId, + R.layout.setting_item, new String[] {"text", "image"}, new int[] {R.id.text, R.id.image}); ((AbsListView) mSettingList).setAdapter(listItemAdapter); diff --git a/src/com/android/camera/ui/EffectSettingPopup.java b/src/com/android/camera/ui/EffectSettingPopup.java new file mode 100644 index 0000000..6005c8d --- /dev/null +++ b/src/com/android/camera/ui/EffectSettingPopup.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.camera.ui; + +import com.android.camera.EffectsRecorder; +import com.android.camera.IconListPreference; +import com.android.camera.R; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.GridView; +import android.widget.SimpleAdapter; + +import java.util.ArrayList; +import java.util.HashMap; + +// A popup window that shows video effect setting. It has two grid view. +// One shows the goofy face effects. The other shows the background replacer +// effects. +public class EffectSettingPopup extends AbstractSettingPopup implements + AdapterView.OnItemClickListener, View.OnClickListener { + private final String TAG = "EffectSettingPopup"; + private IconListPreference mPreference; + private Listener mListener; + private View mClearEffects; + private GridView mSillyFacesGrid; + private GridView mBackgroundGrid; + + static public interface Listener { + public void onSettingChanged(); + } + + public EffectSettingPopup(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mClearEffects = findViewById(R.id.clear_effects); + mClearEffects.setOnClickListener(this); + mSillyFacesGrid = (GridView) findViewById(R.id.effect_silly_faces); + mBackgroundGrid = (GridView) findViewById(R.id.effect_background); + } + + public void initialize(IconListPreference preference) { + mPreference = preference; + Context context = getContext(); + CharSequence[] entries = mPreference.getEntries(); + int[] iconIds = mPreference.getImageIds(); + if (iconIds == null) { + iconIds = mPreference.getLargeIconIds(); + } + + // Set title. + mTitle.setText(mPreference.getTitle()); + + // Prepare goofy face GridView. + ArrayList<HashMap<String, Object>> sillyFacesItem = + new ArrayList<HashMap<String, Object>>(); + // The first is clear effect. Skip it. + for(int i = 1; i < EffectsRecorder.NUM_OF_GF_EFFECTS + 1; ++i) { + HashMap<String, Object> map = new HashMap<String, Object>(); + map.put("text", entries[i].toString()); + if (iconIds != null) map.put("image", iconIds[i]); + sillyFacesItem.add(map); + } + SimpleAdapter sillyFacesItemAdapter = new SimpleAdapter(context, + sillyFacesItem, R.layout.effect_setting_item, + new String[] {"text", "image"}, + new int[] {R.id.text, R.id.image}); + mSillyFacesGrid.setAdapter(sillyFacesItemAdapter); + mSillyFacesGrid.setOnItemClickListener(this); + + // Prepare background replacer GridView. + ArrayList<HashMap<String, Object>> backgroundItem = + new ArrayList<HashMap<String, Object>>(); + for(int i = EffectsRecorder.NUM_OF_GF_EFFECTS + 1; i < entries.length; ++i) { + HashMap<String, Object> map = new HashMap<String, Object>(); + map.put("text", entries[i].toString()); + if (iconIds != null) map.put("image", iconIds[i]); + backgroundItem.add(map); + } + // Initialize background replacer if it is supported. + if (backgroundItem.size() > 0) { + findViewById(R.id.effect_background_separator).setVisibility(View.VISIBLE); + findViewById(R.id.effect_background_title).setVisibility(View.VISIBLE); + mBackgroundGrid.setVisibility(View.VISIBLE); + SimpleAdapter backgroundItemAdapter = new SimpleAdapter(context, + backgroundItem, R.layout.effect_setting_item, + new String[] {"text", "image"}, + new int[] {R.id.text, R.id.image}); + mBackgroundGrid.setAdapter(backgroundItemAdapter); + mBackgroundGrid.setOnItemClickListener(this); + } + + reloadPreference(); + } + + @Override + public void setVisibility(int visibility) { + if (visibility == View.VISIBLE) { + if (getVisibility() != View.VISIBLE) { + // Do not show or hide "Clear effects" button when the popup + // is already visible. Otherwise it looks strange. + int index = mPreference.findIndexOfValue(mPreference.getValue()); + mClearEffects.setVisibility((index <= 0) ? View.GONE : View.VISIBLE); + } + reloadPreference(); + } + super.setVisibility(visibility); + } + + // The value of the preference may have changed. Update the UI. + @Override + public void reloadPreference() { + int index = mPreference.findIndexOfValue(mPreference.getValue()); + if (index >= 0) { + mBackgroundGrid.clearChoices(); + mSillyFacesGrid.clearChoices(); + if (index >= 1 && index < EffectsRecorder.NUM_OF_GF_EFFECTS + 1) { + mSillyFacesGrid.setItemChecked(index - 1, true); + } else if (index >= EffectsRecorder.NUM_OF_GF_EFFECTS + 1) { + mBackgroundGrid.setItemChecked(index - EffectsRecorder.NUM_OF_GF_EFFECTS - 1, true); + } + } else { + Log.e(TAG, "Invalid preference value."); + mPreference.print(); + } + } + + public void setSettingChangedListener(Listener listener) { + mListener = listener; + } + + @Override + public void onItemClick(AdapterView<?> parent, View view, + int index, long id) { + if (parent == mSillyFacesGrid) { + // The first one is clear effect. + mPreference.setValueIndex(index + 1); + } else { // Background replace grid. + mPreference.setValueIndex(index + EffectsRecorder.NUM_OF_GF_EFFECTS + 1); + } + reloadPreference(); + if (mListener != null) mListener.onSettingChanged(); + } + + @Override + public void onClick(View v) { + // Clear the effect. + mPreference.setValueIndex(0); + reloadPreference(); + if (mListener != null) mListener.onSettingChanged(); + } +} diff --git a/src/com/android/camera/ui/ExpandedGridView.java b/src/com/android/camera/ui/ExpandedGridView.java new file mode 100644 index 0000000..13cf58f --- /dev/null +++ b/src/com/android/camera/ui/ExpandedGridView.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.camera.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.GridView; + +public class ExpandedGridView extends GridView { + public ExpandedGridView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // If UNSPECIFIED is passed to GridView, it will show only one row. + // Here GridView is put in a ScrollView, so pass it a very big size with + // AT_MOST to show all the rows. + heightMeasureSpec = MeasureSpec.makeMeasureSpec(65536, MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/src/com/android/camera/ui/IndicatorButton.java b/src/com/android/camera/ui/IndicatorButton.java index 7948f7c..9f1cfd5 100644 --- a/src/com/android/camera/ui/IndicatorButton.java +++ b/src/com/android/camera/ui/IndicatorButton.java @@ -27,7 +27,8 @@ import android.view.ViewGroup; // An indicator button that represents one camera setting. Ex: flash. Pressing it opens a popup // window. -public class IndicatorButton extends AbstractIndicatorButton implements BasicSettingPopup.Listener { +public class IndicatorButton extends AbstractIndicatorButton implements BasicSettingPopup.Listener, + EffectSettingPopup.Listener{ private final String TAG = "IndicatorButton"; private IconListPreference mPreference; // Scene mode can override the original preference value. @@ -103,19 +104,21 @@ public class IndicatorButton extends AbstractIndicatorButton implements BasicSet Context.LAYOUT_INFLATER_SERVICE); ViewGroup root = (ViewGroup) getRootView().findViewById(R.id.frame_layout); - BasicSettingPopup popup; + AbstractSettingPopup popup; if (CameraSettings.KEY_VIDEO_EFFECT.equals(getKey())) { - popup = (BasicSettingPopup) inflater.inflate( + EffectSettingPopup effect = (EffectSettingPopup) inflater.inflate( R.layout.effect_setting_popup, root, false); - popup.initialize(mPreference, R.layout.effect_setting_item); + effect.initialize(mPreference); + effect.setSettingChangedListener(this); + mPopup = effect; } else { - popup = (BasicSettingPopup) inflater.inflate( + BasicSettingPopup basic = (BasicSettingPopup) inflater.inflate( R.layout.basic_setting_popup, root, false); - popup.initialize(mPreference, R.layout.setting_item); + basic.initialize(mPreference); + basic.setSettingChangedListener(this); + mPopup = basic; } - popup.setSettingChangedListener(this); - root.addView(popup); - mPopup = popup; + root.addView(mPopup); } @Override |