/* * Copyright (C) 2012 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.gmail.charleszq.picorner.ui; import java.util.HashSet; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import android.app.ActionBar; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import com.gmail.charleszq.picorner.BuildConfig; import com.gmail.charleszq.picorner.R; import com.gmail.charleszq.picorner.dp.IPhotosProvider; import com.gmail.charleszq.picorner.model.MediaObject; import com.gmail.charleszq.picorner.utils.IConstants; import com.nostra13.universalimageloader.core.ImageLoader; public class ImageDetailActivity extends FragmentActivity implements OnClickListener { private static final String TAG = ImageDetailActivity.class .getSimpleName(); public static final String LARGE_IMAGE_POSITION = "extra_image"; //$NON-NLS-1$ public static final String DP_KEY = "data.provider"; //$NON-NLS-1$ public static final String OFFLINE_COMMAND_KEY = "is.command.support.offline"; //$NON-NLS-1$ /** * The intent key to say if we need to start the slide show. */ public static final String SLIDE_SHOW_KEY = "start.slide.show"; //$NON-NLS-1$ /** * The key to save intent value to indicate whether we show the action bar * by default */ public static final String SHOW_ACTION_BAR_KEY = "show.action.bar"; //$NON-NLS-1$ private ImagePagerAdapter mAdapter; private ImageLoader mImageFetcher; private ViewPager mPager; private Set<IActionBarVisibleListener> mActionBarListeners; IPhotosProvider mPhotosProvider; /** * the marker to say if the current command is offline enabled. */ boolean mIsOfflineEnabled = false; private Timer mTimer; private Handler mHandler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_detail_pager); // The ImageFetcher takes care of loading images into our ImageView // children asynchronously mImageFetcher = ImageLoader.getInstance(); // is offline enabled String isOfflineEnabledString = getIntent().getStringExtra( OFFLINE_COMMAND_KEY); if (isOfflineEnabledString != null) { mIsOfflineEnabled = Boolean.parseBoolean(isOfflineEnabledString); } // Set up ViewPager and backing adapter mPhotosProvider = (IPhotosProvider) getIntent().getExtras() .getSerializable(DP_KEY); mAdapter = new ImagePagerAdapter(mPhotosProvider, getSupportFragmentManager(), mPhotosProvider.getCurrentSize(), mIsOfflineEnabled); mPager = (ViewPager) findViewById(R.id.pager); mPager.setAdapter(mAdapter); mPager.setPageMargin((int) getResources().getDimension( R.dimen.image_detail_pager_margin)); mPager.setOffscreenPageLimit(2); // Set up activity to go full screen getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN); final ActionBar actionBar = getActionBar(); // Hide title text and set home as up actionBar.setDisplayHomeAsUpEnabled(true); // actionBar.setDisplayShowTitleEnabled(false); // Hide and show the ActionBar as the visibility changes mPager.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int vis) { boolean shown = true; if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) { actionBar.hide(); shown = false; } else { actionBar.show(); } if (mActionBarListeners != null) { for (IActionBarVisibleListener lis : mActionBarListeners) { lis.onActionBarShown(shown); } } } }); // Start low profile mode and hide ActionBar boolean showActionBar = getIntent().getBooleanExtra( SHOW_ACTION_BAR_KEY, true); if (!showActionBar) { mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); actionBar.hide(); } // Set the current item based on the extra passed in to this activity final int extraCurrentItem = getIntent().getIntExtra( LARGE_IMAGE_POSITION, -1); if (extraCurrentItem != -1) { mPager.setCurrentItem(extraCurrentItem); } boolean startSlide = getIntent().getBooleanExtra(SLIDE_SHOW_KEY, false); if (startSlide) { startSlideShow(1); } } /** * If slide show command comes directly from the offline menu item, set the 'delay' to the same as * the interval, otherwise, it means the command comes from this activity itself, then just delay for * 2 seconds. * @param delay */ void startSlideShow(int delay) { SharedPreferences sp = this.getSharedPreferences(IConstants.DEF_PREF_NAME, Context.MODE_APPEND); int interval = Integer.parseInt(sp.getString(IConstants.PREF_SLIDE_SHOW_INTERVAL, IConstants.DEF_SLIDE_SHOW_INTERVAL)); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mTimer = new Timer(); mTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { int currentPosition = mPager.getCurrentItem(); currentPosition++; if (currentPosition >= mAdapter.getCount()) currentPosition = 0; mPager.setCurrentItem(currentPosition); } }); } }, delay == 1 ? interval : 2000, interval); mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); getActionBar().hide(); if (BuildConfig.DEBUG) Log.d(TAG, "slide show starts..."); //$NON-NLS-1$ } /** * Called by the ViewPager child fragments to load images via the one * ImageFetcher */ public ImageLoader getImageFetcher() { return mImageFetcher; } /** * The main adapter that backs the ViewPager. A subclass of * FragmentStatePagerAdapter as there could be a large number of items in * the ViewPager and we don't want to retain them all in memory at once but * create/destroy them on the fly. */ private class ImagePagerAdapter extends FragmentStatePagerAdapter { private final int mSize; private IPhotosProvider mProvider; private boolean mIsOfflineEnabled = false; public ImagePagerAdapter(IPhotosProvider provider, FragmentManager fm, int size, boolean offlineEnabled) { super(fm); mSize = size; this.mProvider = provider; this.mIsOfflineEnabled = offlineEnabled; } @Override public int getCount() { return mSize; } @Override public Fragment getItem(int position) { MediaObject obj = mProvider.getMediaObject(position); ImageDetailFragment frg = ImageDetailFragment.newInstance( obj.getLargeUrl() == null ? obj.getThumbUrl() : obj .getLargeUrl(), mProvider, position, mIsOfflineEnabled); return frg; } } /** * Set on the ImageView in the ViewPager children fragments, to * enable/disable low profile mode when the ImageView is touched. */ @Override public void onClick(View v) { final int vis = mPager.getSystemUiVisibility(); if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) { mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } else { mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } if (mTimer != null) { mTimer.cancel(); if (BuildConfig.DEBUG) Log.d(TAG, "slide show stoped..."); //$NON-NLS-1$ } getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } void addActionBarListener(IActionBarVisibleListener lis) { if (mActionBarListeners == null) { mActionBarListeners = new HashSet<IActionBarVisibleListener>(); } mActionBarListeners.add(lis); } void removeActionBarListener(IActionBarVisibleListener lis) { if (mActionBarListeners != null) { mActionBarListeners.remove(lis); } } /** * @author charles(charleszq@gmail.com) * */ static interface IActionBarVisibleListener { void onActionBarShown(boolean show); } }