summaryrefslogtreecommitdiff
path: root/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java')
-rw-r--r--java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java86
1 files changed, 86 insertions, 0 deletions
diff --git a/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java b/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java
new file mode 100644
index 000000000..ad7d94d95
--- /dev/null
+++ b/java/com/android/incallui/answer/impl/FixedAspectSurfaceView.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 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.incallui.answer.impl;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.SurfaceView;
+import android.view.View;
+import com.android.dialer.common.Assert;
+
+/**
+ * A SurfaceView that maintains its aspect ratio to be a desired target value.
+ *
+ * <p>The FixedAspectSurfaceView will not be able to maintain the requested aspect ratio if both the
+ * width and the height are exactly determined by the layout. To avoid this, ensure that either the
+ * height or the width is adjustable by the view; for example, by setting the layout parameters to
+ * be WRAP_CONTENT for the dimension that is best adjusted to maintain the aspect ratio.
+ */
+public class FixedAspectSurfaceView extends SurfaceView {
+
+ /** Desired width/height ratio */
+ private float mAspectRatio;
+
+ private final boolean scaleWidth;
+ private final boolean scaleHeight;
+
+ public FixedAspectSurfaceView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ // Get initial aspect ratio from custom attributes
+ TypedArray a =
+ context.getTheme().obtainStyledAttributes(attrs, R.styleable.FixedAspectSurfaceView, 0, 0);
+ scaleHeight = a.getBoolean(R.styleable.FixedAspectSurfaceView_scaleHeight, false);
+ scaleWidth = a.getBoolean(R.styleable.FixedAspectSurfaceView_scaleWidth, false);
+ Assert.checkArgument(scaleHeight != scaleWidth, "Must either scale width or height");
+ setAspectRatio(a.getFloat(R.styleable.FixedAspectSurfaceView_aspectRatio, 1.f));
+ a.recycle();
+ }
+
+ /**
+ * Set the desired aspect ratio for this view.
+ *
+ * @param aspect the desired width/height ratio in the current UI orientation. Must be a positive
+ * value.
+ */
+ public void setAspectRatio(float aspect) {
+ Assert.checkArgument(aspect >= 0, "Aspect ratio must be positive");
+ mAspectRatio = aspect;
+ requestLayout();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+
+ // Do the scaling
+ if (scaleWidth) {
+ width = (int) (height * mAspectRatio);
+ } else if (scaleHeight) {
+ height = (int) (width / mAspectRatio);
+ }
+
+ // Override width/height if needed for EXACTLY and AT_MOST specs
+ width = View.resolveSizeAndState(width, widthMeasureSpec, 0);
+ height = View.resolveSizeAndState(height, heightMeasureSpec, 0);
+
+ // Finally set the calculated dimensions
+ setMeasuredDimension(width, height);
+ }
+}