PhotoViewActivity.java revision f77a7eb196d16110c7b1087352b423913821ff61
1f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein/*
2f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Copyright (C) 2011 Google Inc.
3f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Licensed to The Android Open Source Project.
4f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *
5f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
6f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * you may not use this file except in compliance with the License.
7f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * You may obtain a copy of the License at
8f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *
9f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
10f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *
11f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software
12f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
13f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * See the License for the specific language governing permissions and
15f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * limitations under the License.
16f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */
17f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
18f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinpackage com.android.ex.photo;
19f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
20f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.ActionBar;
21f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.Activity;
22f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.ActivityManager;
23f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.Fragment;
24f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.LoaderManager.LoaderCallbacks;
25f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.content.Intent;
26f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.content.Loader;
27f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.database.Cursor;
28f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.net.Uri;
29f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.os.Bundle;
30f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.os.Handler;
31f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.support.v4.view.ViewPager.OnPageChangeListener;
32f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.view.View;
33f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.widget.TextView;
34f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
35f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.PhotoViewPager.InterceptType;
36f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.PhotoViewPager.OnInterceptTouchListener;
37f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.adapters.BaseFragmentPagerAdapter.OnFragmentPagerListener;
38f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.adapters.PhotoPagerAdapter;
39f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.loaders.PhotoPagerLoader;
40f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.provider.PhotoContract;
41f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
42f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport java.util.HashSet;
43f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport java.util.Set;
44f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
45f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein/**
46f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Activity to view the contents of an album.
47f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */
48f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinpublic class PhotoViewActivity extends Activity implements
49f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        LoaderCallbacks<Cursor>, OnPageChangeListener, OnInterceptTouchListener,
50f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        OnFragmentPagerListener {
51f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
52f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
53f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Listener to be invoked for screen events.
54f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
55f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public static interface OnScreenListener {
56f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
57f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        /**
58f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * The full screen state has changed.
59f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         */
60f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        public void onFullScreenChanged(boolean fullScreen, boolean animate);
61f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
62f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        /**
63f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * A new view has been activated and the previous view de-activated.
64f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         */
65f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        public void onViewActivated();
66f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
67f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        /**
68f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * Called when a right-to-left touch move intercept is about to occur.
69f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         *
70f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * @param origX the raw x coordinate of the initial touch
71f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * @param origY the raw y coordinate of the initial touch
72f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * @return {@code true} if the touch should be intercepted.
73f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         */
74f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        public boolean onInterceptMoveLeft(float origX, float origY);
75f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
76f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        /**
77f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * Called when a left-to-right touch move intercept is about to occur.
78f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         *
79f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * @param origX the raw x coordinate of the initial touch
80f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * @param origY the raw y coordinate of the initial touch
81f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         * @return {@code true} if the touch should be intercepted.
82f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein         */
83f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        public boolean onInterceptMoveRight(float origX, float origY);
84f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
85f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
86f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private final static String STATE_ITEM_KEY =
87f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            "com.google.android.apps.plus.PhotoViewFragment.ITEM";
88f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private final static String STATE_FULLSCREEN_KEY =
89f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            "com.google.android.apps.plus.PhotoViewFragment.FULLSCREEN";
90f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
91f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private static final int LOADER_PHOTO_LIST = 1;
92f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
93f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Count used when the real photo count is unknown [but, may be determined] */
94f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public static final int ALBUM_COUNT_UNKNOWN = -1;
95f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
96f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Argument key for the dialog message */
97f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public static final String KEY_MESSAGE = "dialog_message";
98f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
99f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public static int sMemoryClass;
100f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
101f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The URI of the photos we're viewing; may be {@code null} */
102f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private String mPhotosUri;
103f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The index of the currently viewed photo */
104f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private int mPhotoIndex;
105f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The query projection to use; may be {@code null} */
106f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private String[] mProjection;
107f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The name of the particular photo being viewed. */
108f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private String mPhotoName;
109f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The total number of photos; only valid if {@link #mIsEmpty} is {@code false}. */
110f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private int mAlbumCount = ALBUM_COUNT_UNKNOWN;
111f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** {@code true} if the view is empty. Otherwise, {@code false}. */
112f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean mIsEmpty;
113f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The root view of the activity */
114f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private View mRootView;
115f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The main pager; provides left/right swipe between photos */
116f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private PhotoViewPager mViewPager;
117f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Adapter to create pager views */
118f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private PhotoPagerAdapter mAdapter;
119f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Whether or not we're in "full screen" mode */
120f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean mFullScreen;
121f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** The set of listeners wanting full screen state */
122f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private Set<OnScreenListener> mScreenListeners = new HashSet<OnScreenListener>();
123f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** When {@code true}, restart the loader when the activity becomes active */
124f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean mRestartLoader;
125f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Whether or not this activity is paused */
126f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean mIsPaused = true;
127f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    // TODO Find a better way to do this. We basically want the activity to display the
128f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    // "loading..." progress until the fragment takes over and shows it's own "loading..."
129f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    // progress [located in photo_header_view.xml]. We could potentially have all status displayed
130f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    // by the activity, but, that gets tricky when it comes to screen rotation. For now, we
131f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    // track the loading by this variable which is fragile and may cause phantom "loading..."
132f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    // text.
133f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** {@code true} if the fragment is loading. */
134f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean mFragmentIsLoading;
135f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
136f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
137f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    protected void onCreate(Bundle savedInstanceState) {
138f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        super.onCreate(savedInstanceState);
139f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
140f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final ActivityManager mgr = (ActivityManager) getApplicationContext().
141f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                getSystemService(Activity.ACTIVITY_SERVICE);
142f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        sMemoryClass = mgr.getMemoryClass();
143f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
144f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        Intent mIntent = getIntent();
145f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
146f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        int currentItem = -1;
147f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (savedInstanceState != null) {
148f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            currentItem = savedInstanceState.getInt(STATE_ITEM_KEY, -1);
149f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mFullScreen = savedInstanceState.getBoolean(STATE_FULLSCREEN_KEY, false);
150f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
151f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
152f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // album name; if not set, use a default name
153f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mIntent.hasExtra(Intents.EXTRA_PHOTO_NAME)) {
154f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mPhotoName = mIntent.getStringExtra(Intents.EXTRA_PHOTO_NAME);
155f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
156f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mPhotoName = getResources().getString(R.string.photo_view_default_title);
157f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
158f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
159f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // uri of the photos to view; optional
160f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mIntent.hasExtra(Intents.EXTRA_PHOTOS_URI)) {
161f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mPhotosUri = mIntent.getStringExtra(Intents.EXTRA_PHOTOS_URI);
162f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
163f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
164f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // projection for the query; optional
165f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // I.f not set, the default projection is used.
166f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // This projection must include the columns from the default projection.
167f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mIntent.hasExtra(Intents.EXTRA_PROJECTION)) {
168f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mProjection = mIntent.getStringArrayExtra(Intents.EXTRA_PROJECTION);
169f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
170f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mProjection = null;
171f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
172f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
173f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // Set the current item from the intent if wasn't in the saved instance
174f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mIntent.hasExtra(Intents.EXTRA_PHOTO_INDEX) && currentItem < 0) {
175f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            currentItem = mIntent.getIntExtra(Intents.EXTRA_PHOTO_INDEX, -1);
176f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
177f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mPhotoIndex = currentItem;
178f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
179f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        setContentView(R.layout.photo_activity_view);
180f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mRootView = findViewById(R.id.photo_activity_root_view);
181f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
182f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // Create the adapter and add the view pager
183f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mAdapter = new PhotoPagerAdapter(this, getFragmentManager(), null);
184f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mAdapter.setFragmentPagerListener(this);
185f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
186f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mViewPager = (PhotoViewPager) findViewById(R.id.photo_view_pager);
187f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mViewPager.setAdapter(mAdapter);
188f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mViewPager.setOnPageChangeListener(this);
189f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mViewPager.setOnInterceptTouchListener(this);
190f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
191f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // Kick off the loader
192f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        getLoaderManager().initLoader(LOADER_PHOTO_LIST, null, this);
193f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
194f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final ActionBar actionBar = getActionBar();
195f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        actionBar.setDisplayHomeAsUpEnabled(true);
196f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
197f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        updateView(mRootView);
198f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
199f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
200f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
201f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    protected void onResume() {
202f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        super.onResume();
203f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        setFullScreen(mFullScreen, false);
204f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
205f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mIsPaused = false;
206f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mRestartLoader) {
207f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mRestartLoader = false;
208f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            getLoaderManager().restartLoader(LOADER_PHOTO_LIST, null, this);
209f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
210f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
211f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
212f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
213f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    protected void onPause() {
214f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mIsPaused = true;
215f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
216f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        super.onPause();
217f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
218f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
219f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
220f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onBackPressed() {
221f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // If in full screen mode, toggle mode & eat the 'back'
222f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mFullScreen) {
223f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            toggleFullScreen();
224f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
225f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            super.onBackPressed();
226f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
227f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
228f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
229f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
230f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onSaveInstanceState(Bundle outState) {
231f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        super.onSaveInstanceState(outState);
232f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
233f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        outState.putInt(STATE_ITEM_KEY, mViewPager.getCurrentItem());
234f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        outState.putBoolean(STATE_FULLSCREEN_KEY, mFullScreen);
235f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
236f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
237f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void addScreenListener(OnScreenListener listener) {
238f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mScreenListeners.add(listener);
239f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
240f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
241f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void removeScreenListener(OnScreenListener listener) {
242f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mScreenListeners.remove(listener);
243f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
244f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
245f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public boolean isFragmentFullScreen(Fragment fragment) {
246f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mViewPager == null || mAdapter == null || mAdapter.getCount() == 0) {
247f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return mFullScreen;
248f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
249f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return mFullScreen || (mViewPager.getCurrentItem() != mAdapter.getItemPosition(fragment));
250f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
251f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
252f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void toggleFullScreen() {
253f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        setFullScreen(!mFullScreen, true);
254f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
255f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
256f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onPhotoRemoved(long photoId) {
257f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final Cursor data = mAdapter.getCursor();
258f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (data == null) {
259f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            // Huh?! How would this happen?
260f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return;
261f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
262f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
263f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final int dataCount = data.getCount();
264f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (dataCount <= 1) {
265f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            // The last photo was removed ... finish the activity & go to photos-home
266f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein//            final Intent intent = Intents.getPhotosHomeIntent(this, mAccount, mAccount.getGaiaId());
267f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein//
268f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein//            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
269f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein//            startActivity(intent);
270f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            finish();
271f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return;
272f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
273f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
274f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        getLoaderManager().restartLoader(LOADER_PHOTO_LIST, null, this);
275f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
276f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
277f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
278f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
279f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (id == LOADER_PHOTO_LIST) {
280f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mFragmentIsLoading = true;
281f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return new PhotoPagerLoader(this, Uri.parse(mPhotosUri), mProjection);
282f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
283f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return null;
284f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
285f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
286f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
287f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
288f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final int id = loader.getId();
289f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (id == LOADER_PHOTO_LIST) {
290f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            if (data == null || data.getCount() == 0) {
291f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                mIsEmpty = true;
292f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                mFragmentIsLoading = false;
293f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                updateView(mRootView);
294f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            } else {
295f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                mAlbumCount = data.getCount();
296f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
297f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                // Cannot do this directly; need to be out of the loader
298f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                new Handler().post(new Runnable() {
299f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                    @Override
300f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                    public void run() {
301f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        // We're paused; don't do anything now, we'll get re-invoked
302f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        // when the activity becomes active again
303f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        if (mIsPaused) {
304f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                            mRestartLoader = true;
305f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                            return;
306f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        }
307f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        mIsEmpty = false;
308f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
309f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        // set the selected photo
310f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        int itemIndex = mPhotoIndex;
311f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
312f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        // Use an index of 0 if the index wasn't specified or couldn't be found
313f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        if (itemIndex < 0) {
314f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                            itemIndex = 0;
315f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        }
316f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
317f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        mAdapter.swapCursor(data);
318f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        updateView(mRootView);
319f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        mViewPager.setCurrentItem(itemIndex, false);
320f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                        updateActionBar();
321f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                    }
322f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                });
323f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            }
324f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
325f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
326f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
327f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
328f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onLoaderReset(Loader<Cursor> loader) {
329f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
330f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
331f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
332f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
333f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
334f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
335f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
336f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onPageSelected(int position) {
337f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        setViewActivated();
338f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        updateActionBar();
339f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mPhotoIndex = position;
340f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
341f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
342f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
343f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onPageScrollStateChanged(int state) {
344f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
345f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
346f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
347f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onPageActivated(Fragment fragment) {
348f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        setViewActivated();
349f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
350f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
351f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public boolean isFragmentActive(Fragment fragment) {
352f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mViewPager == null || mAdapter == null) {
353f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return false;
354f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
355f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return mViewPager.getCurrentItem() == mAdapter.getItemPosition(fragment);
356f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
357f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
358f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void onFragmentVisible(Fragment fragment) {
359f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mViewPager == null || mAdapter == null) {
360f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return;
361f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
362f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mViewPager.getCurrentItem() == mAdapter.getItemPosition(fragment)) {
363f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mFragmentIsLoading = false;
364f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
365f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        updateView(mRootView);
366f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
367f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
368f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
369f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public InterceptType onTouchIntercept(float origX, float origY) {
370f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        boolean interceptLeft = false;
371f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        boolean interceptRight = false;
372f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
373f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        for (OnScreenListener listener : mScreenListeners) {
374f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            if (!interceptLeft) {
375f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                interceptLeft = listener.onInterceptMoveLeft(origX, origY);
376f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            }
377f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            if (!interceptRight) {
378f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                interceptRight = listener.onInterceptMoveRight(origX, origY);
379f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            }
380f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            listener.onViewActivated();
381f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
382f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
383f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (interceptLeft) {
384f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            if (interceptRight) {
385f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                return InterceptType.BOTH;
386f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            }
387f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return InterceptType.LEFT;
388f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else if (interceptRight) {
389f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return InterceptType.RIGHT;
390f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
391f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return InterceptType.NONE;
392f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
393f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
394f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
395f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Updates the title bar according to the value of {@link #mFullScreen}.
396f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
397f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void setFullScreen(boolean fullScreen, boolean animate) {
398f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final boolean fullScreenChanged = (fullScreen != mFullScreen);
399f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mFullScreen = fullScreen;
400f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
401f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        ActionBar actionBar = getActionBar();
402f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mFullScreen) {
403f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            actionBar.hide();
404f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
405f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            actionBar.show();
406f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
407f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
408f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (fullScreenChanged) {
409f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            for (OnScreenListener listener : mScreenListeners) {
410f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                listener.onFullScreenChanged(mFullScreen, animate);
411f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            }
412f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
413f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
414f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
415f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
416f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Updates the title bar according to the value of {@link #mFullScreen}.
417f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
418f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void setViewActivated() {
419f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        for (OnScreenListener listener : mScreenListeners) {
420f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            listener.onViewActivated();
421f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
422f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
423f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
424f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
425f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Updates the view to show the correct content. If album data is available, show the album
426f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * list. Otherwise, show either progress or no album view.
427f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
428f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void updateView(View view) {
429f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (view == null) {
430f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return;
431f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
432f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
433f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mFragmentIsLoading || (mAdapter.getCursor() == null && !mIsEmpty)) {
434f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            showEmptyViewProgress(view);
435f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
436f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            if (!mIsEmpty) {
437f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                showContent(view);
438f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            } else {
439f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                showEmptyView(view, getResources().getString(R.string.camera_photo_error));
440f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            }
441f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
442f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
443f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
444f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
445f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Display loading progress
446f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
447f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param view The layout view
448f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
449f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void showEmptyViewProgress(View view) {
450f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        view.findViewById(R.id.photo_activity_empty_text).setVisibility(View.GONE);
451f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        view.findViewById(R.id.photo_activity_empty_progress).setVisibility(View.VISIBLE);
452f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        view.findViewById(R.id.photo_activity_empty).setVisibility(View.VISIBLE);
453f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
454f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
455f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
456f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Show only the empty view
457f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
458f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param view The layout view
459f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
460f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void showEmptyView(View view, CharSequence emptyText) {
461f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        view.findViewById(R.id.photo_activity_empty_progress).setVisibility(View.GONE);
462f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final TextView etv = (TextView) view.findViewById(R.id.photo_activity_empty_text);
463f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        etv.setText(emptyText);
464f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        etv.setVisibility(View.VISIBLE);
465f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        view.findViewById(R.id.photo_activity_empty).setVisibility(View.VISIBLE);
466f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
467f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
468f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
469f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Hide the empty view and show the content
470f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
471f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param view The layout view
472f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
473f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void showContent(View view) {
474f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        view.findViewById(R.id.photo_activity_empty).setVisibility(View.GONE);
475f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
476f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
477f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
478f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Adjusts the activity title and subtitle to reflect the photo name and count.
479f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
480f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    protected void updateActionBar() {
481f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final int position = mViewPager.getCurrentItem() + 1;
482f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final String subtitle;
483f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final boolean hasAlbumCount = mAlbumCount >= 0;
484f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
485f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final Cursor cursor = getCursorAtProperPosition();
486f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
487f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (cursor != null) {
488f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            final int photoNameIndex = cursor.getColumnIndex(PhotoContract.PhotoViewColumns.NAME);
489f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mPhotoName = cursor.getString(photoNameIndex);
490f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
491f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
492f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mIsEmpty || !hasAlbumCount || position <= 0) {
493f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            subtitle = null;
494f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
495f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            subtitle = getResources().getString(R.string.photo_view_count, position, mAlbumCount);
496f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
497f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
498f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final ActionBar actionBar = getActionBar();
499f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
500f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        actionBar.setTitle(mPhotoName);
501f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        actionBar.setSubtitle(subtitle);
502f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
503f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
504f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
505f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Utility method that will return the cursor that contains the data
506f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * at the current position so that it refers to the current image on screen.
507f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @return the cursor at the current position or
508f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * null if no cursor exists or if the {@link PhotoViewPager} is null.
509f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
510f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Cursor getCursorAtProperPosition() {
511f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mViewPager == null) {
512f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return null;
513f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
514f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
515f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final int position = mViewPager.getCurrentItem();
516f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final Cursor cursor = mAdapter.getCursor();
517f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
518f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (cursor == null) {
519f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return null;
520f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
521f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
522f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        cursor.moveToPosition(position);
523f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
524f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return cursor;
525f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
526f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein}
527