1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.ui;
18 
19 import com.android.camera.CameraPreference.OnPreferenceChangedListener;
20 import com.android.camera.PreferenceGroup;
21 import com.android.camera.R;
22 import com.android.camera.Util;
23 
24 import android.content.Context;
25 import android.util.AttributeSet;
26 import android.view.MotionEvent;
27 import android.view.View;
28 
29 /**
30  * On the tablet UI, we have IndicatorControlWheelContainer which contains a
31  * ShutterButton, an IndicatorControlWheel(which combines first-level and
32  * second-level indicators and a ZoomControlWheel).
33  */
34 public class IndicatorControlWheelContainer extends IndicatorControlContainer {
35     public static final int STROKE_WIDTH = 87;
36     public static final int SHUTTER_BUTTON_RADIUS = 74;
37     public static final int FULL_WHEEL_RADIUS = 93;
38 
39     private static final String TAG = "IndicatorControlWheelContainer";
40 
41     private View mShutterButton;
42     private double mShutterButtonRadius;
43     private IndicatorControlWheel mIndicatorControlWheel;
44     private int mCenterX, mCenterY;
45 
IndicatorControlWheelContainer(Context context, AttributeSet attrs)46     public IndicatorControlWheelContainer(Context context, AttributeSet attrs) {
47         super(context, attrs);
48     }
49 
50     @Override
onFinishInflate()51     protected void onFinishInflate() {
52         mShutterButton = findViewById(R.id.shutter_button);
53         mShutterButtonRadius = Util.dpToPixel(SHUTTER_BUTTON_RADIUS);
54 
55         mIndicatorControlWheel = (IndicatorControlWheel) findViewById(
56                 R.id.indicator_control_wheel);
57     }
58 
initialize(Context context, PreferenceGroup group, boolean isZoomSupported, String[] keys, String[] otherSettingKeys)59     public void initialize(Context context, PreferenceGroup group,
60             boolean isZoomSupported, String[] keys, String[] otherSettingKeys) {
61         mIndicatorControlWheel.initialize(context, group, isZoomSupported,
62                 keys, otherSettingKeys);
63     }
64 
onIndicatorEvent(int event)65     public void onIndicatorEvent(int event) {
66     }
67 
68     @Override
dispatchTouchEvent(MotionEvent event)69     public boolean dispatchTouchEvent(MotionEvent event) {
70         if (!onFilterTouchEventForSecurity(event)) return false;
71 
72         int action = event.getAction();
73 
74         double dx = event.getX() - mCenterX;
75         double dy = mCenterY - event.getY();
76         double radius = Math.sqrt(dx * dx + dy * dy);
77 
78         // Check if the event should be dispatched to the shutter button.
79         if (radius <= mShutterButtonRadius) {
80             if (mIndicatorControlWheel.getVisibility() == View.VISIBLE) {
81                 mIndicatorControlWheel.onTouchOutBound();
82             }
83             if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
84                 return mShutterButton.dispatchTouchEvent(event);
85             }
86             return false;
87         }
88 
89         if (mShutterButton.isPressed()) {
90             // Send cancel to the shutter button if it was pressed.
91             event.setAction(MotionEvent.ACTION_CANCEL);
92             mShutterButton.dispatchTouchEvent(event);
93             return true;
94         }
95 
96         return mIndicatorControlWheel.dispatchTouchEvent(event);
97     }
98 
99     @Override
onLayout( boolean changed, int left, int top, int right, int bottom)100     protected void onLayout(
101             boolean changed, int left, int top, int right, int bottom) {
102 
103         // Layout the shutter button.
104         int shutterButtonWidth = mShutterButton.getMeasuredWidth();
105         int shutterButtonHeight = mShutterButton.getMeasuredHeight();
106         mCenterX = right - left - Util.dpToPixel(FULL_WHEEL_RADIUS);
107         mCenterY = (bottom - top) / 2;
108         mShutterButton.layout(right - left - shutterButtonWidth,
109                 mCenterY - shutterButtonHeight / 2,
110                 right - left,
111                 mCenterY + shutterButtonHeight - shutterButtonHeight / 2);
112         // Layout the control wheel.
113         mIndicatorControlWheel.layout(0, 0, right - left, bottom - top);
114     }
115 
116     @Override
onMeasure(int widthSpec, int heightSpec)117     protected void onMeasure(int widthSpec, int heightSpec) {
118         // Measure all children.
119         int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
120         mShutterButton.measure(freeSpec, freeSpec);
121         mIndicatorControlWheel.measure(freeSpec, freeSpec);
122 
123         // Measure myself. Add some buffer for highlight arc.
124         int desiredWidth = mShutterButton.getMeasuredWidth()
125                 + IndicatorControlWheel.HIGHLIGHT_WIDTH * 4;
126         int desiredHeight = mShutterButton.getMeasuredHeight()
127                 + IndicatorControlWheel.HIGHLIGHT_WIDTH * 4;
128         int widthMode = MeasureSpec.getMode(widthSpec);
129         int heightMode = MeasureSpec.getMode(heightSpec);
130         int measuredWidth, measuredHeight;
131         if (widthMode == MeasureSpec.UNSPECIFIED) {
132             measuredWidth = desiredWidth;
133         } else if (widthMode == MeasureSpec.AT_MOST) {
134             measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec));
135         } else {  // MeasureSpec.EXACTLY
136             measuredWidth = MeasureSpec.getSize(widthSpec);
137         }
138         if (heightMode == MeasureSpec.UNSPECIFIED) {
139             measuredHeight = desiredHeight;
140         } else if (heightMode == MeasureSpec.AT_MOST) {
141             measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec));
142         } else {  // MeasureSpec.EXACTLY
143             measuredHeight = MeasureSpec.getSize(heightSpec);
144         }
145         setMeasuredDimension(measuredWidth, measuredHeight);
146     }
147 
148     @Override
setListener(OnPreferenceChangedListener listener)149     public void setListener(OnPreferenceChangedListener listener) {
150         mIndicatorControlWheel.setListener(listener);
151     }
152 
153     @Override
reloadPreferences()154     public void reloadPreferences() {
155         mIndicatorControlWheel.reloadPreferences();
156     }
157 
158     @Override
getActiveSettingPopup()159     public View getActiveSettingPopup() {
160         return mIndicatorControlWheel.getActiveSettingPopup();
161     }
162 
163     @Override
dismissSettingPopup()164     public boolean dismissSettingPopup() {
165         return mIndicatorControlWheel.dismissSettingPopup();
166     }
167 
168     @Override
setOrientation(int orientation)169     public void setOrientation(int orientation) {
170         mIndicatorControlWheel.setOrientation(orientation);
171     }
172 
startTimeLapseAnimation(int timeLapseInterval, long startTime)173     public void startTimeLapseAnimation(int timeLapseInterval, long startTime) {
174         mIndicatorControlWheel.startTimeLapseAnimation(
175                 timeLapseInterval, startTime);
176     }
177 
stopTimeLapseAnimation()178     public void stopTimeLapseAnimation() {
179         mIndicatorControlWheel.stopTimeLapseAnimation();
180     }
181 
182     @Override
setEnabled(boolean enabled)183     public void setEnabled(boolean enabled) {
184         mIndicatorControlWheel.setEnabled(enabled);
185     }
186 
187     @Override
enableZoom(boolean enabled)188     public void enableZoom(boolean enabled) {
189         mIndicatorControlWheel.enableZoom(enabled);
190     }
191 
192     @Override
overrideSettings(final String ... keyvalues)193     public void overrideSettings(final String ... keyvalues) {
194         mIndicatorControlWheel.overrideSettings(keyvalues);
195     }
196 
197     @Override
dismissSecondLevelIndicator()198     public void dismissSecondLevelIndicator() {
199         mIndicatorControlWheel.dismissSecondLevelIndicator();
200     }
201 }
202