IndicatorControlWheel.java revision 6f2283fbf049ad1f9870a86474af295604d95600
16f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li/*
26f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * Copyright (C) 2010 The Android Open Source Project
36f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li *
46f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
56f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * you may not use this file except in compliance with the License.
66f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * You may obtain a copy of the License at
76f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li *
86f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
96f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li *
106f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * Unless required by applicable law or agreed to in writing, software
116f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
126f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * See the License for the specific language governing permissions and
146f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * limitations under the License.
156f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li */
166f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
176f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Lipackage com.android.camera.ui;
186f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
196f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.CameraSettings;
206f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.ComboPreferences;
216f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.IconListPreference;
226f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.PreferenceGroup;
236f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport com.android.camera.R;
246f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
256f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.content.Context;
266f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.util.AttributeSet;
276f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.util.Log;
286f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.widget.Button;
296f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.view.ViewGroup;
306f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport android.view.View;
316f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
326f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Liimport java.lang.Math;
336f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
346f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li/**
356f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * A view that contains camera settings and shutter buttons. The settings are
366f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li * spreaded around the shutter button.
376f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li */
386f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Lipublic class SettingsWheel extends ViewGroup {
396f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    private static final String TAG = "SettingsWheel";
406f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    private ComboPreferences mSharedPrefs;
416f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    private PreferenceGroup mPreferenceGroup;
426f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
436f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    public SettingsWheel(Context context) {
446f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        super(context);
456f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
466f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
476f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    public SettingsWheel(Context context, AttributeSet attrs) {
486f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        super(context, attrs);
496f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
506f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
516f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    public SettingsWheel(Context context, AttributeSet attrs, int defStyle) {
526f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        super(context, attrs, defStyle);
536f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
546f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
556f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    @Override
566f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    protected void onMeasure(int widthSpec, int heightSpec) {
576f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        // Measure all children.
586f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
596f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        for (int i = 0; i < getChildCount(); i++) {
606f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            getChildAt(i).measure(freeSpec, freeSpec);
616f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        }
626f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
636f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        // Measure myself.
646f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        View shutterButton = getChildAt(0);
656f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int desiredWidth = (int)(shutterButton.getMeasuredWidth() * 2.5);
666f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int desiredHeight = (int)(shutterButton.getMeasuredHeight() * 3);
676f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int widthMode = MeasureSpec.getMode(widthSpec);
686f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int heightMode = MeasureSpec.getMode(heightSpec);
696f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int measuredWidth, measuredHeight;
706f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        if (widthMode == MeasureSpec.UNSPECIFIED) {
716f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            measuredWidth = desiredWidth;
726f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        } else if (widthMode == MeasureSpec.AT_MOST) {
736f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec));
746f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        } else {  // MeasureSpec.EXACTLY
756f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            measuredWidth = MeasureSpec.getSize(widthSpec);
766f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        }
776f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        if (heightMode == MeasureSpec.UNSPECIFIED) {
786f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            measuredHeight = desiredHeight;
796f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        } else if (heightMode == MeasureSpec.AT_MOST) {
806f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec));
816f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        } else {  // MeasureSpec.EXACTLY
826f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            measuredHeight = MeasureSpec.getSize(heightSpec);
836f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        }
846f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        setMeasuredDimension(measuredWidth, measuredHeight);
856f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
866f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
876f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    @Override
886f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    protected void onLayout(
896f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            boolean changed, int left, int top, int right, int bottom) {
906f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int count = getChildCount();
916f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        if (count == 0) return;
926f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
936f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        // Layout the shutter button.
946f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        View shutterButton = findViewById(R.id.shutter_button);
956f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int width = shutterButton.getMeasuredWidth();
966f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int height = shutterButton.getMeasuredHeight();
976f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int xCenter = (right - left) - width / 2;
986f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int yCenter = (bottom - top) / 2;
996f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        shutterButton.layout(xCenter - width / 2, yCenter - height / 2,
1006f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li                xCenter + width / 2, yCenter + height / 2);
1016f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
1026f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        // Layout the settings. The icons are spreaded on the left side of the
1036f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        // shutter button. So the angle starts from 90 to 270 degrees.
1046f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        if (count == 1) return;
1056f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        double radius = shutterButton.getMeasuredWidth();
1066f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        double intervalDegrees = 180.0 / (count - 2);
1076f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        double initialDegrees = 90.0;
1086f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int index = 0;
1096f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        for (int i = 0; i < count; ++i) {
1106f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            View view = getChildAt(i);
1116f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            if (view == shutterButton) continue;
1126f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            double degree = initialDegrees + intervalDegrees * index;
1136f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            double radian = degree * Math.PI / 180.0;
1146f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            int x = xCenter + (int)(radius * Math.cos(radian));
1156f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            int y = yCenter - (int)(radius * Math.sin(radian));
1166f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            width = view.getMeasuredWidth();
1176f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            height = view.getMeasuredHeight();
1186f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            view.layout(x - width / 2, y - height / 2, x + width / 2,
1196f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li                    y + height / 2);
1206f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            index++;
1216f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        }
1226f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
1236f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
1246f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    protected void addIndicator(
1256f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li            Context context, PreferenceGroup group, String key) {
1266f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        IconListPreference pref = (IconListPreference) group.findPreference(key);
1276f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        if (pref == null) return;
1286f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        int index = pref.findIndexOfValue(pref.getValue());
1296f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        Button b = new Button(context);
1306f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        b.setBackgroundResource(pref.getLargeIconIds()[index]);
1316f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        addView(b);
1326f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
1336f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li
1346f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    public void initialize(Context context, PreferenceGroup group) {
1356f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        mPreferenceGroup = group;
1366f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        mSharedPrefs = ComboPreferences.get(context);
1376f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        addIndicator(context, group, CameraSettings.KEY_FLASH_MODE);
1386f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        addIndicator(context, group, CameraSettings.KEY_WHITE_BALANCE);
1396f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        addIndicator(context, group, CameraSettings.KEY_RECORD_LOCATION);
1406f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        addIndicator(context, group, CameraSettings.KEY_CAMERA_ID);
1416f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li        requestLayout();
1426f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li    }
1436f2283fbf049ad1f9870a86474af295604d95600Wu-cheng Li}
144