blob: 9ec858ca59751ecf5f3e111dbff576e8c8ff69f3 [file] [log] [blame]
/*
* 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.toUpperCase() + " " + interval.getStateRepresentation();
} else {
apply += " " + effectName.toUpperCase() + " " + parameterValue;
}
} else {
apply += " " + effectName.toUpperCase();
}
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 onProgressChanged(SeekBar sbar, int progress, boolean arg2) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
}