1 package com.android.camera.app; 2 3 import android.content.res.Configuration; 4 5 /** 6 * An interface which defines the orientation manager. 7 */ 8 public interface OrientationManager { 9 public static enum DeviceNaturalOrientation { 10 PORTRAIT(Configuration.ORIENTATION_PORTRAIT), 11 LANDSCAPE(Configuration.ORIENTATION_LANDSCAPE); 12 13 private final int mOrientation; 14 private DeviceNaturalOrientation(int orientation) { 15 mOrientation = orientation; 16 } 17 } 18 19 public static enum DeviceOrientation { 20 CLOCKWISE_0(0), 21 CLOCKWISE_90(90), 22 CLOCKWISE_180(180), 23 CLOCKWISE_270(270); 24 25 private final int mDegrees; 26 27 private DeviceOrientation(int degrees) { 28 mDegrees = degrees; 29 } 30 31 /** 32 * Returns the degree in clockwise. 33 */ 34 public int getDegrees() { 35 return mDegrees; 36 } 37 38 /** 39 * Turns a degree value (0, 90, 180, 270) into one of CLOCKWISE_0, 40 * CLOCKWISE_90, CLOCKWISE_180 or CLOCKWISE_270. If any other degree 41 * value is given, the closest orientation of CLOCKWISE_0, CLOCKWISE_90, 42 * CLOCKWISE_180, and CLOCKWISE_270 to the angular value is returned. 43 */ 44 public static DeviceOrientation from(int degrees) { 45 switch (degrees) { 46 case (-1): // UNKNOWN Orientation 47 // Explicitly default to CLOCKWISE_0, when Orientation is UNKNOWN 48 return CLOCKWISE_0; 49 case 0: 50 return CLOCKWISE_0; 51 case 90: 52 return CLOCKWISE_90; 53 case 180: 54 return CLOCKWISE_180; 55 case 270: 56 return CLOCKWISE_270; 57 default: 58 int normalizedDegrees = (Math.abs(degrees / 360) * 360 + 360 + degrees) % 360; 59 if (normalizedDegrees > 315 || normalizedDegrees <= 45) { 60 return CLOCKWISE_0; 61 } else if (normalizedDegrees > 45 && normalizedDegrees <= 135) { 62 return CLOCKWISE_90; 63 } else if (normalizedDegrees > 135 && normalizedDegrees <= 225) { 64 return CLOCKWISE_180; 65 } else { 66 return CLOCKWISE_270; 67 } 68 } 69 } 70 } 71 72 public interface OnOrientationChangeListener { 73 /** 74 * Called when the orientation changes. 75 * 76 * @param orientationManager The orientation manager detects the change. 77 * @param orientation The new rounded orientation. 78 */ 79 public void onOrientationChanged(OrientationManager orientationManager, 80 DeviceOrientation orientation); 81 } 82 83 /** 84 * Adds the 85 * {@link com.android.camera.app.OrientationManager.OnOrientationChangeListener}. 86 */ 87 public void addOnOrientationChangeListener(OnOrientationChangeListener listener); 88 89 /** 90 * Removes the listener. 91 */ 92 public void removeOnOrientationChangeListener(OnOrientationChangeListener listener); 93 94 /** 95 * Returns the device natural orientation. 96 */ 97 public DeviceNaturalOrientation getDeviceNaturalOrientation(); 98 99 /** 100 * Returns the current rounded device orientation. 101 */ 102 public DeviceOrientation getDeviceOrientation(); 103 104 /** 105 * Returns the current display rotation. 106 */ 107 public DeviceOrientation getDisplayRotation(); 108 109 /** 110 * Returns whether the device is in landscape based on the natural orientation 111 * and rotation from natural orientation. 112 */ 113 public boolean isInLandscape(); 114 115 /** 116 * Returns whether the device is in portrait based on the natural orientation 117 * and rotation from natural orientation. 118 */ 119 public boolean isInPortrait(); 120 121 /** 122 * Lock the framework orientation to the current device orientation 123 * rotates. No effect if the system setting of auto-rotation is off. 124 */ 125 void lockOrientation(); 126 127 /** 128 * Unlock the framework orientation, so it can change when the device 129 * rotates. No effect if the system setting of auto-rotation is off. 130 */ 131 void unlockOrientation(); 132 133 /** 134 * Return whether the orientation is locked by the app or the system. 135 */ 136 boolean isOrientationLocked(); 137 } 138