18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/*
28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2010 The Android Open Source Project
38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License.
68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at
78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software
118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and
148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License.
158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */
168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera.ui;
188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Context;
208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.Matrix;
218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.AttributeSet;
228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View;
238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.ViewGroup;
248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
252bca210e5fc8a77685775ffb403096167b017dceAngus Kongimport com.android.camera.debug.Log;
262bca210e5fc8a77685775ffb403096167b017dceAngus Kong
278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb// A RotateLayout is designed to display a single item and provides the
288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb// capabilities to rotate the item.
298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class RotateLayout extends ViewGroup implements Rotatable {
308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @SuppressWarnings("unused")
312bca210e5fc8a77685775ffb403096167b017dceAngus Kong    private static final Log.Tag TAG = new Log.Tag("RotateLayout");
328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private int mOrientation;
338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private Matrix mMatrix = new Matrix();
348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected View mChild;
358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public RotateLayout(Context context, AttributeSet attrs) {
378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        super(context, attrs);
388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // The transparent background here is a workaround of the render issue
398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // happened when the view is rotated as the device's orientation
408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // changed. The view looks fine in landscape. After rotation, the view
418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // is invisible.
428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        setBackgroundResource(android.R.color.transparent);
438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected void onFinishInflate() {
478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mChild = getChildAt(0);
48638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling        mChild.setPivotX(0);
49638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling        mChild.setPivotY(0);
508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected void onLayout(
548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            boolean change, int left, int top, int right, int bottom) {
558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int width = right - left;
568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int height = bottom - top;
578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        switch (mOrientation) {
588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 0:
598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 180:
608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                mChild.layout(0, 0, width, height);
618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                break;
628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 90:
638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 270:
648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                mChild.layout(0, 0, height, width);
658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                break;
668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected void onMeasure(int widthSpec, int heightSpec) {
718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int w = 0, h = 0;
728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        switch(mOrientation) {
738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 0:
748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 180:
758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                measureChild(mChild, widthSpec, heightSpec);
768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                w = mChild.getMeasuredWidth();
778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                h = mChild.getMeasuredHeight();
788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                break;
798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 90:
808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            case 270:
818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                measureChild(mChild, heightSpec, widthSpec);
828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                w = mChild.getMeasuredHeight();
838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                h = mChild.getMeasuredWidth();
848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                break;
858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        setMeasuredDimension(w, h);
878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
88638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling        switch (mOrientation) {
89638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling            case 0:
90638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationX(0);
91638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationY(0);
92638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                break;
93638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling            case 90:
94638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationX(0);
95638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationY(h);
96638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                break;
97638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling            case 180:
98638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationX(w);
99638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationY(h);
100638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                break;
101638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling            case 270:
102638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationX(w);
103638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                mChild.setTranslationY(0);
104638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling                break;
1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
106638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling        mChild.setRotation(-mOrientation);
1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public boolean shouldDelayChildPressedState() {
1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return false;
1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    // Rotate the view counter-clockwise
1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void setOrientation(int orientation, boolean animation) {
1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        orientation = orientation % 360;
1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (mOrientation == orientation) return;
1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOrientation = orientation;
1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        requestLayout();
1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public int getOrientation() {
1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return mOrientation;
1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb}
127