summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorWu-cheng Li <wuchengli@google.com>2011-09-22 16:47:22 +0800
committerWu-cheng Li <wuchengli@google.com>2011-09-23 20:41:30 +0800
commit1e99673af90451eaffeb100735f38e6ce0f18456 (patch)
treecd63dd416c69eceaedd7451ee8fd375ebf80ce09 /src/com
parent022d6d7e809fcd47ebc751deaea84e2d3639069a (diff)
downloadLegacyCamera-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.java1
-rw-r--r--src/com/android/camera/ui/BasicSettingPopup.java4
-rw-r--r--src/com/android/camera/ui/EffectSettingPopup.java173
-rw-r--r--src/com/android/camera/ui/ExpandedGridView.java36
-rw-r--r--src/com/android/camera/ui/IndicatorButton.java21
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