package vandy.mooc.view;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.net.Uri;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import java.io.File;
import vandy.mooc.R;
import vandy.mooc.common.LifecycleLoggingActivity;
import vandy.mooc.utils.loader.ImageLoader;
/**
* An Activity that displays all the images that have been downloaded
* and processed.
*/
public class DisplayImagesActivity
extends LifecycleLoggingActivity {
/**
* Name of the Intent Action that wills start this Activity.
*/
public static String ACTION_DISPLAY_IMAGES =
"android.intent.action.DISPLAY_IMAGES";
/**
* The column width to use for the GridView.
*/
private int mColWidth;
/**
* The number of columns to use in the GridView.
*/
private int mNumCols;
/**
* A reasonable column width.
*/
private final int COL_WIDTH = 300;
/**
* The adapter responsible for loading the results into the GridView.
*/
private ImageAdapter imageAdapter;
/**
* The file path in external storage storing images to display
*/
private String mFilePath;
/**
* ImageLoader used to load images in the background
*/
private ImageLoader mLoader;
/**
* Creates the activity and generates a button for each filter
* applied to the images. These buttons load change the
* imageAdapter's source to a new directory, from which it will
* load images into the GridView.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display_images_activity);
// Configure the GridView adapter and dimensions.
imageAdapter = new ImageAdapter(this);
GridView imageGrid = (GridView) findViewById(R.id.imageGrid);
imageGrid.setAdapter(imageAdapter);
configureGridView(imageGrid);
// Initialize the image loader
mLoader = new ImageLoader(getResources()
.getDrawable
(R.drawable.loading));
// Retrieve the file path to the directory containing the
// images to display from the intent.
mFilePath = getIntent().getData().getPath();
// Find the directory and load the directory as the source of
// the imageAdapter.
imageAdapter.setBitmaps(mFilePath);
// Implement onItemClick to start a SwipeListDisplay at
// the current image.
imageGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
startActivity(ViewPagerActivity.makeIntent
(mFilePath,
position));
}
});
}
/**
* Factory method that returns an implicit Intent for displaying
* images.
*/
public static Intent makeIntent(Uri directoryPathname) {
return new Intent(ACTION_DISPLAY_IMAGES)
.setDataAndType(
Uri.parse(directoryPathname.getPath())
.buildUpon()
.scheme("file")
.build(),
"image/*");
}
/**
* Configures the GridView with an appropriate column number and
* width based on the screen size.
*/
private void configureGridView(GridView imageGrid) {
// Retrieve the Screen dimensions.
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
// Calculate appropriate values.
mNumCols = size.x / COL_WIDTH;
mColWidth = size.x / mNumCols;
// Configure the GridView with dynamic values.
imageGrid.setColumnWidth(mColWidth);
imageGrid.setNumColumns(mNumCols);
((ImageAdapter) imageGrid.getAdapter()).setColWidth(mColWidth);
}
/**
* @class ImageAdapter
*
* @brief The Adapter that loads the Images into the Layout's GridView.
*/
public class ImageAdapter extends BaseAdapter {
/**
* File path of the directory holding the images to display
*/
private String mFilePath = null;
/**
* The Context of the application
*/
private Context mContext;
/**
* The padding each image will have around it
*/
private int mPadding = 0;
/**
* The image files being displayed
*/
private File[] mBitmapFiles;
/**
* Creates the ImageAdapter in the given context.
*/
public ImageAdapter(Context c) {
mContext = c;
mBitmapFiles = new File[] {};
}
/**
* Returns the count of bitmaps in the list.
*/
@Override
public int getCount() {
return mBitmapFiles.length;
}
/**
* Returns the bitmap at the given position.
*/
@Override
public Object getItem(int position) {
return mBitmapFiles[position];
}
/**
* Returns the given position as the Id of the bitmap. This works
* because the bitmaps are stored in a sequential manner.
*/
@Override
public long getItemId(int position) {
return position;
}
/**
* Returns the view. This method is necessary for filling the
* GridView appropriately.
*/
@Override
public View getView(final int position,
View convertView,
ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
// Set configuration properties of the ImageView
imageView.setLayoutParams(new GridView.LayoutParams(mColWidth,
mColWidth));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(mPadding,
mPadding,
mPadding,
mPadding);
} else
imageView = (ImageView) convertView;
// Load the image in the background
mLoader.loadAndDisplayImage(imageView,
mBitmapFiles[position]
.getAbsolutePath(),
mColWidth);
return imageView;
}
/**
* Maximum width of a column.
*/
private int mColWidth = 100;
/**
* Set the maximum width of a column.
*/
public void setColWidth(int w) {
if (w > 0)
mColWidth = w;
}
/**
* Resets the bitmaps of the GridView to the ones found at the
* given filterPath.
*/
private void setBitmaps(String filterPath) {
mFilePath = filterPath;
mBitmapFiles = new File(filterPath).listFiles();
notifyDataSetChanged();
}
}
}