ActivityBase.java revision 892781804513066b68b4a2fa6f846e862dac252a
14d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang/* 24d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * Copyright (C) 2009 The Android Open Source Project 34d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * 44d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 54d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * you may not use this file except in compliance with the License. 64d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * You may obtain a copy of the License at 74d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * 84d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 94d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * 104d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software 114d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 124d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * See the License for the specific language governing permissions and 144d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * limitations under the License. 154d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang */ 164d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang 174d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Changpackage com.android.camera; 184d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang 194d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Changimport android.app.Activity; 207d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.app.KeyguardManager; 21c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Liimport android.content.ContentResolver; 22892781804513066b68b4a2fa6f846e862dac252aOwen Linimport android.content.Context; 235df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Liimport android.content.Intent; 244c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Liimport android.content.pm.ActivityInfo; 25c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Liimport android.os.AsyncTask; 268608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Changimport android.os.Bundle; 277d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.util.Log; 284c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Liimport android.view.KeyEvent; 29c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Liimport android.view.View; 30892781804513066b68b4a2fa6f846e862dac252aOwen Linimport android.view.WindowManager; 31892781804513066b68b4a2fa6f846e862dac252aOwen Lin 32892781804513066b68b4a2fa6f846e862dac252aOwen Linimport com.android.camera.ui.PopupManager; 33892781804513066b68b4a2fa6f846e862dac252aOwen Linimport com.android.camera.ui.RotateImageView; 344d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang 35aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Liimport java.io.File; 36aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li 3777c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang/** 387673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li * Superclass of Camera and VideoCamera activities. 3977c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang */ 407d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerabstract public class ActivityBase extends Activity { 417d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller private static final String TAG = "ActivityBase"; 427d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller private static boolean LOGV = false; 435df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li private int mResultCodeForTesting; 447d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller private boolean mOnResumePending; 455df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li private Intent mResultDataForTesting; 464edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong private OnScreenHint mStorageHint; 4719c0b7882d14679bc0fe5d25c4e1ea34350d0b8dWu-cheng Li protected CameraDevice mCameraDevice; 48c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // The bitmap of the last captured picture thumbnail and the URI of the 49c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // original picture. 50c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li protected Thumbnail mThumbnail; 51c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // An imageview showing showing the last captured picture thumbnail. 52c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li protected RotateImageView mThumbnailView; 53c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li protected AsyncTask<Void, Void, Thumbnail> mLoadThumbnailTask; 545df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li 554d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang @Override 568608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang public void onCreate(Bundle icicle) { 574c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li if (Util.isTabletUI()) { 584c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 59d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang } else { 60d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 614c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li } 62e5b6a36e64ef2c2cb1435c138a5fc179e9a6bc9aWu-cheng Li getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); 638608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang super.onCreate(icicle); 648608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang } 658608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang 668608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang @Override 677d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller public void onWindowFocusChanged(boolean hasFocus) { 687d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller if (LOGV) Log.v(TAG, "onWindowFocusChanged.hasFocus=" + hasFocus 697d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller + ".mOnResumePending=" + mOnResumePending); 707d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller if (hasFocus && mOnResumePending) { 717d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller doOnResume(); 727d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller mOnResumePending = false; 737d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } 747d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } 757d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller 767d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller @Override 777d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller protected void onResume() { 787d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller super.onResume(); 797d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller // Don't grab the camera if in use by lockscreen. For example, face 807d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller // unlock may be using the camera. Camera may be already opened in 817d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller // onCreate. doOnResume should continue if mCameraDevice != null. 828853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li // Suppose camera app is in the foreground. If users turn off and turn 838853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li // on the screen very fast, camera app can still have the focus when the 848853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li // lock screen shows up. The keyguard takes input focus, so the caemra 858853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li // app will lose focus when it is displayed. 868853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li if (LOGV) Log.v(TAG, "onResume. hasWindowFocus()=" + hasWindowFocus()); 878853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li if (mCameraDevice == null && isKeyguardLocked()) { 888853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li if (LOGV) Log.v(TAG, "onResume. mOnResumePending=true"); 897d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller mOnResumePending = true; 907d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } else { 918853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li if (LOGV) Log.v(TAG, "onResume. mOnResumePending=false"); 927d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller doOnResume(); 937d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller mOnResumePending = false; 947d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } 957d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } 967d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller 977d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller @Override 987d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller protected void onPause() { 997d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller if (LOGV) Log.v(TAG, "onPause"); 100aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li saveThumbnailToFile(); 1017d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller super.onPause(); 1024edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong 103c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li if (mLoadThumbnailTask != null) { 104c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mLoadThumbnailTask.cancel(true); 105c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mLoadThumbnailTask = null; 106c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 107c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 1084edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong if (mStorageHint != null) { 1094edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint.cancel(); 1104edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint = null; 1114edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } 1124edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong 1137d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller mOnResumePending = false; 1147d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } 1157d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller 1167d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller // Put the code of onResume in this method. 1177d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller abstract protected void doOnResume(); 1187d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller 1197d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller @Override 1204d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang public boolean onSearchRequested() { 1214d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang return false; 1224d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang } 1237673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li 1247673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li @Override 1257673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li public boolean onKeyDown(int keyCode, KeyEvent event) { 1267673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li // Prevent software keyboard or voice search from showing up. 1277673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li if (keyCode == KeyEvent.KEYCODE_SEARCH 1287673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li || keyCode == KeyEvent.KEYCODE_MENU) { 1297673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li if (event.isLongPress()) return true; 1307673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li } 1317673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li 1327673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li return super.onKeyDown(keyCode, event); 1337673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li } 1345df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li 1355df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li protected void setResultEx(int resultCode) { 1365df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li mResultCodeForTesting = resultCode; 1375df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li setResult(resultCode); 1385df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li } 1395df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li 1405df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li protected void setResultEx(int resultCode, Intent data) { 1415df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li mResultCodeForTesting = resultCode; 1425df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li mResultDataForTesting = data; 1435df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li setResult(resultCode, data); 1445df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li } 1455df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li 1465df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li public int getResultCode() { 1475df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li return mResultCodeForTesting; 1485df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li } 1495df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li 1505df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li public Intent getResultData() { 1515df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li return mResultDataForTesting; 1525df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li } 1535f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang 1545f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang @Override 1555f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang protected void onDestroy() { 1565f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang PopupManager.removeInstance(this); 1575f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang super.onDestroy(); 1585f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang } 1597d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller 1607d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller private boolean isKeyguardLocked() { 1617d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 1628853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li if (LOGV) { 1638853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li if (kgm != null) { 1648853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li Log.v(TAG, "kgm.isKeyguardLocked()="+kgm.isKeyguardLocked() 1658853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li + ". kgm.isKeyguardSecure()="+kgm.isKeyguardSecure()); 1668853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li } 1678853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li } 1687d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller // isKeyguardSecure excludes the slide lock case. 1697d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller return (kgm != null) && kgm.isKeyguardLocked() && kgm.isKeyguardSecure(); 1707d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller } 1714edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong 1724edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong protected void updateStorageHint(long storageSpace) { 1734edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong String message = null; 1744edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong if (storageSpace == Storage.UNAVAILABLE) { 1754edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong message = getString(R.string.no_storage); 1764edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } else if (storageSpace == Storage.PREPARING) { 1774edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong message = getString(R.string.preparing_sd); 1784edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } else if (storageSpace == Storage.UNKNOWN_SIZE) { 1794edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong message = getString(R.string.access_sd_fail); 1804edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } else if (storageSpace < Storage.LOW_STORAGE_THRESHOLD) { 1814edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong message = getString(R.string.spaceIsLow_content); 1824edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } 1834edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong 1844edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong if (message != null) { 1854edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong if (mStorageHint == null) { 1864edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint = OnScreenHint.makeText(this, message); 1874edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } else { 1884edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint.setText(message); 1894edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } 1904edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint.show(); 1914edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } else if (mStorageHint != null) { 1924edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint.cancel(); 1934edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong mStorageHint = null; 1944edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } 1954edaf0cbbb5d9cfeae786b6fd0560240947f6585Angus Kong } 196c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 197c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li private void updateThumbnailView() { 198c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li if (mThumbnail != null) { 199c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mThumbnailView.setBitmap(mThumbnail.getBitmap()); 200c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mThumbnailView.setVisibility(View.VISIBLE); 201c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } else { 202c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mThumbnailView.setBitmap(null); 203c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mThumbnailView.setVisibility(View.GONE); 204c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 205c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 206c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 207c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li protected void getLastThumbnail() { 208c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mThumbnail = ThumbnailHolder.getLastThumbnail(getContentResolver()); 209c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // Suppose users tap the thumbnail view, go to the gallery, delete the 210c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // image, and coming back to the camera. Thumbnail file will be invalid. 211c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // Since the new thumbnail will be loaded in another thread later, the 212c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // view should be set to gone to prevent from opening the invalid image. 213c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li updateThumbnailView(); 214c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li if (mThumbnail == null) { 215c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mLoadThumbnailTask = new LoadThumbnailTask().execute(); 216c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 217c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 218c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 219aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li private class LoadThumbnailTask extends AsyncTask<Void, Void, Thumbnail> { 220c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li @Override 221c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li protected Thumbnail doInBackground(Void... params) { 222c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // Load the thumbnail from the file. 223c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li ContentResolver resolver = getContentResolver(); 224c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li Thumbnail t = Thumbnail.getLastThumbnailFromFile(getFilesDir(), resolver); 225c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 226c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li if (isCancelled()) return null; 227c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 228c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li if (t == null) { 229c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li // Load the thumbnail from the media provider. 230c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li t = Thumbnail.getLastThumbnailFromContentResolver(resolver); 231c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 232c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li return t; 233c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 234c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li 235c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li @Override 236c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li protected void onPostExecute(Thumbnail thumbnail) { 237c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li mThumbnail = thumbnail; 238c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li updateThumbnailView(); 239c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 240c24a2a83df9b54297995c5270d015bb7fdd85fabWu-cheng Li } 241aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li 242aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li protected void saveThumbnailToFile() { 243aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li if (mThumbnail != null && !mThumbnail.fromFile()) { 244aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li new SaveThumbnailTask().execute(mThumbnail); 245aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li } 246aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li } 247aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li 248aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li private class SaveThumbnailTask extends AsyncTask<Thumbnail, Void, Void> { 249aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li @Override 250aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li protected Void doInBackground(Thumbnail... params) { 251aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li final int n = params.length; 252aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li final File filesDir = getFilesDir(); 253aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li for (int i = 0; i < n; i++) { 254aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li params[i].saveLastThumbnailToFile(filesDir); 255aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li } 256aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li return null; 257aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li } 258aef5310d25537494679f9ec6b9d7a1a9cb60887dWu-cheng Li } 2594d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang} 260