| /* |
| * Copyright (C) 2013 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.gallery3d.filtershow.editors; |
| |
| import android.content.Context; |
| import android.graphics.Point; |
| import android.util.Log; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.view.ViewGroup.LayoutParams; |
| import android.view.WindowManager; |
| import android.widget.FrameLayout; |
| import android.widget.LinearLayout; |
| import android.widget.SeekBar; |
| |
| import com.android.gallery3d.R; |
| import com.android.gallery3d.filtershow.controller.ActionSlider; |
| import com.android.gallery3d.filtershow.controller.BasicSlider; |
| import com.android.gallery3d.filtershow.controller.Control; |
| import com.android.gallery3d.filtershow.controller.Parameter; |
| import com.android.gallery3d.filtershow.controller.ParameterActionAndInt; |
| import com.android.gallery3d.filtershow.controller.ParameterInteger; |
| import com.android.gallery3d.filtershow.controller.ParameterStyles; |
| import com.android.gallery3d.filtershow.controller.StyleChooser; |
| import com.android.gallery3d.filtershow.controller.TitledSlider; |
| import com.android.gallery3d.filtershow.filters.FilterBasicRepresentation; |
| import com.android.gallery3d.filtershow.filters.FilterRepresentation; |
| |
| import java.lang.reflect.Constructor; |
| import java.util.HashMap; |
| |
| public class ParametricEditor extends Editor { |
| private int mLayoutID; |
| private int mViewID; |
| public static int ID = R.id.editorParametric; |
| private final String LOGTAG = "ParametricEditor"; |
| protected Control mControl; |
| public static final int MINIMUM_WIDTH = 600; |
| public static final int MINIMUM_HEIGHT = 800; |
| View mActionButton; |
| View mEditControl; |
| static HashMap<String, Class> portraitMap = new HashMap<String, Class>(); |
| static HashMap<String, Class> landscapeMap = new HashMap<String, Class>(); |
| static { |
| portraitMap.put(ParameterInteger.sParameterType, BasicSlider.class); |
| landscapeMap.put(ParameterInteger.sParameterType, TitledSlider.class); |
| portraitMap.put(ParameterActionAndInt.sParameterType, ActionSlider.class); |
| landscapeMap.put(ParameterActionAndInt.sParameterType, ActionSlider.class); |
| portraitMap.put(ParameterStyles.sParameterType, StyleChooser.class); |
| landscapeMap.put(ParameterStyles.sParameterType, StyleChooser.class); |
| } |
| |
| static Constructor getConstructor(Class cl) { |
| try { |
| return cl.getConstructor(Context.class, ViewGroup.class); |
| } catch (Exception e) { |
| return null; |
| } |
| } |
| |
| public ParametricEditor() { |
| super(ID); |
| } |
| |
| protected ParametricEditor(int id) { |
| super(id); |
| } |
| |
| protected ParametricEditor(int id, int layoutID, int viewID) { |
| super(id); |
| mLayoutID = layoutID; |
| mViewID = viewID; |
| } |
| |
| @Override |
| public String calculateUserMessage(Context context, String effectName, Object parameterValue) { |
| String apply = ""; |
| |
| if (mShowParameter == SHOW_VALUE_INT & useCompact(context)) { |
| if (getLocalRepresentation() instanceof FilterBasicRepresentation) { |
| FilterBasicRepresentation interval = (FilterBasicRepresentation) getLocalRepresentation(); |
| apply += " " + effectName + " " + interval.getStateRepresentation(); |
| } else { |
| apply += " " + effectName + " " + parameterValue; |
| } |
| } else { |
| apply += " " + effectName; |
| } |
| return apply; |
| } |
| |
| @Override |
| public void createEditor(Context context, FrameLayout frameLayout) { |
| super.createEditor(context, frameLayout); |
| unpack(mViewID, mLayoutID); |
| } |
| |
| @Override |
| public void reflectCurrentFilter() { |
| super.reflectCurrentFilter(); |
| if (getLocalRepresentation() != null |
| && getLocalRepresentation() instanceof FilterBasicRepresentation) { |
| FilterBasicRepresentation interval = (FilterBasicRepresentation) getLocalRepresentation(); |
| mControl.setPrameter(interval); |
| } |
| } |
| |
| @Override |
| public Control[] getControls() { |
| BasicSlider slider = new BasicSlider(); |
| return new Control[] { |
| slider |
| }; |
| } |
| |
| // TODO: need a better way to decide which representation |
| static boolean useCompact(Context context) { |
| WindowManager w = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)); |
| Point size = new Point(); |
| w.getDefaultDisplay().getSize(size); |
| if (size.x < size.y) { // if tall than wider |
| return true; |
| } |
| if (size.x < MINIMUM_WIDTH) { |
| return true; |
| } |
| if (size.y < MINIMUM_HEIGHT) { |
| return true; |
| } |
| return false; |
| } |
| |
| protected Parameter getParameterToEdit(FilterRepresentation rep) { |
| if (this instanceof Parameter) { |
| return (Parameter) this; |
| } else if (rep instanceof Parameter) { |
| return ((Parameter) rep); |
| } |
| return null; |
| } |
| |
| @Override |
| public void setUtilityPanelUI(View actionButton, View editControl) { |
| mActionButton = actionButton; |
| mEditControl = editControl; |
| FilterRepresentation rep = getLocalRepresentation(); |
| Parameter param = getParameterToEdit(rep); |
| if (param != null) { |
| control(param, editControl); |
| } else { |
| mSeekBar = new SeekBar(editControl.getContext()); |
| LayoutParams lp = new LinearLayout.LayoutParams( |
| LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); |
| mSeekBar.setLayoutParams(lp); |
| ((LinearLayout) editControl).addView(mSeekBar); |
| mSeekBar.setOnSeekBarChangeListener(this); |
| } |
| } |
| |
| protected void control(Parameter p, View editControl) { |
| String pType = p.getParameterType(); |
| Context context = editControl.getContext(); |
| Class c = ((useCompact(context)) ? portraitMap : landscapeMap).get(pType); |
| |
| if (c != null) { |
| try { |
| mControl = (Control) c.newInstance(); |
| p.setController(mControl); |
| mControl.setUp((ViewGroup) editControl, p, this); |
| |
| |
| } catch (Exception e) { |
| Log.e(LOGTAG, "Error in loading Control ", e); |
| } |
| } else { |
| Log.e(LOGTAG, "Unable to find class for " + pType); |
| for (String string : portraitMap.keySet()) { |
| Log.e(LOGTAG, "for " + string + " use " + portraitMap.get(string)); |
| } |
| } |
| } |
| |
| @Override |
| public void commitLocalRepresentation() { |
| super.commitLocalRepresentation(); |
| FilterRepresentation rep = getLocalRepresentation(); |
| } |
| |
| @Override |
| public void onProgressChanged(SeekBar sbar, int progress, boolean arg2) { |
| } |
| |
| @Override |
| public void onStartTrackingTouch(SeekBar arg0) { |
| } |
| |
| @Override |
| public void onStopTrackingTouch(SeekBar arg0) { |
| } |
| } |