| /* |
| * Copyright (C) 2014 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.widget; |
| |
| import android.content.Context; |
| import android.content.res.Configuration; |
| import android.graphics.RectF; |
| import android.util.AttributeSet; |
| import android.view.Gravity; |
| import android.view.MotionEvent; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.FrameLayout; |
| import android.widget.ImageView; |
| import android.widget.LinearLayout; |
| |
| import com.android.camera.CaptureLayoutHelper; |
| import com.android.camera.ShutterButton; |
| import com.android.camera.debug.Log; |
| import com.android.camera.ui.PreviewOverlay; |
| import com.android.camera.ui.TouchCoordinate; |
| import com.android.camera2.R; |
| |
| /** |
| * ModeOptionsOverlay is a FrameLayout which positions mode options in |
| * in the bottom of the preview that is visible above the bottom bar. |
| */ |
| public class ModeOptionsOverlay extends FrameLayout |
| implements PreviewOverlay.OnPreviewTouchedListener, |
| ShutterButton.OnShutterButtonListener { |
| |
| private final static Log.Tag TAG = new Log.Tag("ModeOptionsOverlay"); |
| |
| private static final int BOTTOMBAR_OPTIONS_TIMEOUT_MS = 2000; |
| private static final int BOTTOM_RIGHT = Gravity.BOTTOM | Gravity.RIGHT; |
| private static final int TOP_RIGHT = Gravity.TOP | Gravity.RIGHT; |
| |
| private ModeOptions mModeOptions; |
| // need a reference to set the onClickListener and fix the layout gravity on orientation change |
| private LinearLayout mModeOptionsToggle; |
| // need a reference to fix the rotation on orientation change |
| private ImageView mThreeDots; |
| private CaptureLayoutHelper mCaptureLayoutHelper = null; |
| |
| public ModeOptionsOverlay(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| } |
| |
| /** |
| * Whether the mode options are hidden. |
| */ |
| public boolean isModeOptionsHidden() { |
| return mModeOptions.isHiddenOrHiding(); |
| } |
| |
| /** |
| * Gets the current width of the mode options toggle including the three dots and various mode |
| * option indicators. |
| */ |
| public float getModeOptionsToggleWidth() { |
| return mModeOptionsToggle.getWidth(); |
| } |
| |
| /** |
| * Sets a capture layout helper to query layout rect from. |
| */ |
| public void setCaptureLayoutHelper(CaptureLayoutHelper helper) { |
| mCaptureLayoutHelper = helper; |
| } |
| |
| public void setToggleClickable(boolean clickable) { |
| mModeOptionsToggle.setClickable(clickable); |
| } |
| |
| public void showExposureOptions() { |
| mModeOptions.showExposureOptions(); |
| } |
| |
| /** |
| * Sets the mode options listener. |
| * |
| * @param listener The listener to be set. |
| */ |
| public void setModeOptionsListener(ModeOptions.Listener listener) { |
| mModeOptions.setListener(listener); |
| } |
| |
| @Override |
| public void onFinishInflate() { |
| mModeOptions = (ModeOptions) findViewById(R.id.mode_options); |
| mModeOptions.setClickable(true); |
| mModeOptions.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| closeModeOptions(); |
| } |
| }); |
| |
| mModeOptionsToggle = (LinearLayout) findViewById(R.id.mode_options_toggle); |
| mModeOptionsToggle.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| mModeOptions.animateVisible(); |
| } |
| }); |
| mModeOptions.setViewToShowHide(mModeOptionsToggle); |
| |
| mThreeDots = (ImageView) findViewById(R.id.three_dots); |
| } |
| |
| @Override |
| public void onPreviewTouched(MotionEvent ev) { |
| closeModeOptions(); |
| } |
| |
| @Override |
| public void onShutterButtonClick() { |
| closeModeOptions(); |
| } |
| |
| @Override |
| public void onShutterCoordinate(TouchCoordinate coord) { |
| // Do nothing. |
| } |
| |
| @Override |
| public void onShutterButtonFocus(boolean pressed) { |
| // noop |
| } |
| |
| @Override |
| public void onShutterButtonLongPressed() { |
| // noop |
| } |
| |
| /** |
| * Schedule (or re-schedule) the options menu to be closed after a number |
| * of milliseconds. If the options menu is already closed, nothing is |
| * scheduled. |
| */ |
| public void closeModeOptions() { |
| mModeOptions.animateHidden(); |
| } |
| |
| @Override |
| public void onConfigurationChanged(Configuration configuration) { |
| super.onConfigurationChanged(configuration); |
| checkOrientation(configuration.orientation); |
| } |
| |
| @Override |
| public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
| if (mCaptureLayoutHelper == null) { |
| super.onMeasure(widthMeasureSpec, heightMeasureSpec); |
| Log.e(TAG, "Capture layout helper needs to be set first."); |
| } else { |
| RectF uncoveredPreviewRect = mCaptureLayoutHelper.getUncoveredPreviewRect(); |
| super.onMeasure(MeasureSpec.makeMeasureSpec( |
| (int) uncoveredPreviewRect.width(), MeasureSpec.EXACTLY), |
| MeasureSpec.makeMeasureSpec((int) uncoveredPreviewRect.height(), |
| MeasureSpec.EXACTLY) |
| ); |
| } |
| } |
| |
| /** |
| * Set the layout gravity of the child layout to be bottom or top right |
| * depending on orientation. |
| */ |
| private void checkOrientation(int orientation) { |
| final boolean isPortrait = (Configuration.ORIENTATION_PORTRAIT == orientation); |
| |
| final int modeOptionsDimension = (int) getResources() |
| .getDimension(R.dimen.mode_options_height); |
| |
| FrameLayout.LayoutParams modeOptionsParams |
| = (FrameLayout.LayoutParams) mModeOptions.getLayoutParams(); |
| FrameLayout.LayoutParams modeOptionsToggleParams |
| = (FrameLayout.LayoutParams) mModeOptionsToggle.getLayoutParams(); |
| |
| if (isPortrait) { |
| modeOptionsParams.height = modeOptionsDimension; |
| modeOptionsParams.width = ViewGroup.LayoutParams.MATCH_PARENT; |
| modeOptionsParams.gravity = Gravity.BOTTOM; |
| |
| modeOptionsToggleParams.gravity = BOTTOM_RIGHT; |
| |
| mThreeDots.setImageResource(R.drawable.ic_options_port); |
| } else { |
| modeOptionsParams.width = modeOptionsDimension; |
| modeOptionsParams.height = ViewGroup.LayoutParams.MATCH_PARENT; |
| modeOptionsParams.gravity = Gravity.RIGHT; |
| |
| modeOptionsToggleParams.gravity = TOP_RIGHT; |
| |
| mThreeDots.setImageResource(R.drawable.ic_options_land); |
| } |
| |
| requestLayout(); |
| } |
| } |