diff options
Diffstat (limited to 'photoviewer/src/com/android/ex/photo/PhotoViewActivity.java')
-rw-r--r-- | photoviewer/src/com/android/ex/photo/PhotoViewActivity.java | 585 |
1 files changed, 0 insertions, 585 deletions
diff --git a/photoviewer/src/com/android/ex/photo/PhotoViewActivity.java b/photoviewer/src/com/android/ex/photo/PhotoViewActivity.java deleted file mode 100644 index 678b07f..0000000 --- a/photoviewer/src/com/android/ex/photo/PhotoViewActivity.java +++ /dev/null @@ -1,585 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * Licensed to The Android Open Source Project. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.ex.photo; - -import android.app.ActionBar; -import android.app.ActionBar.OnMenuVisibilityListener; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.Fragment; -import android.app.LoaderManager.LoaderCallbacks; -import android.content.Intent; -import android.content.Loader; -import android.content.res.Resources; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.support.v4.view.ViewPager.OnPageChangeListener; -import android.text.TextUtils; -import android.view.MenuItem; -import android.view.View; - -import com.android.ex.photo.PhotoViewPager.InterceptType; -import com.android.ex.photo.PhotoViewPager.OnInterceptTouchListener; -import com.android.ex.photo.adapters.PhotoPagerAdapter; -import com.android.ex.photo.fragments.PhotoViewFragment; -import com.android.ex.photo.loaders.PhotoPagerLoader; -import com.android.ex.photo.provider.PhotoContract; - -import java.util.HashSet; -import java.util.Set; - -/** - * Activity to view the contents of an album. - */ -public class PhotoViewActivity extends Activity implements - LoaderCallbacks<Cursor>, OnPageChangeListener, OnInterceptTouchListener, - OnMenuVisibilityListener { - - /** - * Listener to be invoked for screen events. - */ - public static interface OnScreenListener { - - /** - * The full screen state has changed. - */ - public void onFullScreenChanged(boolean fullScreen); - - /** - * A new view has been activated and the previous view de-activated. - */ - public void onViewActivated(); - - /** - * Called when a right-to-left touch move intercept is about to occur. - * - * @param origX the raw x coordinate of the initial touch - * @param origY the raw y coordinate of the initial touch - * @return {@code true} if the touch should be intercepted. - */ - public boolean onInterceptMoveLeft(float origX, float origY); - - /** - * Called when a left-to-right touch move intercept is about to occur. - * - * @param origX the raw x coordinate of the initial touch - * @param origY the raw y coordinate of the initial touch - * @return {@code true} if the touch should be intercepted. - */ - public boolean onInterceptMoveRight(float origX, float origY); - } - - public static interface CursorChangedListener { - /** - * Called when the cursor that contains the photo list data - * is updated. Note that there is no guarantee that the cursor - * will be at the proper position. - * @param cursor the cursor containing the photo list data - */ - public void onCursorChanged(Cursor cursor); - } - - private final static String STATE_ITEM_KEY = - "com.google.android.apps.plus.PhotoViewFragment.ITEM"; - private final static String STATE_FULLSCREEN_KEY = - "com.google.android.apps.plus.PhotoViewFragment.FULLSCREEN"; - - private static final int LOADER_PHOTO_LIST = 1; - - /** Count used when the real photo count is unknown [but, may be determined] */ - public static final int ALBUM_COUNT_UNKNOWN = -1; - - /** Argument key for the dialog message */ - public static final String KEY_MESSAGE = "dialog_message"; - - public static int sMemoryClass; - - /** The URI of the photos we're viewing; may be {@code null} */ - private String mPhotosUri; - /** The URI of the photo currently viewed photo */ - private String mInitialPhotoUri; - /** The index of the currently viewed photo */ - private int mPhotoIndex; - /** The query projection to use; may be {@code null} */ - private String[] mProjection; - /** The total number of photos; only valid if {@link #mIsEmpty} is {@code false}. */ - private int mAlbumCount = ALBUM_COUNT_UNKNOWN; - /** {@code true} if the view is empty. Otherwise, {@code false}. */ - private boolean mIsEmpty; - /** The main pager; provides left/right swipe between photos */ - private PhotoViewPager mViewPager; - /** Adapter to create pager views */ - private PhotoPagerAdapter mAdapter; - /** Whether or not we're in "full screen" mode */ - private boolean mFullScreen; - /** The set of listeners wanting full screen state */ - private Set<OnScreenListener> mScreenListeners = new HashSet<OnScreenListener>(); - /** The set of listeners wanting full screen state */ - private Set<CursorChangedListener> mCursorListeners = new HashSet<CursorChangedListener>(); - /** When {@code true}, restart the loader when the activity becomes active */ - private boolean mRestartLoader; - /** Whether or not this activity is paused */ - private boolean mIsPaused = true; - /** The maximum scale factor applied to images when they are initially displayed */ - private float mMaxInitialScale; - private final Handler mHandler = new Handler(); - // TODO Find a better way to do this. We basically want the activity to display the - // "loading..." progress until the fragment takes over and shows it's own "loading..." - // progress [located in photo_header_view.xml]. We could potentially have all status displayed - // by the activity, but, that gets tricky when it comes to screen rotation. For now, we - // track the loading by this variable which is fragile and may cause phantom "loading..." - // text. - private long mActionBarHideDelayTime; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - final ActivityManager mgr = (ActivityManager) getApplicationContext(). - getSystemService(Activity.ACTIVITY_SERVICE); - sMemoryClass = mgr.getMemoryClass(); - - Intent mIntent = getIntent(); - - int currentItem = -1; - if (savedInstanceState != null) { - currentItem = savedInstanceState.getInt(STATE_ITEM_KEY, -1); - mFullScreen = savedInstanceState.getBoolean(STATE_FULLSCREEN_KEY, false); - } - - // uri of the photos to view; optional - if (mIntent.hasExtra(Intents.EXTRA_PHOTOS_URI)) { - mPhotosUri = mIntent.getStringExtra(Intents.EXTRA_PHOTOS_URI); - } - - // projection for the query; optional - // I.f not set, the default projection is used. - // This projection must include the columns from the default projection. - if (mIntent.hasExtra(Intents.EXTRA_PROJECTION)) { - mProjection = mIntent.getStringArrayExtra(Intents.EXTRA_PROJECTION); - } else { - mProjection = null; - } - - // Set the current item from the intent if wasn't in the saved instance - if (mIntent.hasExtra(Intents.EXTRA_PHOTO_INDEX) && currentItem < 0) { - currentItem = mIntent.getIntExtra(Intents.EXTRA_PHOTO_INDEX, -1); - } - if (mIntent.hasExtra(Intents.EXTRA_INITIAL_PHOTO_URI) && currentItem < 0) { - mInitialPhotoUri = mIntent.getStringExtra(Intents.EXTRA_INITIAL_PHOTO_URI); - } - - // Set the max initial scale, defaulting to 1x - mMaxInitialScale = mIntent.getFloatExtra(Intents.EXTRA_MAX_INITIAL_SCALE, 1.0f); - - mPhotoIndex = currentItem; - - setContentView(R.layout.photo_activity_view); - - // Create the adapter and add the view pager - mAdapter = new PhotoPagerAdapter(this, getFragmentManager(), null, mMaxInitialScale); - - final Resources resources = getResources(); - mViewPager = (PhotoViewPager) findViewById(R.id.photo_view_pager); - mViewPager.setAdapter(mAdapter); - mViewPager.setOnPageChangeListener(this); - mViewPager.setOnInterceptTouchListener(this); - mViewPager.setPageMargin(resources.getDimensionPixelSize(R.dimen.photo_page_margin)); - - // Kick off the loader - getLoaderManager().initLoader(LOADER_PHOTO_LIST, null, this); - - final ActionBar actionBar = getActionBar(); - actionBar.setDisplayHomeAsUpEnabled(true); - mActionBarHideDelayTime = resources.getInteger(R.integer.action_bar_delay_time_in_millis); - actionBar.addOnMenuVisibilityListener(this); - actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); - } - - @Override - protected void onResume() { - super.onResume(); - setFullScreen(mFullScreen, false); - - mIsPaused = false; - if (mRestartLoader) { - mRestartLoader = false; - getLoaderManager().restartLoader(LOADER_PHOTO_LIST, null, this); - } - } - - @Override - protected void onPause() { - mIsPaused = true; - - super.onPause(); - } - - @Override - public void onBackPressed() { - // If in full screen mode, toggle mode & eat the 'back' - if (mFullScreen) { - toggleFullScreen(); - } else { - super.onBackPressed(); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putInt(STATE_ITEM_KEY, mViewPager.getCurrentItem()); - outState.putBoolean(STATE_FULLSCREEN_KEY, mFullScreen); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - default: - return super.onOptionsItemSelected(item); - } - } - - public void addScreenListener(OnScreenListener listener) { - mScreenListeners.add(listener); - } - - public void removeScreenListener(OnScreenListener listener) { - mScreenListeners.remove(listener); - } - - public synchronized void addCursorListener(CursorChangedListener listener) { - mCursorListeners.add(listener); - } - - public synchronized void removeCursorListener(CursorChangedListener listener) { - mCursorListeners.remove(listener); - } - - public boolean isFragmentFullScreen(Fragment fragment) { - if (mViewPager == null || mAdapter == null || mAdapter.getCount() == 0) { - return mFullScreen; - } - return mFullScreen || (mViewPager.getCurrentItem() != mAdapter.getItemPosition(fragment)); - } - - public void toggleFullScreen() { - setFullScreen(!mFullScreen, true); - } - - public void onPhotoRemoved(long photoId) { - final Cursor data = mAdapter.getCursor(); - if (data == null) { - // Huh?! How would this happen? - return; - } - - final int dataCount = data.getCount(); - if (dataCount <= 1) { - finish(); - return; - } - - getLoaderManager().restartLoader(LOADER_PHOTO_LIST, null, this); - } - - @Override - public Loader<Cursor> onCreateLoader(int id, Bundle args) { - if (id == LOADER_PHOTO_LIST) { - return new PhotoPagerLoader(this, Uri.parse(mPhotosUri), mProjection); - } - return null; - } - - @Override - public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) { - final int id = loader.getId(); - if (id == LOADER_PHOTO_LIST) { - if (data == null || data.getCount() == 0) { - mIsEmpty = true; - } else { - mAlbumCount = data.getCount(); - - if (mInitialPhotoUri != null) { - int index = 0; - int uriIndex = data.getColumnIndex(PhotoContract.PhotoViewColumns.URI); - while (data.moveToNext()) { - String uri = data.getString(uriIndex); - if (TextUtils.equals(uri, mInitialPhotoUri)) { - mInitialPhotoUri = null; - mPhotoIndex = index; - break; - } - index++; - } - } - - // We're paused; don't do anything now, we'll get re-invoked - // when the activity becomes active again - // TODO(pwestbro): This shouldn't be necessary, as the loader manager should - // restart the loader - if (mIsPaused) { - mRestartLoader = true; - return; - } - mIsEmpty = false; - - mAdapter.swapCursor(data); - notifyCursorListeners(data); - - // set the selected photo - int itemIndex = mPhotoIndex; - - // Use an index of 0 if the index wasn't specified or couldn't be found - if (itemIndex < 0) { - itemIndex = 0; - } - - mViewPager.setCurrentItem(itemIndex, false); - setViewActivated(); - } - // Update the any action items - updateActionItems(); - } - } - - protected void updateActionItems() { - // Do nothing, but allow extending classes to do work - } - - private synchronized void notifyCursorListeners(Cursor data) { - // tell all of the objects listening for cursor changes - // that the cursor has changed - for (CursorChangedListener listener : mCursorListeners) { - listener.onCursorChanged(data); - } - } - - @Override - public void onLoaderReset(Loader<Cursor> loader) { - // If the loader is reset, remove the reference in the adapter to this cursor - // TODO(pwestbro): reenable this when b/7075236 is fixed - // mAdapter.swapCursor(null); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } - - @Override - public void onPageSelected(int position) { - mPhotoIndex = position; - setViewActivated(); - } - - @Override - public void onPageScrollStateChanged(int state) { - } - - public boolean isFragmentActive(Fragment fragment) { - if (mViewPager == null || mAdapter == null) { - return false; - } - return mViewPager.getCurrentItem() == mAdapter.getItemPosition(fragment); - } - - public void onFragmentVisible(PhotoViewFragment fragment) { - updateActionBar(fragment); - } - - @Override - public InterceptType onTouchIntercept(float origX, float origY) { - boolean interceptLeft = false; - boolean interceptRight = false; - - for (OnScreenListener listener : mScreenListeners) { - if (!interceptLeft) { - interceptLeft = listener.onInterceptMoveLeft(origX, origY); - } - if (!interceptRight) { - interceptRight = listener.onInterceptMoveRight(origX, origY); - } - listener.onViewActivated(); - } - - if (interceptLeft) { - if (interceptRight) { - return InterceptType.BOTH; - } - return InterceptType.LEFT; - } else if (interceptRight) { - return InterceptType.RIGHT; - } - return InterceptType.NONE; - } - - /** - * Updates the title bar according to the value of {@link #mFullScreen}. - */ - protected void setFullScreen(boolean fullScreen, boolean setDelayedRunnable) { - final boolean fullScreenChanged = (fullScreen != mFullScreen); - mFullScreen = fullScreen; - - if (mFullScreen) { - setLightsOutMode(true); - cancelActionBarHideRunnable(); - } else { - setLightsOutMode(false); - if (setDelayedRunnable) { - postActionBarHideRunnableWithDelay(); - } - } - - if (fullScreenChanged) { - for (OnScreenListener listener : mScreenListeners) { - listener.onFullScreenChanged(mFullScreen); - } - } - } - - private void postActionBarHideRunnableWithDelay() { - mHandler.postDelayed(mActionBarHideRunnable, - mActionBarHideDelayTime); - } - - private void cancelActionBarHideRunnable() { - mHandler.removeCallbacks(mActionBarHideRunnable); - } - - protected void setLightsOutMode(boolean enabled) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - int flags = enabled - ? View.SYSTEM_UI_FLAG_LOW_PROFILE - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE - : View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; - - // using mViewPager since we have it and we need a view - mViewPager.setSystemUiVisibility(flags); - } else { - final ActionBar actionBar = getActionBar(); - if (enabled) { - actionBar.hide(); - } else { - actionBar.show(); - } - int flags = enabled - ? View.SYSTEM_UI_FLAG_LOW_PROFILE - : View.SYSTEM_UI_FLAG_VISIBLE; - mViewPager.setSystemUiVisibility(flags); - } - } - - private Runnable mActionBarHideRunnable = new Runnable() { - @Override - public void run() { - setFullScreen(true, true); - } - }; - - public void setViewActivated() { - for (OnScreenListener listener : mScreenListeners) { - listener.onViewActivated(); - } - } - - /** - * Adjusts the activity title and subtitle to reflect the photo name and count. - */ - protected void updateActionBar(PhotoViewFragment fragment) { - final int position = mViewPager.getCurrentItem() + 1; - final String title; - final String subtitle; - final boolean hasAlbumCount = mAlbumCount >= 0; - - final Cursor cursor = getCursorAtProperPosition(); - - if (cursor != null) { - final int photoNameIndex = cursor.getColumnIndex(PhotoContract.PhotoViewColumns.NAME); - title = cursor.getString(photoNameIndex); - } else { - title = null; - } - - if (mIsEmpty || !hasAlbumCount || position <= 0) { - subtitle = null; - } else { - subtitle = getResources().getString(R.string.photo_view_count, position, mAlbumCount); - } - - final ActionBar actionBar = getActionBar(); - actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE); - actionBar.setTitle(title); - actionBar.setSubtitle(subtitle); - } - - /** - * Utility method that will return the cursor that contains the data - * at the current position so that it refers to the current image on screen. - * @return the cursor at the current position or - * null if no cursor exists or if the {@link PhotoViewPager} is null. - */ - public Cursor getCursorAtProperPosition() { - if (mViewPager == null) { - return null; - } - - final int position = mViewPager.getCurrentItem(); - final Cursor cursor = mAdapter.getCursor(); - - if (cursor == null) { - return null; - } - - cursor.moveToPosition(position); - - return cursor; - } - - public Cursor getCursor() { - return (mAdapter == null) ? null : mAdapter.getCursor(); - } - - @Override - public void onMenuVisibilityChanged(boolean isVisible) { - if (isVisible) { - cancelActionBarHideRunnable(); - } else { - postActionBarHideRunnableWithDelay(); - } - } - - protected boolean isFullScreen() { - return mFullScreen; - } - - protected void setPhotoIndex(int index) { - mPhotoIndex = index; - } - - public void onNewPhotoLoaded() { - } -} |