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