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