11cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein/* 21cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Copyright (C) 2011 Google Inc. 31cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Licensed to The Android Open Source Project. 41cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * 51cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 61cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * you may not use this file except in compliance with the License. 71cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * You may obtain a copy of the License at 81cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * 91cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 101cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * 111cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software 121cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 131cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * See the License for the specific language governing permissions and 151cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * limitations under the License. 161cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 171cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 181cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinpackage com.android.ex.photo.fragments; 191cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 201cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.app.Activity; 211cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.app.Fragment; 22509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sappersteinimport android.app.LoaderManager; 231cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.app.LoaderManager.LoaderCallbacks; 241cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.content.Context; 251cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.content.Intent; 261cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.content.Loader; 27a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sappersteinimport android.database.Cursor; 281cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.graphics.Bitmap; 291cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.os.Bundle; 301cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.util.DisplayMetrics; 311cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.view.LayoutInflater; 321cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.view.View; 331cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.view.View.OnClickListener; 341cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.view.ViewGroup; 351cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport android.view.WindowManager; 369ceb1b41122f649cd26234f34edc2c1cf75b2f95Andrew Sappersteinimport android.widget.ImageView; 37509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sappersteinimport android.widget.ProgressBar; 38509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sappersteinimport android.widget.TextView; 391cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 401cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.Intents; 411cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.PhotoViewActivity; 42a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sappersteinimport com.android.ex.photo.PhotoViewActivity.CursorChangedListener; 431cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.PhotoViewActivity.OnScreenListener; 441cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.R; 45a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sappersteinimport com.android.ex.photo.adapters.PhotoPagerAdapter; 461cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.loaders.PhotoBitmapLoader; 471cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.util.ImageUtils; 481cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinimport com.android.ex.photo.views.PhotoView; 49509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sappersteinimport com.android.ex.photo.views.ProgressBarWrapper; 501cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 511cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein/** 521cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Displays a photo. 531cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 541cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sappersteinpublic class PhotoViewFragment extends Fragment implements 55a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein LoaderCallbacks<Bitmap>, OnClickListener, OnScreenListener, CursorChangedListener { 561cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 571cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Interface for components that are internally scrollable left-to-right. 581cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 591cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public static interface HorizontallyScrollable { 601cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 611cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Return {@code true} if the component needs to receive right-to-left 621cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * touch movements. 631cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * 641cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * @param origX the raw x coordinate of the initial touch 651cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * @param origY the raw y coordinate of the initial touch 661cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 671cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 681cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public boolean interceptMoveLeft(float origX, float origY); 691cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 701cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 711cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Return {@code true} if the component needs to receive left-to-right 721cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * touch movements. 731cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * 741cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * @param origX the raw x coordinate of the initial touch 751cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * @param origY the raw y coordinate of the initial touch 761cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 771cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public boolean interceptMoveRight(float origX, float origY); 781cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 791cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 801cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private final static String STATE_INTENT_KEY = 811cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein "com.android.mail.photo.fragments.PhotoViewFragment.INTENT"; 821cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 831cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // Loader IDs 84d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein private final static int LOADER_ID_PHOTO = 1; 85d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein private final static int LOADER_ID_THUMBNAIL = 2; 861cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 871cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** The size of the photo */ 881cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public static Integer sPhotoSize; 891cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 901cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** The URL of a photo to display */ 911cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private String mResolvedPhotoUri; 92d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein private String mThumbnailUri; 931cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** The intent we were launched with */ 941cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private Intent mIntent; 951cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private PhotoViewActivity mCallback; 96a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein private PhotoPagerAdapter mAdapter; 971cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 981cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private PhotoView mPhotoView; 99509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein private ImageView mPhotoPreviewImage; 100509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein private TextView mEmptyText; 101509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein private ImageView mRetryButton; 102509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein private ProgressBarWrapper mPhotoProgressBar; 103509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein 104a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein private final int mPosition; 1051cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1061cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** Whether or not the fragment should make the photo full-screen */ 1071cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private boolean mFullScreen; 1081cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 109459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook /** Whether or not the progress bar is showing valid information about the progress stated */ 110459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook private boolean mProgressBarNeeded = true; 111459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook 112509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein private View mPhotoPreviewAndProgress; 113d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein 1141cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public PhotoViewFragment() { 115a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein mPosition = -1; 116459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook mProgressBarNeeded = true; 1171cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1181cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 119a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein public PhotoViewFragment(Intent intent, int position, PhotoPagerAdapter adapter) { 1201cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mIntent = intent; 121a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein mPosition = position; 122a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein mAdapter = adapter; 123459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook mProgressBarNeeded = true; 1241cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1251cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1261cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 1271cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onAttach(Activity activity) { 1281cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onAttach(activity); 1291cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mCallback = (PhotoViewActivity) activity; 1301cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (mCallback == null) { 131509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein throw new IllegalArgumentException( 132509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein "Activity must be a derived class of PhotoViewActivity"); 1331cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1341cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1351cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (sPhotoSize == null) { 1361cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final DisplayMetrics metrics = new DisplayMetrics(); 1371cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final WindowManager wm = 1381cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); 1391cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final ImageUtils.ImageSize imageSize = ImageUtils.sUseImageSize; 1401cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein wm.getDefaultDisplay().getMetrics(metrics); 1411cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein switch (imageSize) { 1421cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein case EXTRA_SMALL: { 1431cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // Use a photo that's 80% of the "small" size 1441cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein sPhotoSize = (Math.min(metrics.heightPixels, metrics.widthPixels) * 800) / 1000; 1451cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein break; 1461cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1471cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1481cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein case SMALL: 1491cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein case NORMAL: 1501cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein default: { 1511cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein sPhotoSize = Math.min(metrics.heightPixels, metrics.widthPixels); 1521cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein break; 1531cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1541cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1551cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1561cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1571cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1581cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 1591cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onDetach() { 1601cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mCallback = null; 1611cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onDetach(); 1621cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1631cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1641cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 1651cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onCreate(Bundle savedInstanceState) { 1661cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onCreate(savedInstanceState); 1671cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1681cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (savedInstanceState != null) { 169697c046e3f0632f698d269423b62bb53a7d37a32Mark Wei final Bundle state = savedInstanceState.getBundle(STATE_INTENT_KEY); 170697c046e3f0632f698d269423b62bb53a7d37a32Mark Wei if (state != null) { 171697c046e3f0632f698d269423b62bb53a7d37a32Mark Wei mIntent = new Intent().putExtras(state); 172697c046e3f0632f698d269423b62bb53a7d37a32Mark Wei } 1731cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1741cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 175c907eecdbdf8a2b85280f27f636c332f3a0fa699Mark Wei if (mIntent != null) { 176c907eecdbdf8a2b85280f27f636c332f3a0fa699Mark Wei mResolvedPhotoUri = mIntent.getStringExtra(Intents.EXTRA_RESOLVED_PHOTO_URI); 177c907eecdbdf8a2b85280f27f636c332f3a0fa699Mark Wei mThumbnailUri = mIntent.getStringExtra(Intents.EXTRA_THUMBNAIL_URI); 178c907eecdbdf8a2b85280f27f636c332f3a0fa699Mark Wei } 1791cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 1801cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1811cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 1821cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public View onCreateView(LayoutInflater inflater, ViewGroup container, 1831cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein Bundle savedInstanceState) { 1841cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final View view = inflater.inflate(R.layout.photo_fragment_view, container, false); 1851cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 1861cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView = (PhotoView) view.findViewById(R.id.photo_view); 1871cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView.setOnClickListener(this); 1881cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView.setFullScreen(mFullScreen, false); 1899ceb1b41122f649cd26234f34edc2c1cf75b2f95Andrew Sapperstein mPhotoView.enableImageTransforms(true); 1909ceb1b41122f649cd26234f34edc2c1cf75b2f95Andrew Sapperstein 191509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mPhotoPreviewAndProgress = view.findViewById(R.id.photo_preview); 192509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mPhotoPreviewImage = (ImageView) view.findViewById(R.id.photo_preview_image); 193509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein final ProgressBar indeterminate = 194509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein (ProgressBar) view.findViewById(R.id.indeterminate_progress); 195509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein final ProgressBar determinate = 196509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein (ProgressBar) view.findViewById(R.id.determinate_progress); 197509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mPhotoProgressBar = new ProgressBarWrapper(determinate, indeterminate, true); 198509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mEmptyText = (TextView) view.findViewById(R.id.empty_text); 199509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mRetryButton = (ImageView) view.findViewById(R.id.retry_button); 2001cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2011cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // Don't call until we've setup the entire view 2021cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein setViewVisibility(); 2031cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2041cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein return view; 2051cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2061cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2071cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 2081cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onResume() { 2091cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mCallback.addScreenListener(this); 210a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein mCallback.addCursorListener(this); 2111cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 21214a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook getLoaderManager().initLoader(LOADER_ID_THUMBNAIL, null, this); 2131cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2141cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onResume(); 2151cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2161cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2171cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 2181cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onPause() { 2191cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onPause(); 220a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein // Remove listeners 221a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein mCallback.removeCursorListener(this); 2221cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mCallback.removeScreenListener(this); 2231cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein resetPhotoView(); 2241cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2251cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2261cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 2271cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onDestroyView() { 2281cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // Clean up views and other components 2291cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (mPhotoView != null) { 2301cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView.clear(); 2311cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView = null; 2321cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2331cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2341cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onDestroyView(); 2351cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2361cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2371cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 2381cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onSaveInstanceState(Bundle outState) { 2391cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein super.onSaveInstanceState(outState); 2401cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2411cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (mIntent != null) { 2421cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein outState.putParcelable(STATE_INTENT_KEY, mIntent.getExtras()); 2431cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2441cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2451cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2461cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 2471cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public Loader<Bitmap> onCreateLoader(int id, Bundle args) { 248d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein switch (id) { 249d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein case LOADER_ID_PHOTO: 250d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein return new PhotoBitmapLoader(getActivity(), mResolvedPhotoUri); 251d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein case LOADER_ID_THUMBNAIL: 252d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein return new PhotoBitmapLoader(getActivity(), mThumbnailUri); 253d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein default: 254d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein return null; 2551cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2561cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2571cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2581cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 2591cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onLoadFinished(Loader<Bitmap> loader, Bitmap data) { 2601cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // If we don't have a view, the fragment has been paused. We'll get the cursor again later. 2611cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (getView() == null) { 2621cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein return; 2631cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 2641cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 2651cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final int id = loader.getId(); 266d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein switch (id) { 267d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein case LOADER_ID_PHOTO: 268459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook if (data != null) { 269509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein bindPhoto(data); 270509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mPhotoPreviewAndProgress.setVisibility(View.GONE); 271459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook mProgressBarNeeded = false; 272d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein } 273d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein break; 274d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein case LOADER_ID_THUMBNAIL: 275939ce1b0bcd1ded7e1dc8c36eb89dcd4d891bd12Paul Westbrook if (isPhotoBound()) { 276459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook // There is need to do anything with the thumbnail image, as the full size 277459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook // image is being shown. 278459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook mPhotoPreviewAndProgress.setVisibility(View.GONE); 279459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook mProgressBarNeeded = false; 2809ceb1b41122f649cd26234f34edc2c1cf75b2f95Andrew Sapperstein return; 281509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein } else { 28214a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook // Make the preview image view visible 283509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein mPhotoPreviewImage.setVisibility(View.VISIBLE); 284459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook 28514a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook if (data == null) { 28614a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook // no preview, show default 28714a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook mPhotoPreviewImage.setImageResource(R.drawable.default_image); 28814a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook mPhotoPreviewImage.setScaleType(ImageView.ScaleType.CENTER); 28914a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook } else { 29014a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook // Show the preview 29114a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook mPhotoPreviewImage.setImageBitmap(data); 29214a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook } 29314a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook // Now load the full size image 29414a4df6f91f3563ab956ed1730bdbf4e6976e5cdPaul Westbrook getLoaderManager().initLoader(LOADER_ID_PHOTO, null, this); 295d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein } 296d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein break; 297d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein default: 298d19540fb7139fc0baba3b55260a6aabdb029c831Andrew Sapperstein break; 2991cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 300509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein 301459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook if (mProgressBarNeeded == false) { 302459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook // Hide the progress bar as it isn't needed anymore. 303459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook mPhotoProgressBar.setVisibility(View.GONE); 304459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook } 3055f0470b259c56dd5df171948d6efd4219a3a17f8Mark Wei if (data != null) { 3065f0470b259c56dd5df171948d6efd4219a3a17f8Mark Wei mCallback.onNewPhotoLoaded(); 3075f0470b259c56dd5df171948d6efd4219a3a17f8Mark Wei } 308459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook 309509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein setViewVisibility(); 3101cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3111cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3121cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 3131cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Binds an image to the photo view. 3141cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 3151cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private void bindPhoto(Bitmap bitmap) { 3161cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (mPhotoView != null) { 3171cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView.bindPhoto(bitmap); 3181cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3191cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3201cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3211cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 3221cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Resets the photo view to it's default state w/ no bound photo. 3231cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 3241cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private void resetPhotoView() { 3251cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (mPhotoView != null) { 3261cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView.bindPhoto(null); 3271cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3281cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3291cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3301cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 3311cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onLoaderReset(Loader<Bitmap> loader) { 3321cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // Do nothing 3331cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3341cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3351cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 3361cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onClick(View v) { 337b81f8c963a0d97034872f14f4e2294d1e2b44da1Andrew Sapperstein mCallback.toggleFullScreen(); 3381cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3391cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3401cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 341b81f8c963a0d97034872f14f4e2294d1e2b44da1Andrew Sapperstein public void onFullScreenChanged(boolean fullScreen) { 3421cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein setViewVisibility(); 3431cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3441cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3451cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 3461cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void onViewActivated() { 3471cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (!mCallback.isFragmentActive(this)) { 3481cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // we're not in the foreground; reset our view 3491cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein resetViews(); 3501cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } else { 351939ce1b0bcd1ded7e1dc8c36eb89dcd4d891bd12Paul Westbrook if (!isPhotoBound()) { 352939ce1b0bcd1ded7e1dc8c36eb89dcd4d891bd12Paul Westbrook // Restart the loader 353939ce1b0bcd1ded7e1dc8c36eb89dcd4d891bd12Paul Westbrook getLoaderManager().restartLoader(LOADER_ID_THUMBNAIL, null, this); 354939ce1b0bcd1ded7e1dc8c36eb89dcd4d891bd12Paul Westbrook } 3551cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mCallback.onFragmentVisible(this); 3561cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3571cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3581cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3591cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 3601cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Reset the views to their default states 3611cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 3621cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void resetViews() { 3631cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (mPhotoView != null) { 3641cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mPhotoView.resetTransformations(); 3651cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3661cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3671cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3681cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 3691cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public boolean onInterceptMoveLeft(float origX, float origY) { 3701cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (!mCallback.isFragmentActive(this)) { 3711cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // we're not in the foreground; don't intercept any touches 3721cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein return false; 3731cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3741cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3751cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein return (mPhotoView != null && mPhotoView.interceptMoveLeft(origX, origY)); 3761cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3771cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3781cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein @Override 3791cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public boolean onInterceptMoveRight(float origX, float origY) { 3801cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein if (!mCallback.isFragmentActive(this)) { 3811cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein // we're not in the foreground; don't intercept any touches 3821cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein return false; 3831cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3841cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3851cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein return (mPhotoView != null && mPhotoView.interceptMoveRight(origX, origY)); 3861cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3871cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3881cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 3891cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Returns {@code true} if a photo has been bound. Otherwise, returns {@code false}. 3901cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 3911cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public boolean isPhotoBound() { 392509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein return (mPhotoView != null && mPhotoView.isPhotoBound()); 3931cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 3941cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 3951cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 3961cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Sets view visibility depending upon whether or not we're in "full screen" mode. 3971cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 3981cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein private void setViewVisibility() { 3991cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final boolean fullScreen = mCallback.isFragmentFullScreen(this); 4001cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein final boolean hide = fullScreen; 4011cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 4021cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein setFullScreen(hide); 4031cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 4041cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein 4051cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein /** 4061cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein * Sets full-screen mode for the views. 4071cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein */ 4081cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein public void setFullScreen(boolean fullScreen) { 4091cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein mFullScreen = fullScreen; 4101cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein } 411a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein 412a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein @Override 413a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein public void onCursorChanged(Cursor cursor) { 414a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein if (cursor.moveToPosition(mPosition) && !isPhotoBound()) { 415a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein final LoaderManager manager = getLoaderManager(); 416a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein final Loader<Bitmap> fakeLoader = manager.getLoader(LOADER_ID_PHOTO); 417a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein if (fakeLoader == null) { 418a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein return; 419a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein } 420a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein 421a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein final PhotoBitmapLoader loader = 422a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein (PhotoBitmapLoader) fakeLoader; 423a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein mResolvedPhotoUri = mAdapter.getPhotoUri(cursor); 424a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein loader.setPhotoUri(mResolvedPhotoUri); 425a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein loader.forceLoad(); 426a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein } 427a6729336171ef61950d5f585b0f39c013ae6dcbcAndrew Sapperstein } 428509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein 429509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein public ProgressBarWrapper getPhotoProgressBar() { 430509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein return mPhotoProgressBar; 431509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein } 432509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein 433509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein public TextView getEmptyText() { 434509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein return mEmptyText; 435509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein } 436509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein 437509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein public ImageView getRetryButton() { 438509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein return mRetryButton; 439509bd03a2a783f804e9456767b52e0f8ef43479bAndrew Sapperstein } 440459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook 441459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook public boolean isProgressBarNeeded() { 442459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook return mProgressBarNeeded; 443459c618b574a3d3b6a544267a87c2093bacac20dPaul Westbrook } 4441cc4b2144a45abb495c8b14f6cfc5a10fb5e8ba8Andrew Sapperstein} 445