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