Util.java revision c97d23826a28dd725951eccb62651244f9fb8228
1101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin/* 2101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * Copyright (C) 2009 The Android Open Source Project 3101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * 4101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * you may not use this file except in compliance with the License. 6101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * You may obtain a copy of the License at 7101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * 8101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * http://www.apache.org/licenses/LICENSE-2.0 9101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * 10101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * Unless required by applicable law or agreed to in writing, software 11101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * See the License for the specific language governing permissions and 14101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * limitations under the License. 15101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin */ 16101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 17937fc48b37fafe3ffc8f4b52bd9a171bbb4d3a37Owen Linpackage com.android.camera; 18101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 193f3c857e3f34650c15d764810335024654b0fcc3Owen Linimport android.app.Activity; 203f3c857e3f34650c15d764810335024654b0fcc3Owen Linimport android.app.AlertDialog; 213f3c857e3f34650c15d764810335024654b0fcc3Owen Linimport android.content.DialogInterface; 22101d528d59f447847d5c6b7578642132c2b76f4fOwen Linimport android.graphics.Bitmap; 23101d528d59f447847d5c6b7578642132c2b76f4fOwen Linimport android.graphics.BitmapFactory; 24101d528d59f447847d5c6b7578642132c2b76f4fOwen Linimport android.graphics.Matrix; 25101d528d59f447847d5c6b7578642132c2b76f4fOwen Linimport android.util.Log; 26ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Changimport android.view.Surface; 27601ce56b034f111b2875e7636776f2f359f6a156Owen Linimport android.view.View; 282c6c6174e2363fccb4e4f29b76290e99234fe140Owen Linimport android.view.animation.Animation; 292c6c6174e2363fccb4e4f29b76290e99234fe140Owen Linimport android.view.animation.TranslateAnimation; 30101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 313f3c857e3f34650c15d764810335024654b0fcc3Owen Linimport com.android.camera.gallery.IImage; 32e480f77352d670b2892a9b7b7cd503838b71ca9fRomain Guyimport com.android.camera.R; 333f3c857e3f34650c15d764810335024654b0fcc3Owen Lin 34101d528d59f447847d5c6b7578642132c2b76f4fOwen Linimport java.io.Closeable; 35101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 36101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin/** 37101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin * Collection of utility functions used in this package. 38101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin */ 39101d528d59f447847d5c6b7578642132c2b76f4fOwen Linpublic class Util { 4034fe2a9d33a5b4ce49862ce4558a36c62ba6d540Chih-Chung Chang private static final String TAG = "Util"; 412c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin public static final int DIRECTION_LEFT = 0; 422c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin public static final int DIRECTION_RIGHT = 1; 432c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin public static final int DIRECTION_UP = 2; 442c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin public static final int DIRECTION_DOWN = 3; 45101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 4635688439f40f00a1376dcfab6e6495989d82e433Wei-Ta Chen public static final String REVIEW_ACTION = "com.cooliris.media.action.REVIEW"; 4735688439f40f00a1376dcfab6e6495989d82e433Wei-Ta Chen 48101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin private Util() { 49101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 50101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 51101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin // Rotates the bitmap by the specified degree. 52101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin // If a new bitmap is created, the original bitmap is recycled. 53101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin public static Bitmap rotate(Bitmap b, int degrees) { 54101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin if (degrees != 0 && b != null) { 55101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin Matrix m = new Matrix(); 56101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin m.setRotate(degrees, 57101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin (float) b.getWidth() / 2, (float) b.getHeight() / 2); 58101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin try { 59101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin Bitmap b2 = Bitmap.createBitmap( 60101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin b, 0, 0, b.getWidth(), b.getHeight(), m, true); 61101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin if (b != b2) { 62101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin b.recycle(); 63101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin b = b2; 64101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 65101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } catch (OutOfMemoryError ex) { 66101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin // We have no memory to rotate. Return the original bitmap. 67101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 68101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 69101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin return b; 70101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 71101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 72101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin /* 73ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * Compute the sample size as a function of minSideLength 74ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * and maxNumOfPixels. 753c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * minSideLength is used to specify that minimal width or height of a 763c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * bitmap. 773c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * maxNumOfPixels is used to specify the maximal size in pixels that is 783c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * tolerable in terms of memory usage. 79ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * 80ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * The function returns a sample size based on the constraints. 81ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * Both size and minSideLength can be passed in as IImage.UNCONSTRAINED, 82ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * which indicates no care of the corresponding constraint. 83ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * The functions prefers returning a sample size that 84ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang * generates a smaller bitmap, unless minSideLength = IImage.UNCONSTRAINED. 853c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * 863c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * Also, the function rounds up the sample size to a power of 2 or multiple 873c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * of 8 because BitmapFactory only honors sample size this way. 883c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * For example, BitmapFactory downsamples an image by 2 even though the 893c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen * request is 3. So we round up the sample size to avoid OOM. 90101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin */ 91ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang public static int computeSampleSize(BitmapFactory.Options options, 92ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang int minSideLength, int maxNumOfPixels) { 933c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen int initialSize = computeInitialSampleSize(options, minSideLength, 943c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen maxNumOfPixels); 953c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen 963c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen int roundedSize; 97522e836abc90bcb2d4e7a4ac37e269154d06c715Chih-Chung Chang if (initialSize <= 8) { 983c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen roundedSize = 1; 993c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen while (roundedSize < initialSize) { 1003c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen roundedSize <<= 1; 1013c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen } 1023c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen } else { 1033c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen roundedSize = (initialSize + 7) / 8 * 8; 1043c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen } 1053c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen 1063c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen return roundedSize; 1073c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen } 1083c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen 1093c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen private static int computeInitialSampleSize(BitmapFactory.Options options, 1103c21008c953cf6177f7771c176fa81d336e74ed8Wei-Ta Chen int minSideLength, int maxNumOfPixels) { 111ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang double w = options.outWidth; 112ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang double h = options.outHeight; 113ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang 114ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang int lowerBound = (maxNumOfPixels == IImage.UNCONSTRAINED) ? 1 : 115ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); 116ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang int upperBound = (minSideLength == IImage.UNCONSTRAINED) ? 128 : 117ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang (int) Math.min(Math.floor(w / minSideLength), 118ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang Math.floor(h / minSideLength)); 119ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang 120f2c7e983fafaf7639a6ad090a93d1892015777edWei-Ta Chen if (upperBound < lowerBound) { 121f2c7e983fafaf7639a6ad090a93d1892015777edWei-Ta Chen // return the larger one when there is no overlapping zone. 122f2c7e983fafaf7639a6ad090a93d1892015777edWei-Ta Chen return lowerBound; 123f2c7e983fafaf7639a6ad090a93d1892015777edWei-Ta Chen } 124f2c7e983fafaf7639a6ad090a93d1892015777edWei-Ta Chen 125ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang if ((maxNumOfPixels == IImage.UNCONSTRAINED) && 126ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang (minSideLength == IImage.UNCONSTRAINED)) { 127ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang return 1; 128ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang } else if (minSideLength == IImage.UNCONSTRAINED) { 129ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang return lowerBound; 130ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang } else { 131ce033a5871a0b678521411f9a3acaee2ab279178Chih-Chung Chang return upperBound; 132101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 133101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 134101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 135bbc2f2f15a865cf0330cd78a6ea67177c5863b3bOwen Lin public static <T> int indexOf(T [] array, T s) { 136101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin for (int i = 0; i < array.length; i++) { 137101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin if (array[i].equals(s)) { 138101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin return i; 139101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 140101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 141101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin return -1; 142101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 143101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 144724e9b3db93677b753c1267a716e30e6cf5ff3b6Chih-Chung Chang public static void closeSilently(Closeable c) { 145101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin if (c == null) return; 146101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin try { 147101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin c.close(); 148101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } catch (Throwable t) { 149101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin // do nothing 150101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 151101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin } 152101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin 153cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang public static Bitmap makeBitmap(byte[] jpegData, int maxNumOfPixels) { 154cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang try { 155cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang BitmapFactory.Options options = new BitmapFactory.Options(); 156cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options.inJustDecodeBounds = true; 157cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length, 158cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options); 159cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang if (options.mCancel || options.outWidth == -1 160cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang || options.outHeight == -1) { 161cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang return null; 162cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang } 163cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options.inSampleSize = computeSampleSize( 164cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options, IImage.UNCONSTRAINED, maxNumOfPixels); 165cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options.inJustDecodeBounds = false; 166cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang 167cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options.inDither = false; 168cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options.inPreferredConfig = Bitmap.Config.ARGB_8888; 169cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang return BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length, 170cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang options); 171cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang } catch (OutOfMemoryError ex) { 172cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang Log.e(TAG, "Got oom exception ", ex); 173cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang return null; 174cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang } 175c1c20e9ce386c1f660059acaede591d2d718995aChih-Chung Chang } 176c1c20e9ce386c1f660059acaede591d2d718995aChih-Chung Chang 177341ad98e59d92769e1cc8ba68fa86c72dce0543bChih-Chung Chang public static void Assert(boolean cond) { 178341ad98e59d92769e1cc8ba68fa86c72dce0543bChih-Chung Chang if (!cond) { 179341ad98e59d92769e1cc8ba68fa86c72dce0543bChih-Chung Chang throw new AssertionError(); 180341ad98e59d92769e1cc8ba68fa86c72dce0543bChih-Chung Chang } 181341ad98e59d92769e1cc8ba68fa86c72dce0543bChih-Chung Chang } 182059daa36dc6e83ca24a16d9b99925e71010bccebOwen Lin 1833f3c857e3f34650c15d764810335024654b0fcc3Owen Lin public static void showFatalErrorAndFinish( 1843f3c857e3f34650c15d764810335024654b0fcc3Owen Lin final Activity activity, String title, String message) { 1853f3c857e3f34650c15d764810335024654b0fcc3Owen Lin DialogInterface.OnClickListener buttonListener = 1863f3c857e3f34650c15d764810335024654b0fcc3Owen Lin new DialogInterface.OnClickListener() { 1873f3c857e3f34650c15d764810335024654b0fcc3Owen Lin public void onClick(DialogInterface dialog, int which) { 1883f3c857e3f34650c15d764810335024654b0fcc3Owen Lin activity.finish(); 1893f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 1903f3c857e3f34650c15d764810335024654b0fcc3Owen Lin }; 1913f3c857e3f34650c15d764810335024654b0fcc3Owen Lin new AlertDialog.Builder(activity) 1923f3c857e3f34650c15d764810335024654b0fcc3Owen Lin .setCancelable(false) 1933f3c857e3f34650c15d764810335024654b0fcc3Owen Lin .setIcon(android.R.drawable.ic_dialog_alert) 1943f3c857e3f34650c15d764810335024654b0fcc3Owen Lin .setTitle(title) 1953f3c857e3f34650c15d764810335024654b0fcc3Owen Lin .setMessage(message) 1963f3c857e3f34650c15d764810335024654b0fcc3Owen Lin .setNeutralButton(R.string.details_ok, buttonListener) 1973f3c857e3f34650c15d764810335024654b0fcc3Owen Lin .show(); 1983f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 1992c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin 200c1f2e3021bf7b12f2a33561e09bd0ab32530382eOwen Lin public static Animation slideOut(View view, int to) { 2012c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin view.setVisibility(View.INVISIBLE); 2022c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin Animation anim; 2032c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin switch (to) { 2042c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_LEFT: 2052c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(0, -view.getWidth(), 0, 0); 2062c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2072c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_RIGHT: 2082c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(0, view.getWidth(), 0, 0); 2092c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2102c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_UP: 2112c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(0, 0, 0, -view.getHeight()); 2122c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2132c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_DOWN: 2142c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(0, 0, 0, view.getHeight()); 2152c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2162c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin default: 2172c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin throw new IllegalArgumentException(Integer.toString(to)); 2182c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin } 2192c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim.setDuration(500); 2202c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin view.startAnimation(anim); 221c1f2e3021bf7b12f2a33561e09bd0ab32530382eOwen Lin return anim; 2222c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin } 2232c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin 224c1f2e3021bf7b12f2a33561e09bd0ab32530382eOwen Lin public static Animation slideIn(View view, int from) { 2252c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin view.setVisibility(View.VISIBLE); 2262c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin Animation anim; 2272c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin switch (from) { 2282c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_LEFT: 2292c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(-view.getWidth(), 0, 0, 0); 2302c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2312c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_RIGHT: 2322c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(view.getWidth(), 0, 0, 0); 2332c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2342c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_UP: 2352c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(0, 0, -view.getHeight(), 0); 2362c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2372c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin case DIRECTION_DOWN: 2382c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim = new TranslateAnimation(0, 0, view.getHeight(), 0); 2392c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin break; 2402c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin default: 2412c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin throw new IllegalArgumentException(Integer.toString(from)); 2422c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin } 2432c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin anim.setDuration(500); 2442c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin view.startAnimation(anim); 245c1f2e3021bf7b12f2a33561e09bd0ab32530382eOwen Lin return anim; 2462c6c6174e2363fccb4e4f29b76290e99234fe140Owen Lin } 24773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin 24873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin public static <T> T checkNotNull(T object) { 24973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (object == null) throw new NullPointerException(); 25073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return object; 25173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin } 25273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin 25373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin public static boolean equals(Object a, Object b) { 25473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return (a == b) || (a == null ? false : a.equals(b)); 25573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin } 2564de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 2574de149ceb47f2c251f646419907424bfb67d2b64Owen Lin public static boolean isPowerOf2(int n) { 2584de149ceb47f2c251f646419907424bfb67d2b64Owen Lin return (n & -n) == n; 2594de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 2604de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 2614de149ceb47f2c251f646419907424bfb67d2b64Owen Lin public static int nextPowerOf2(int n) { 2624de149ceb47f2c251f646419907424bfb67d2b64Owen Lin n -= 1; 2634de149ceb47f2c251f646419907424bfb67d2b64Owen Lin n |= n >>> 16; 2644de149ceb47f2c251f646419907424bfb67d2b64Owen Lin n |= n >>> 8; 2654de149ceb47f2c251f646419907424bfb67d2b64Owen Lin n |= n >>> 4; 2664de149ceb47f2c251f646419907424bfb67d2b64Owen Lin n |= n >>> 2; 2674de149ceb47f2c251f646419907424bfb67d2b64Owen Lin n |= n >>> 1; 2684de149ceb47f2c251f646419907424bfb67d2b64Owen Lin return n + 1; 2694de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 27033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 27133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static float distance(float x, float y, float sx, float sy) { 27233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin float dx = x - sx; 27333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin float dy = y - sy; 27433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin return (float) Math.sqrt(dx * dx + dy * dy); 27533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 27633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 27733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static int clamp(int x, int min, int max) { 27833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (x > max) return max; 27933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (x < min) return min; 28033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin return x; 28133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 282ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 2834aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li public static int getDisplayRotation(Activity activity) { 284ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang int rotation = activity.getWindowManager().getDefaultDisplay() 285ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang .getRotation(); 286ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang switch (rotation) { 2874aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li case Surface.ROTATION_0: return 0; 2884aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li case Surface.ROTATION_90: return 90; 2894aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li case Surface.ROTATION_180: return 180; 2904aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li case Surface.ROTATION_270: return 270; 291ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 2924aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li return 0; 2934aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li } 294ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 2954aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li public static void setCameraDisplayOrientation(Activity activity, 2964aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li int cameraId, android.hardware.Camera camera) { 2974aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li android.hardware.Camera.CameraInfo info = 2984aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li new android.hardware.Camera.CameraInfo(); 2994aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li android.hardware.Camera.getCameraInfo(cameraId, info); 3004aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li int degrees = getDisplayRotation(activity); 301c97d23826a28dd725951eccb62651244f9fb8228Wu-cheng Li int result = (info.orientation - degrees + 360) % 360; 302ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang camera.setDisplayOrientation(result); 303ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 304101d528d59f447847d5c6b7578642132c2b76f4fOwen Lin} 305