summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2016-03-27 14:31:16 +0200
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-04-03 04:41:55 -0700
commit222c665b32fcc14a97494c896c22012d10ddd8a3 (patch)
treec950b9cf8f26e97de6d42ec98d185335715ca381
parentba9f88b3d6930bbd686e23672d3b1203dd1a3015 (diff)
downloadandroid_packages_apps_Snap-222c665b32fcc14a97494c896c22012d10ddd8a3.tar.gz
android_packages_apps_Snap-222c665b32fcc14a97494c896c22012d10ddd8a3.tar.bz2
android_packages_apps_Snap-222c665b32fcc14a97494c896c22012d10ddd8a3.zip
Properly respect navigation bar size when laying out menus.
For top level menus, add padding so all menu items can be scrolled to not be covered by the navigation bar. For sub menus, place them to not be covered by the navigation bar. Change-Id: I22961c19b7bf80a26eec03b5feabfda10e910669
-rw-r--r--src/com/android/camera/PhotoMenu.java48
-rw-r--r--src/com/android/camera/PhotoUI.java58
-rw-r--r--src/com/android/camera/VideoMenu.java25
-rw-r--r--src/com/android/camera/VideoUI.java49
-rw-r--r--src/com/android/camera/ui/CameraRootView.java35
-rw-r--r--src/com/android/camera/ui/ListMenu.java33
-rw-r--r--src/com/android/camera/ui/RotateLayout.java20
7 files changed, 170 insertions, 98 deletions
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index 271640d29..078a23e2d 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -44,6 +44,7 @@ import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import com.android.camera.CameraPreference.OnPreferenceChangedListener;
+import com.android.camera.ui.CameraRootView;
import com.android.camera.ui.CountdownTimerPopup;
import com.android.camera.ui.ListSubMenu;
import com.android.camera.ui.ListMenu;
@@ -53,8 +54,6 @@ import com.android.camera.ui.RotateTextToast;
import org.codeaurora.snapcam.R;
import android.widget.HorizontalScrollView;
import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.Display;
import com.android.camera.util.CameraUtil;
import java.util.Locale;
@@ -798,8 +797,6 @@ public class PhotoMenu extends MenuController
if (!mIsDefaultToPortrait) {
rotation = (rotation + 90) % 360;
}
- WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
CharSequence[] entries = pref.getEntries();
@@ -831,22 +828,23 @@ public class PhotoMenu extends MenuController
gridRes, null, false);
mUI.dismissSceneModeMenu();
- LinearLayout previewMenuLayout = new LinearLayout(mActivity);
- mUI.setPreviewMenuLayout(previewMenuLayout);
+ mUI.setPreviewMenuLayout(basic);
ViewGroup.LayoutParams params = null;
+ CameraRootView rootView = mUI.getRootView();
if (portrait) {
params = new ViewGroup.LayoutParams(size, LayoutParams.MATCH_PARENT);
- previewMenuLayout.setLayoutParams(params);
- ((ViewGroup) mUI.getRootView()).addView(previewMenuLayout);
} else {
params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, size);
- previewMenuLayout.setLayoutParams(params);
- ((ViewGroup) mUI.getRootView()).addView(previewMenuLayout);
- previewMenuLayout.setY(display.getHeight() - size);
+
+ int rootViewBottom = rootView.getClientRectForOrientation(rotation).bottom;
+ basic.setY(rootViewBottom - size);
}
- basic.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
+ basic.setLayoutParams(params);
+ rootView.addView(basic);
+
LinearLayout layout = (LinearLayout) basic.findViewById(R.id.layout);
+ Rect insets = rootView.getInsetsForOrientation(rotation);
+ layout.setPadding(insets.left, insets.top, insets.right, insets.bottom);
final View[] views = new View[entries.length];
int init = pref.getCurrentIndex();
@@ -886,7 +884,6 @@ public class PhotoMenu extends MenuController
label.setText(entries[i]);
layout.addView(layout2);
}
- previewMenuLayout.addView(basic);
mPreviewMenu = basic;
}
@@ -936,8 +933,6 @@ public class PhotoMenu extends MenuController
if (!mIsDefaultToPortrait) {
rotation = (rotation + 90) % 360;
}
- WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
CharSequence[] entries = pref.getEntries();
Resources r = mActivity.getResources();
@@ -968,22 +963,24 @@ public class PhotoMenu extends MenuController
gridRes, null, false);
mUI.dismissSceneModeMenu();
- LinearLayout previewMenuLayout = new LinearLayout(mActivity);
- mUI.setPreviewMenuLayout(previewMenuLayout);
+ mUI.setPreviewMenuLayout(basic);
ViewGroup.LayoutParams params = null;
+ CameraRootView rootView = mUI.getRootView();
if (portrait) {
params = new ViewGroup.LayoutParams(size, LayoutParams.MATCH_PARENT);
- previewMenuLayout.setLayoutParams(params);
- ((ViewGroup) mUI.getRootView()).addView(previewMenuLayout);
} else {
params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, size);
- previewMenuLayout.setLayoutParams(params);
- ((ViewGroup) mUI.getRootView()).addView(previewMenuLayout);
- previewMenuLayout.setY(display.getHeight() - size);
+
+ int rootViewBottom = rootView.getClientRectForOrientation(rotation).bottom;
+ basic.setY(rootViewBottom - size);
}
- basic.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
+ basic.setLayoutParams(params);
+ rootView.addView(basic);
+
LinearLayout layout = (LinearLayout) basic.findViewById(R.id.layout);
+ Rect insets = rootView.getInsetsForOrientation(rotation);
+ layout.setPadding(insets.left, insets.top, insets.right, insets.bottom);
+
final View[] views = new View[entries.length];
int init = pref.getCurrentIndex();
for (int i = 0; i < entries.length; i++) {
@@ -1019,7 +1016,6 @@ public class PhotoMenu extends MenuController
label.setText(entries[i]);
layout.addView(layout2);
}
- previewMenuLayout.addView(basic);
mPreviewMenu = basic;
}
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 5c13a7573..c26664c2f 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -92,7 +92,7 @@ public class PhotoUI implements PieListener,
private PhotoController mController;
private PreviewGestures mGestures;
- private View mRootView;
+ private CameraRootView mRootView;
private SurfaceHolder mSurfaceHolder;
private PopupWindow mPopup;
@@ -141,7 +141,7 @@ public class PhotoUI implements PieListener,
private View mPreviewCover;
private RotateLayout mMenuLayout;
private RotateLayout mSubMenuLayout;
- private LinearLayout mPreviewMenuLayout;
+ private ViewGroup mPreviewMenuLayout;
private boolean mUIhidden = false;
private int mPreviewOrientation = -1;
@@ -223,9 +223,8 @@ public class PhotoUI implements PieListener,
public PhotoUI(CameraActivity activity, PhotoController controller, View parent) {
mActivity = activity;
mController = controller;
- mRootView = parent;
- mActivity.getLayoutInflater().inflate(R.layout.photo_module,
- (ViewGroup) mRootView, true);
+ mRootView = (CameraRootView) parent;
+ mActivity.getLayoutInflater().inflate(R.layout.photo_module, mRootView, true);
mPreviewCover = mRootView.findViewById(R.id.preview_cover);
// display the view
mSurfaceView = (SurfaceView) mRootView.findViewById(R.id.mdp_preview_content);
@@ -485,7 +484,7 @@ public class PhotoUI implements PieListener,
mController.onPreviewUIDestroyed();
}
- public View getRootView() {
+ public CameraRootView getRootView() {
return mRootView;
}
@@ -792,7 +791,7 @@ public class PhotoUI implements PieListener,
return mMenuLayout;
}
- public void setPreviewMenuLayout(LinearLayout layout) {
+ public void setPreviewMenuLayout(ViewGroup layout) {
mPreviewMenuLayout = layout;
}
@@ -808,6 +807,7 @@ public class PhotoUI implements PieListener,
if (level == 1) {
if (mMenuLayout == null) {
mMenuLayout = new RotateLayout(mActivity, null);
+ mMenuLayout.setRootView(mRootView);
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
params = new FrameLayout.LayoutParams(
CameraActivity.SETTING_LIST_WIDTH_1, LayoutParams.WRAP_CONTENT,
@@ -818,15 +818,15 @@ public class PhotoUI implements PieListener,
Gravity.RIGHT | Gravity.TOP);
}
mMenuLayout.setLayoutParams(params);
- ((ViewGroup) mRootView).addView(mMenuLayout);
+ mRootView.addView(mMenuLayout);
}
- mMenuLayout.setOrientation(mOrientation, true);
mMenuLayout.addView(popup);
+ mMenuLayout.setOrientation(mOrientation, true);
}
if (level == 2) {
if (mSubMenuLayout == null) {
mSubMenuLayout = new RotateLayout(mActivity, null);
- ((ViewGroup) mRootView).addView(mSubMenuLayout);
+ mRootView.addView(mSubMenuLayout);
}
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
params = new FrameLayout.LayoutParams(
@@ -837,13 +837,14 @@ public class PhotoUI implements PieListener,
CameraActivity.SETTING_LIST_WIDTH_2, LayoutParams.WRAP_CONTENT,
Gravity.RIGHT | Gravity.TOP);
}
- int screenHeight = (mOrientation == 0 || mOrientation == 180)
- ? mRootView.getHeight() : mRootView.getWidth();
+
+ int containerHeight = mRootView.getClientRectForOrientation(mOrientation).height();
int height = ((ListSubMenu) popup).getPreCalculatedHeight();
- int yBase = ((ListSubMenu) popup).getYBase();
- int y = Math.max(0, yBase);
- if (yBase + height > screenHeight)
- y = Math.max(0, screenHeight - height);
+ int yBase = ((ListSubMenu) popup).getYBase(), y = yBase;
+ if (yBase + height > containerHeight) {
+ y = Math.max(0, containerHeight - height);
+ }
+
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
params.setMargins(CameraActivity.SETTING_LIST_WIDTH_1, y, 0, 0);
} else {
@@ -852,8 +853,8 @@ public class PhotoUI implements PieListener,
mSubMenuLayout.setLayoutParams(params);
- mSubMenuLayout.addView(popup);
mSubMenuLayout.setOrientation(mOrientation, true);
+ mSubMenuLayout.addView(popup);
}
if (animate) {
if (level == 1)
@@ -920,14 +921,14 @@ public class PhotoUI implements PieListener,
public void dismissLevel1() {
if (mMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mMenuLayout);
+ mRootView.removeView(mMenuLayout);
mMenuLayout = null;
}
}
public void dismissLevel2() {
if (mSubMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mSubMenuLayout);
+ mRootView.removeView(mSubMenuLayout);
mSubMenuLayout = null;
}
}
@@ -946,14 +947,14 @@ public class PhotoUI implements PieListener,
public void dismissSceneModeMenu() {
if (mPreviewMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
+ mRootView.removeView(mPreviewMenuLayout);
mPreviewMenuLayout = null;
}
}
public void removeSceneModeMenu() {
if (mPreviewMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
+ mRootView.removeView(mPreviewMenuLayout);
mPreviewMenuLayout = null;
}
cleanupListview();
@@ -1095,9 +1096,8 @@ public class PhotoUI implements PieListener,
// Countdown timer
private void initializeCountDown() {
- mActivity.getLayoutInflater().inflate(R.layout.count_down_to_capture,
- (ViewGroup) mRootView, true);
- mCountDownView = (CountDownView) (mRootView.findViewById(R.id.count_down_to_capture));
+ mActivity.getLayoutInflater().inflate(R.layout.count_down_to_capture, mRootView, true);
+ mCountDownView = (CountDownView) mRootView.findViewById(R.id.count_down_to_capture);
mCountDownView.setCountDownFinishedListener((OnCountDownFinishedListener) mController);
mCountDownView.bringToFront();
mCountDownView.setOrientation(mOrientation);
@@ -1121,7 +1121,7 @@ public class PhotoUI implements PieListener,
public void startSelfieFlash() {
if(mSelfieView == null)
- mSelfieView = (SelfieFlashView) (mRootView.findViewById(R.id.selfie_flash));
+ mSelfieView = (SelfieFlashView) mRootView.findViewById(R.id.selfie_flash);
mSelfieView.bringToFront();
mSelfieView.open();
mScreenBrightness = setScreenBrightness(1F);
@@ -1129,7 +1129,7 @@ public class PhotoUI implements PieListener,
public void stopSelfieFlash() {
if(mSelfieView == null)
- mSelfieView = (SelfieFlashView) (mRootView.findViewById(R.id.selfie_flash));
+ mSelfieView = (SelfieFlashView) mRootView.findViewById(R.id.selfie_flash);
mSelfieView.close();
if(mScreenBrightness != 0.0f)
setScreenBrightness(mScreenBrightness);
@@ -1178,11 +1178,11 @@ public class PhotoUI implements PieListener,
}
public void initDisplayChangeListener() {
- ((CameraRootView) mRootView).setDisplayChangeListener(this);
+ mRootView.setDisplayChangeListener(this);
}
public void removeDisplayChangeListener() {
- ((CameraRootView) mRootView).removeDisplayChangeListener();
+ mRootView.removeDisplayChangeListener();
}
public FocusRing getFocusRing() {
@@ -1241,8 +1241,6 @@ public class PhotoUI implements PieListener,
mSubMenuLayout.setOrientation(orientation, animation);
if (mPreviewMenuLayout != null) {
ViewGroup vg = (ViewGroup) mPreviewMenuLayout.getChildAt(0);
- if (vg != null)
- vg = (ViewGroup) vg.getChildAt(0);
if (vg != null) {
for (int i = vg.getChildCount() - 1; i >= 0; --i) {
RotateLayout l = (RotateLayout) vg.getChildAt(i);
diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java
index 5abb727ee..15d1839cb 100644
--- a/src/com/android/camera/VideoMenu.java
+++ b/src/com/android/camera/VideoMenu.java
@@ -38,6 +38,7 @@ import android.widget.LinearLayout;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
+import com.android.camera.ui.CameraRootView;
import com.android.camera.ui.ListSubMenu;
import com.android.camera.ui.ListMenu;
import com.android.camera.ui.TimeIntervalPopup;
@@ -47,8 +48,6 @@ import org.codeaurora.snapcam.R;
import android.widget.HorizontalScrollView;
import android.widget.Toast;
import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.Display;
import com.android.camera.ui.RotateLayout;
import com.android.camera.util.CameraUtil;
import android.text.TextUtils;
@@ -549,8 +548,6 @@ public class VideoMenu extends MenuController
if (!mIsDefaultToPortrait) {
rotation = (rotation + 90) % 360;
}
- WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
CharSequence[] entries = pref.getEntries();
Resources r = mActivity.getResources();
@@ -581,22 +578,23 @@ public class VideoMenu extends MenuController
gridRes, null, false);
mUI.dismissSceneModeMenu();
- LinearLayout previewMenuLayout = new LinearLayout(mActivity);
- mUI.setPreviewMenuLayout(previewMenuLayout);
+ mUI.setPreviewMenuLayout(basic);
ViewGroup.LayoutParams params = null;
+ CameraRootView rootView = mUI.getRootView();
if (portrait) {
params = new ViewGroup.LayoutParams(size, LayoutParams.MATCH_PARENT);
- previewMenuLayout.setLayoutParams(params);
- ((ViewGroup) mUI.getRootView()).addView(previewMenuLayout);
} else {
params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, size);
- previewMenuLayout.setLayoutParams(params);
- ((ViewGroup) mUI.getRootView()).addView(previewMenuLayout);
- previewMenuLayout.setY(display.getHeight() - size);
+
+ int rootViewBottom = rootView.getClientRectForOrientation(rotation).bottom;
+ basic.setY(rootViewBottom - size);
}
- basic.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
+ basic.setLayoutParams(params);
+ rootView.addView(basic);
+
LinearLayout layout = (LinearLayout) basic.findViewById(R.id.layout);
+ Rect insets = rootView.getInsetsForOrientation(rotation);
+ layout.setPadding(insets.left, insets.top, insets.right, insets.bottom);
final View[] views = new View[entries.length];
int init = pref.getCurrentIndex();
@@ -635,7 +633,6 @@ public class VideoMenu extends MenuController
label.setText(entries[i]);
layout.addView(layout2);
}
- previewMenuLayout.addView(basic);
mPreviewMenu = basic;
}
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index 778e067a2..0883f5fac 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -68,7 +68,7 @@ public class VideoUI implements PieRenderer.PieListener,
// module fields
private final FocusRing mFocusRing;
private CameraActivity mActivity;
- private View mRootView;
+ private CameraRootView mRootView;
private SurfaceHolder mSurfaceHolder;
// An review image having same size as preview. It is displayed when
// recording is stopped in capture intent.
@@ -102,7 +102,7 @@ public class VideoUI implements PieRenderer.PieListener,
private boolean mIsTimeLapse = false;
private RotateLayout mMenuLayout;
private RotateLayout mSubMenuLayout;
- private LinearLayout mPreviewMenuLayout;
+ private ViewGroup mPreviewMenuLayout;
private View mPreviewCover;
private SurfaceView mSurfaceView = null;
@@ -171,9 +171,8 @@ public class VideoUI implements PieRenderer.PieListener,
public VideoUI(CameraActivity activity, VideoController controller, View parent) {
mActivity = activity;
mController = controller;
- mRootView = parent;
- mActivity.getLayoutInflater().inflate(R.layout.video_module,
- (ViewGroup) mRootView, true);
+ mRootView = (CameraRootView) parent;
+ mActivity.getLayoutInflater().inflate(R.layout.video_module, mRootView, true);
mPreviewCover = mRootView.findViewById(R.id.preview_cover);
// display the view
mSurfaceView = (SurfaceView) mRootView.findViewById(R.id.mdp_preview_content);
@@ -264,7 +263,7 @@ public class VideoUI implements PieRenderer.PieListener,
public void initializeSurfaceView() {
if (mSurfaceView == null) {
mSurfaceView = new SurfaceView(mActivity);
- ((ViewGroup) mRootView).addView(mSurfaceView, 0);
+ mRootView.addView(mSurfaceView, 0);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
}
@@ -520,7 +519,7 @@ public class VideoUI implements PieRenderer.PieListener,
}
public void initDisplayChangeListener() {
- ((CameraRootView) mRootView).setDisplayChangeListener(this);
+ mRootView.setDisplayChangeListener(this);
}
public void setDisplayOrientation(int orientation) {
@@ -533,7 +532,7 @@ public class VideoUI implements PieRenderer.PieListener,
}
public void removeDisplayChangeListener() {
- ((CameraRootView) mRootView).removeDisplayChangeListener();
+ mRootView.removeDisplayChangeListener();
}
// no customvideo?
@@ -686,14 +685,14 @@ public class VideoUI implements PieRenderer.PieListener,
public void dismissLevel1() {
if (mMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mMenuLayout);
+ mRootView.removeView(mMenuLayout);
mMenuLayout = null;
}
}
public void dismissLevel2() {
if (mSubMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mSubMenuLayout);
+ mRootView.removeView(mSubMenuLayout);
mSubMenuLayout = null;
}
}
@@ -712,14 +711,14 @@ public class VideoUI implements PieRenderer.PieListener,
public void dismissSceneModeMenu() {
if (mPreviewMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
+ mRootView.removeView(mPreviewMenuLayout);
mPreviewMenuLayout = null;
}
}
public void removeSceneModeMenu() {
if (mPreviewMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
+ mRootView.removeView(mPreviewMenuLayout);
mPreviewMenuLayout = null;
}
cleanupListview();
@@ -740,6 +739,7 @@ public class VideoUI implements PieRenderer.PieListener,
if (level == 1) {
if (mMenuLayout == null) {
mMenuLayout = new RotateLayout(mActivity, null);
+ mMenuLayout.setRootView(mRootView);
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
layoutParams = new FrameLayout.LayoutParams(
CameraActivity.SETTING_LIST_WIDTH_1, LayoutParams.WRAP_CONTENT,
@@ -750,10 +750,10 @@ public class VideoUI implements PieRenderer.PieListener,
Gravity.RIGHT | Gravity.TOP);
}
mMenuLayout.setLayoutParams(layoutParams);
- ((ViewGroup) mRootView).addView(mMenuLayout);
+ mRootView.addView(mMenuLayout);
}
- mMenuLayout.setOrientation(mOrientation, true);
mMenuLayout.addView(popup);
+ mMenuLayout.setOrientation(mOrientation, true);
}
if (level == 2) {
if (mSubMenuLayout == null) {
@@ -762,7 +762,7 @@ public class VideoUI implements PieRenderer.PieListener,
CameraActivity.SETTING_LIST_WIDTH_2, LayoutParams.WRAP_CONTENT);
mSubMenuLayout.setLayoutParams(params);
- ((ViewGroup) mRootView).addView(mSubMenuLayout);
+ mRootView.addView(mSubMenuLayout);
}
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
layoutParams = new FrameLayout.LayoutParams(
@@ -774,13 +774,14 @@ public class VideoUI implements PieRenderer.PieListener,
Gravity.RIGHT | Gravity.TOP);
}
- int screenHeight = (mOrientation == 0 || mOrientation == 180)
- ? mRootView.getHeight() : mRootView.getWidth();
+ final int containerHeight =
+ mRootView.getClientRectForOrientation(mOrientation).height();
int height = ((ListSubMenu) popup).getPreCalculatedHeight();
- int yBase = ((ListSubMenu) popup).getYBase();
- int y = Math.max(0, yBase);
- if (yBase + height > screenHeight)
- y = Math.max(0, screenHeight - height);
+ int yBase = ((ListSubMenu) popup).getYBase(), y = yBase;
+ if (yBase + height > containerHeight) {
+ y = Math.max(0, containerHeight - height);
+ }
+
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
layoutParams.setMargins(CameraActivity.SETTING_LIST_WIDTH_1, y, 0, 0);
} else {
@@ -805,7 +806,7 @@ public class VideoUI implements PieRenderer.PieListener,
return mMenuLayout;
}
- public void setPreviewMenuLayout(LinearLayout layout) {
+ public void setPreviewMenuLayout(ViewGroup layout) {
mPreviewMenuLayout = layout;
}
@@ -1050,7 +1051,7 @@ public class VideoUI implements PieRenderer.PieListener,
mController.onPreviewUIDestroyed();
}
- public View getRootView() {
+ public CameraRootView getRootView() {
return mRootView;
}
@@ -1103,8 +1104,6 @@ public class VideoUI implements PieRenderer.PieListener,
}
if (mPreviewMenuLayout != null) {
ViewGroup vg = (ViewGroup) mPreviewMenuLayout.getChildAt(0);
- if (vg != null)
- vg = (ViewGroup) vg.getChildAt(0);
if (vg != null) {
for (int i = vg.getChildCount() - 1; i >= 0; --i) {
RotateLayout l = (RotateLayout) vg.getChildAt(i);
diff --git a/src/com/android/camera/ui/CameraRootView.java b/src/com/android/camera/ui/CameraRootView.java
index cd30e8e4f..6bf062b6c 100644
--- a/src/com/android/camera/ui/CameraRootView.java
+++ b/src/com/android/camera/ui/CameraRootView.java
@@ -37,6 +37,7 @@ public class CameraRootView extends FrameLayout {
private Object mDisplayListener;
private MyDisplayListener mListener;
private Rect mLastInsets = new Rect();
+ private Rect mTmpRect = new Rect();
public interface MyDisplayListener {
public void onDisplayChanged();
@@ -81,6 +82,40 @@ public class CameraRootView extends FrameLayout {
}
}
+ public Rect getInsetsForOrientation(int orientation) {
+ switch (orientation) {
+ case 90:
+ mTmpRect.set(mLastInsets.top, mLastInsets.right,
+ mLastInsets.bottom, mLastInsets.left);
+ break;
+ case 180:
+ mTmpRect.set(mLastInsets.right, mLastInsets.bottom,
+ mLastInsets.left, mLastInsets.top);
+ break;
+ case 270:
+ mTmpRect.set(mLastInsets.bottom, mLastInsets.left,
+ mLastInsets.top, mLastInsets.right);
+ break;
+ default:
+ mTmpRect.set(mLastInsets);
+ break;
+ }
+
+ return mTmpRect;
+ }
+
+ public Rect getClientRectForOrientation(int orientation) {
+ Rect result = getInsetsForOrientation(orientation);
+ if (orientation == 90 || orientation == 270) {
+ result.right = getHeight() - result.right;
+ result.bottom = getWidth() - result.bottom;
+ } else {
+ result.right = getWidth() - result.right;
+ result.bottom = getHeight() - result.bottom;
+ }
+ return result;
+ }
+
public void removeDisplayChangeListener() {
mListener = null;
}
diff --git a/src/com/android/camera/ui/ListMenu.java b/src/com/android/camera/ui/ListMenu.java
index a1e145797..942822fec 100644
--- a/src/com/android/camera/ui/ListMenu.java
+++ b/src/com/android/camera/ui/ListMenu.java
@@ -22,6 +22,7 @@ package com.android.camera.ui;
import java.util.ArrayList;
import android.content.Context;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
@@ -31,6 +32,7 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
+import android.widget.Space;
import com.android.camera.ListPreference;
import com.android.camera.PreferenceGroup;
@@ -38,13 +40,13 @@ import org.codeaurora.snapcam.R;
/* A popup window that contains several camera settings. */
public class ListMenu extends ListView
- implements ListMenuItem.Listener,
- AdapterView.OnItemClickListener {
+ implements ListMenuItem.Listener, AdapterView.OnItemClickListener, RotateLayout.Child {
@SuppressWarnings("unused")
private static final String TAG = "ListMenu";
private int mHighlighted = -1;
private Listener mListener;
private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>();
+ private View mHeader, mFooter;
// Keep track of which setting items are disabled
// e.g. White balance will be disabled when scene mode is set to non-auto
@@ -109,6 +111,30 @@ public class ListMenu extends ListView
}
}
+ @Override
+ public void onApplyWindowInsets(Rect insets) {
+ if (mHeader == null) {
+ mHeader = new Space(getContext());
+ addHeaderView(mHeader);
+ setHeaderDividersEnabled(false);
+ mFooter = new Space(getContext());
+ addFooterView(mFooter);
+ setFooterDividersEnabled(false);
+ }
+
+ adjustViewHeight(mHeader, insets.top);
+ adjustViewHeight(mFooter, insets.bottom);
+ }
+
+ private void adjustViewHeight(View view, int height) {
+ ViewGroup.LayoutParams lp = view.getLayoutParams();
+ if (lp == null) {
+ lp = generateDefaultLayoutParams();
+ }
+ lp.height = height;
+ view.setLayoutParams(lp);
+ }
+
public void setSettingChangedListener(Listener listener) {
mListener = listener;
}
@@ -204,7 +230,8 @@ public class ListMenu extends ListView
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
- if (mListener != null) {
+ position -= getHeaderViewsCount();
+ if (mListener != null && position < mListItem.size()) {
resetHighlight();
ListPreference pref = mListItem.get(position);
mHighlighted = position;
diff --git a/src/com/android/camera/ui/RotateLayout.java b/src/com/android/camera/ui/RotateLayout.java
index e394aba0b..61bcf2282 100644
--- a/src/com/android/camera/ui/RotateLayout.java
+++ b/src/com/android/camera/ui/RotateLayout.java
@@ -18,6 +18,7 @@ package com.android.camera.ui;
import android.content.Context;
import android.graphics.Matrix;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
@@ -32,6 +33,11 @@ public class RotateLayout extends ViewGroup implements Rotatable {
private int mOrientation;
private Matrix mMatrix = new Matrix();
protected View mChild;
+ private CameraRootView mRootView;
+
+ public interface Child {
+ void onApplyWindowInsets(Rect insets);
+ }
public RotateLayout(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -42,6 +48,10 @@ public class RotateLayout extends ViewGroup implements Rotatable {
setBackgroundResource(android.R.color.transparent);
}
+ public void setRootView(CameraRootView rootView) {
+ mRootView = rootView;
+ }
+
@Override
protected void onFinishInflate() {
setupChild(getChildAt(0));
@@ -52,6 +62,7 @@ public class RotateLayout extends ViewGroup implements Rotatable {
mChild = child;
child.setPivotX(0);
child.setPivotY(0);
+ applyInsetsToChild();
}
}
@@ -145,10 +156,19 @@ public class RotateLayout extends ViewGroup implements Rotatable {
}
}
mOrientation = orientation;
+ applyInsetsToChild();
+
if (mChild != null)
requestLayout();
}
+ private void applyInsetsToChild() {
+ if (mRootView != null && mChild instanceof Child) {
+ Rect insets = mRootView.getInsetsForOrientation(mOrientation);
+ ((Child) mChild).onApplyWindowInsets(insets);
+ }
+ }
+
public int getOrientation() {
return mOrientation;
}