blob: ab526951eec1af89771778c113ad26fac3dce5d1 [file] [log] [blame]
/*
* 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 com.android.camera.CameraPreference.OnPreferenceChangedListener;
import com.android.camera.PreferenceGroup;
import com.android.camera.R;
import com.android.camera.Util;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* On the tablet UI, we have IndicatorControlWheelContainer which contains a
* ShutterButton, an IndicatorControlWheel(which combines first-level and
* second-level indicators and a ZoomControlWheel).
*/
public class IndicatorControlWheelContainer extends IndicatorControlContainer {
public static final int STROKE_WIDTH = 87;
public static final int SHUTTER_BUTTON_RADIUS = 74;
public static final int FULL_WHEEL_RADIUS = 93;
private static final String TAG = "IndicatorControlWheelContainer";
private View mShutterButton;
private double mShutterButtonRadius;
private IndicatorControlWheel mIndicatorControlWheel;
private int mCenterX, mCenterY;
public IndicatorControlWheelContainer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
mShutterButton = findViewById(R.id.shutter_button);
mShutterButtonRadius = Util.dpToPixel(SHUTTER_BUTTON_RADIUS);
mIndicatorControlWheel = (IndicatorControlWheel) findViewById(
R.id.indicator_control_wheel);
}
public void initialize(Context context, PreferenceGroup group,
boolean isZoomSupported, String[] keys, String[] otherSettingKeys) {
mIndicatorControlWheel.initialize(context, group, isZoomSupported,
keys, otherSettingKeys);
}
public void onIndicatorEvent(int event) {
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (!onFilterTouchEventForSecurity(event)) return false;
int action = event.getAction();
double dx = event.getX() - mCenterX;
double dy = mCenterY - event.getY();
double radius = Math.sqrt(dx * dx + dy * dy);
// Check if the event should be dispatched to the shutter button.
if (radius <= mShutterButtonRadius) {
if (mIndicatorControlWheel.getVisibility() == View.VISIBLE) {
mIndicatorControlWheel.onTouchOutBound();
}
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
return mShutterButton.dispatchTouchEvent(event);
}
return false;
}
if (mShutterButton.isPressed()) {
// Send cancel to the shutter button if it was pressed.
event.setAction(MotionEvent.ACTION_CANCEL);
mShutterButton.dispatchTouchEvent(event);
return true;
}
return mIndicatorControlWheel.dispatchTouchEvent(event);
}
@Override
protected void onLayout(
boolean changed, int left, int top, int right, int bottom) {
// Layout the shutter button.
int shutterButtonWidth = mShutterButton.getMeasuredWidth();
int shutterButtonHeight = mShutterButton.getMeasuredHeight();
mCenterX = right - left - Util.dpToPixel(FULL_WHEEL_RADIUS);
mCenterY = (bottom - top) / 2;
mShutterButton.layout(right - left - shutterButtonWidth,
mCenterY - shutterButtonHeight / 2,
right - left,
mCenterY + shutterButtonHeight - shutterButtonHeight / 2);
// Layout the control wheel.
mIndicatorControlWheel.layout(0, 0, right - left, bottom - top);
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
// Measure all children.
int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
mShutterButton.measure(freeSpec, freeSpec);
mIndicatorControlWheel.measure(freeSpec, freeSpec);
// Measure myself. Add some buffer for highlight arc.
int desiredWidth = mShutterButton.getMeasuredWidth()
+ IndicatorControlWheel.HIGHLIGHT_WIDTH * 4;
int desiredHeight = mShutterButton.getMeasuredHeight()
+ IndicatorControlWheel.HIGHLIGHT_WIDTH * 4;
int widthMode = MeasureSpec.getMode(widthSpec);
int heightMode = MeasureSpec.getMode(heightSpec);
int measuredWidth, measuredHeight;
if (widthMode == MeasureSpec.UNSPECIFIED) {
measuredWidth = desiredWidth;
} else if (widthMode == MeasureSpec.AT_MOST) {
measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec));
} else { // MeasureSpec.EXACTLY
measuredWidth = MeasureSpec.getSize(widthSpec);
}
if (heightMode == MeasureSpec.UNSPECIFIED) {
measuredHeight = desiredHeight;
} else if (heightMode == MeasureSpec.AT_MOST) {
measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec));
} else { // MeasureSpec.EXACTLY
measuredHeight = MeasureSpec.getSize(heightSpec);
}
setMeasuredDimension(measuredWidth, measuredHeight);
}
@Override
public void setListener(OnPreferenceChangedListener listener) {
mIndicatorControlWheel.setListener(listener);
}
@Override
public void reloadPreferences() {
mIndicatorControlWheel.reloadPreferences();
}
@Override
public View getActiveSettingPopup() {
return mIndicatorControlWheel.getActiveSettingPopup();
}
@Override
public boolean dismissSettingPopup() {
return mIndicatorControlWheel.dismissSettingPopup();
}
@Override
public void setOrientation(int orientation) {
mIndicatorControlWheel.setOrientation(orientation);
}
public void startTimeLapseAnimation(int timeLapseInterval, long startTime) {
mIndicatorControlWheel.startTimeLapseAnimation(
timeLapseInterval, startTime);
}
public void stopTimeLapseAnimation() {
mIndicatorControlWheel.stopTimeLapseAnimation();
}
@Override
public void setEnabled(boolean enabled) {
mIndicatorControlWheel.setEnabled(enabled);
}
@Override
public void enableZoom(boolean enabled) {
mIndicatorControlWheel.enableZoom(enabled);
}
@Override
public void overrideSettings(final String ... keyvalues) {
mIndicatorControlWheel.overrideSettings(keyvalues);
}
@Override
public void dismissSecondLevelIndicator() {
mIndicatorControlWheel.dismissSecondLevelIndicator();
}
}