package eu.tpmusielak.securephoto.viewer;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.net.Uri;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import eu.tpmusielak.securephoto.R;
import eu.tpmusielak.securephoto.container.SPImage;
import eu.tpmusielak.securephoto.container.SPImageRoll;
import eu.tpmusielak.securephoto.container.wrapper.SPFileWrapper;
import eu.tpmusielak.securephoto.container.wrapper.SPIWrapper;
import eu.tpmusielak.securephoto.container.wrapper.SPRWrapper;
import eu.tpmusielak.securephoto.tools.FileHandling;
import eu.tpmusielak.securephoto.verification.VerificationFactorData;
import eu.tpmusielak.securephoto.verification.Verifier;
import eu.tpmusielak.securephoto.viewer.lazylist.ImageLoader;
import java.io.File;
import java.io.IOException;
import java.util.Map;
/**
* Created by IntelliJ IDEA.
* User: Tomasz P. Musielak
* Date: 09.02.12
* Time: 16:33
*/
public class ViewImages extends Activity {
public static final int THUMBNAIL_SIZE = 80;
private Context mContext;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupScreen();
}
private void setupScreen() {
setContentView(R.layout.gallery_view);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
listView = (ListView) findViewById(R.id.gallery_list);
File[] files = FileHandling.getFiles();
if (!(files == null) && files.length > 0) {
ImageViewAdapter adapter = new ImageViewAdapter(ViewImages.this, R.layout.gallery_row, R.layout.gallery_roll_row, files);
// Sort descending
adapter.sort(new FileHandling.DescendingDateComparator());
listView.setAdapter(adapter);
listView.setOnItemClickListener(new ImageClickListener());
registerForContextMenu(listView);
} else {
TextView textView = new TextView(ViewImages.this);
textView.setText(R.string.no_files_found);
TextView galleryInfo = (TextView) findViewById(R.id.gallery_info);
galleryInfo.setText(R.string.no_files_found);
galleryInfo.setVisibility(View.VISIBLE);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.view_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.delete:
deleteFile((File) listView.getItemAtPosition(info.position));
break;
case R.id.send:
sendFile((File) listView.getItemAtPosition(info.position));
break;
case R.id.info:
viewInfo((File) listView.getItemAtPosition(info.position));
break;
default:
break;
}
return false;
}
private void deleteFile(final File file) {
final AlertDialog.Builder builder = new AlertDialog.Builder(ViewImages.this);
builder.setMessage(R.string.ask_confirm)
.setCancelable(true)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
boolean success = file.delete();
int message = success ? R.string.delete_success : R.string.delete_failure;
Toast.makeText(ViewImages.this, message, Toast.LENGTH_SHORT).show();
setupScreen();
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
}
});
final AlertDialog alertDialog = builder.create();
alertDialog.show();
}
private void sendFile(File file) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("application/octet-stream");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + file.getAbsolutePath()));
startActivity(Intent.createChooser(intent, getResources().getString(R.string.send_file)));
}
private void viewInfo(File file) {
if (file == null)
return;
SPFileWrapper wrapper = SPFileWrapper.getWrapperForFile(file);
if (wrapper == null)
return;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
if (wrapper instanceof SPIWrapper) {
SPImage image = null;
try {
image = SPImage.fromFile(file);
StringBuilder sb = new StringBuilder();
sb.append(image.toString());
Map<Class<Verifier>, VerificationFactorData> verificationFactorData = image.getVerificationFactorData();
for (VerificationFactorData data : verificationFactorData.values()) {
sb.append(data.toString());
sb.append('\n');
}
builder.setMessage(sb.toString());
} catch (IOException e) {
builder.setMessage(e.getMessage());
} catch (ClassNotFoundException e) {
builder.setMessage(e.getMessage());
}
} else if (wrapper instanceof SPRWrapper) {
try {
SPImageRoll roll = SPImageRoll.fromFile(file);
builder.setMessage(roll.toString());
} catch (IOException e) {
builder.setMessage(e.getMessage());
} catch (ClassNotFoundException e) {
builder.setMessage(e.getMessage());
}
}
AlertDialog dialog = builder.create();
dialog.show();
}
private class ImageViewAdapter extends ArrayAdapter<File> {
// http://android-er.blogspot.com/2010/06/using-convertview-in-getview-to-make.html
// inspired by: https://github.com/thest1/LazyList/
private final int FRAME_VIEW = 0;
private final int ROLL_VIEW = 1;
private Context context;
private int frameLayoutResourceId;
private int rollLayoutResourceID;
private File[] files;
private LayoutInflater layoutInflater;
private ImageLoader imageLoader;
public ImageViewAdapter(Context context, int resourceIDForFrame, int resourceIDForRoll, File[] files) {
super(context, resourceIDForFrame, files);
this.context = context;
this.frameLayoutResourceId = resourceIDForFrame;
this.rollLayoutResourceID = resourceIDForRoll;
this.files = files;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader = new ImageLoader(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
int itemViewType = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (itemViewType) {
case ROLL_VIEW:
convertView = layoutInflater.inflate(rollLayoutResourceID, parent, false);
holder.image = convertView.findViewById(R.id.gallery_view);
break;
case FRAME_VIEW:
default:
convertView = layoutInflater.inflate(frameLayoutResourceId, parent, false);
holder.image = convertView.findViewById(R.id.file_view);
break;
}
holder.text = (TextView) convertView.findViewById(R.id.roll_descriptor);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
File file = getItem(position);
String fileName = file.getName();
holder.text.setText(fileName);
switch (itemViewType) {
case ROLL_VIEW:
Gallery gallery = (Gallery) holder.image;
ImageRollAdapter adapter = (ImageRollAdapter) gallery.getAdapter();
if (adapter == null) {
adapter = new ImageRollAdapter(getContext(), file);
gallery.setAdapter(adapter);
gallery.setOnItemClickListener(new ImageRollClickListener(file));
} else {
adapter.setFile(file);
adapter.notifyDataSetChanged();
((ImageRollClickListener) gallery.getOnItemClickListener()).setUnderlyingFile(file);
}
break;
case FRAME_VIEW:
default:
imageLoader.load(new SPIWrapper(file, null), (ImageView) holder.image);
}
return convertView;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
File file = getItem(position);
String fileName = file.getName();
if (fileName.endsWith(SPImageRoll.DEFAULT_EXTENSION)) {
return ROLL_VIEW;
} else {
return FRAME_VIEW;
}
}
}
private static class ViewHolder {
TextView text;
View image;
}
private class ImageClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
View fileView = view.findViewById(R.id.file_view);
if (fileView == null) {
} else if (fileView instanceof ImageView) {
File file = (File) parent.getItemAtPosition(position);
Intent i = new Intent(getApplicationContext(), OpenImage.class);
i.putExtra("wrapper", SPFileWrapper.getWrapperForFile(file));
i.putExtra("filename", file.getAbsolutePath());
startActivity(i);
}
}
}
// Adapter for image roll
private class ImageRollAdapter extends BaseAdapter {
int mGalleryItemBackground;
private Context mContext;
private File file;
private ImageLoader imageLoader;
private SPImageRoll spImageRoll;
public ImageRollAdapter(Context context, File file) {
mContext = context;
TypedArray attr = mContext.obtainStyledAttributes(R.styleable.HelloGallery);
mGalleryItemBackground = attr.getResourceId(
R.styleable.HelloGallery_android_galleryItemBackground, 0);
attr.recycle();
this.file = file;
try {
spImageRoll = SPImageRoll.fromFile(this.file);
} catch (IOException ignored) {
} catch (ClassNotFoundException ignored) {
}
imageLoader = new ImageLoader(mContext);
}
public void setFile(File file) {
this.file = file;
try {
spImageRoll = SPImageRoll.fromFile(file);
} catch (IOException ignored) {
} catch (ClassNotFoundException ignored) {
}
}
public int getCount() {
return spImageRoll.getFrameCount();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = (ImageView) convertView;
if (imageView == null) {
imageView = new ImageView(mContext);
}
imageLoader.load(new SPRWrapper(file, spImageRoll.getHeader(), position), imageView);
imageView.setLayoutParams(new Gallery.LayoutParams(240, 160));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setBackgroundResource(mGalleryItemBackground);
return imageView;
}
}
private class ImageRollClickListener implements AdapterView.OnItemClickListener {
private File underlyingFile;
private ImageRollClickListener(File underlyingFile) {
this.underlyingFile = underlyingFile;
}
public void setUnderlyingFile(File underlyingFile) {
this.underlyingFile = underlyingFile;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getApplicationContext(), OpenImage.class);
i.putExtra("filename", underlyingFile.getAbsolutePath());
i.putExtra("frameIndex", position);
startActivity(i);
}
}
}