package vandy.mooc.view; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import vandy.mooc.R; import vandy.mooc.utils.loader.ImageLoader; import android.app.Fragment; import android.app.FragmentManager; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v13.app.FragmentStatePagerAdapter; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; /** * Displays a directory of Images in a ViewPager. Each image is * displayed fullscreen and the user can swipe to navigate to other * images. * * @author Geoffrey */ public class ViewPagerActivity extends FragmentActivity { /* * Constants */ /** * Class tag for Debugging */ private static final String TAG = ViewPagerActivity.class.getCanonicalName(); /** * Constant used to access the position of the current image * passed through the intent. */ public static final String CURRENT_IMAGE_POSITION = "img"; /** * Name of the intent action that will start this Activity. */ public static String ACTION_DISPLAY_IMAGES_SWIPE = "android.intent.action.DISPLAY_IMAGES_SWIPE"; /* * Data members. */ /** * The FragmentStatePagerAdapter responsible for creating the * fragments holding each bitmap that are used by the ViewPager. */ ImagePagerAdapter mImagePagerAdapter; /** * The UI element responsible for displaying each fragment and * handling the swipe navigation. */ ViewPager mViewPager; /** * The position in the directory of the currently displayed image. */ public int mCurrentImage; /** * The file path to the directory of images. */ private String mFilePath; /** * ImageLoader used to load the images in the background */ private ImageLoader mLoader; /** * The screen width that is used to scale the loaded bitmaps */ private static int mWidth; /** * Factory method that returns an Intent for displaying Images in * a ViewPager * * @param directoryPathname * Filepath storing images to display * @param position * Position of starting image * @return */ public static Intent makeIntent(String directoryPathname, int position) { return new Intent(ACTION_DISPLAY_IMAGES_SWIPE) .setDataAndType( Uri.parse(directoryPathname) .buildUpon() .scheme("file") .build(), "image/*") .putExtra(ViewPagerActivity.CURRENT_IMAGE_POSITION, position); } /** * This Creates the activity, the Viewpager, and its adapter. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Extract intent's data. Intent intent = getIntent(); Log.v(TAG, "2" + intent); Log.v(TAG, "2" + intent.getData()); // If the intent exists and contains the filepath, extract its // data if (intent != null && intent.getData() != null) { mCurrentImage = intent.getIntExtra(CURRENT_IMAGE_POSITION, 0); mFilePath = intent.getData().getPath(); } Log.v(TAG, "mFilePath" + mFilePath); // Set the content view. setContentView(R.layout.image_detail_swipe_activity); // Find the screen's width DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); mWidth = displaymetrics.widthPixels; // Initialize the pager adapter. File dirFile = new File(mFilePath); mImagePagerAdapter = new ImagePagerAdapter(getFragmentManager(), dirFile.listFiles()); // Initialize the ViewPager using the pager adapter mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mImagePagerAdapter); mViewPager.setCurrentItem(mCurrentImage); Log.v(TAG, "first image #: " + mCurrentImage); // Initialize the ImageLoader mLoader = new ImageLoader(getResources().getDrawable(R.drawable.loading)); } /** * Accesses the ImageLoader used by this activity. */ public ImageLoader getImageLoader () { return mLoader; } /** * FragmentStatePagerAdapter that returns fragments containing a * fullscreen representation of the images stored in the directory * passed to the setBitmaps method */ private class ImagePagerAdapter extends FragmentStatePagerAdapter { /** * The ArrayList of Files holding the images to be displayed. */ private ArrayList<File> mBitmapFiles; /** * Constructor initializes data members. */ public ImagePagerAdapter(FragmentManager fm, File[] files) { super(fm); Log.v(TAG, "ImagePagerAdapter constructor()"); mBitmapFiles = new ArrayList<>(Arrays.asList(files)); } /** * Returns a fragment that displays the Bitmap at the * requested position in the directory. */ @Override public Fragment getItem(int position) { Log.v(TAG, "getItem" + position); mCurrentImage = position; // Create a new ImageDetailFragment holding the Image // stored at the File in the requested position. return ImageDetailFragment.newInstance (mBitmapFiles.get(position)); } /** * Returns the number of Images in the directory. */ @Override public int getCount() { Log.v(TAG, "ImagePagerAdapter getCount()"); return mBitmapFiles.size(); } } /** * Fragment representing a single Bitmap object in the collection. */ public static class ImageDetailFragment extends Fragment { /** * The file path of the image to be displayed */ String mImageFilePath; /** * Empty constructor, which is needed for Fragments. */ public ImageDetailFragment() { /* no-op */ } /** * Create a new instance of ImageDetailFragment, providing an * image file to be displayed. */ static ImageDetailFragment newInstance(File imageFile) { ImageDetailFragment f = new ImageDetailFragment(); // Supply the file's path as an argument. Bundle args = new Bundle(); args.putString("file", imageFile.getPath()); f.setArguments(args); return f; } /** * When creating, retrieve this instance's image's file path * from its arguments. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Retrieve the file to display from the fragment's // set arguments if it exists (i.e. the fragment has // undergone an orientation change, or the newInstance() // method was used to create the fragment mImageFilePath = getArguments() != null ? getArguments().getString("file") : null; } /** * Returns a view displaying the image found at the file path * full screen. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Create the fragment's view from its corresponding layout file View rootView = inflater.inflate(R.layout.fragment_collection_detail, container, false); // Use the ImageLoader to load and display the bitmap ((ViewPagerActivity)getActivity()) .getImageLoader() .loadAndDisplayImage((ImageView)rootView.findViewById(R.id.img_view), mImageFilePath, mWidth); return rootView; } } }