package com.doplgangr.secrecy.Views;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import com.doplgangr.secrecy.Config;
import com.doplgangr.secrecy.CustomApp;
import com.doplgangr.secrecy.FileSystem.File;
import com.doplgangr.secrecy.FileSystem.Vault;
import com.doplgangr.secrecy.Jobs.ImageLoadJob;
import com.doplgangr.secrecy.R;
import com.doplgangr.secrecy.Util;
import com.doplgangr.secrecy.Views.DummyViews.HackyViewPager;
import com.ipaulpro.afilechooser.utils.FileUtils;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.Fullscreen;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.WindowFeature;
import java.util.ArrayList;
import de.greenrobot.event.EventBus;
import uk.co.senab.photoview.PhotoView;
@Fullscreen
@WindowFeature(Window.FEATURE_NO_TITLE)
@EActivity(R.layout.activity_view_pager)
public class FilePhotoFragment extends FragmentActivity {
static Activity context;
@Extra(Config.vault_extra)
String vault;
@Extra(Config.password_extra)
String password;
@Extra(Config.gallery_item_extra)
Integer itemNo;
@ViewById(R.id.view_pager)
HackyViewPager mViewPager;
@AfterViews
void onCreate() {
context = this;
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);
final SamplePagerAdapter adapter = new SamplePagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(adapter);
Vault secret = new Vault(vault, password);
Vault.onFileFoundListener mListener = new Vault.onFileFoundListener() {
@Override
public void dothis(File file) {
adapter.add(file);
}
};
secret.iterateAllFiles(mListener);
if ((itemNo != null) && (itemNo < (mViewPager.getAdapter().getCount()))) //check if requested item is in bound
mViewPager.setCurrentItem(itemNo);
}
public void onEventMainThread(ImageLoadJob.ImageLoadDoneEvent event) {
Util.log("Recieving imageview and bm");
if (event.bitmap == null && event.progressBar == null && event.imageView == null) {
Util.alert(context,
context.getString(R.string.Error__out_of_memory),
context.getString(R.string.Error__out_of_memory_message),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
context.finish();
}
},
null);
return;
}
try {
int vHeight = event.imageView.getHeight();
int vWidth = event.imageView.getWidth();
int bHeight = event.bitmap.getHeight();
int bWidth = event.bitmap.getWidth();
float ratio = vHeight / bHeight < vWidth / bWidth ? (float) vHeight / bHeight : (float) vWidth / bWidth;
Util.log(vHeight, vWidth, bHeight, bWidth);
Util.log(ratio);
event.imageView.setImageBitmap(Bitmap.createScaledBitmap(event.bitmap, (int) (ratio * bWidth)
, (int) (ratio * bHeight), false));
} catch (OutOfMemoryError e) {
Util.alert(context,
context.getString(R.string.Error__out_of_memory),
context.getString(R.string.Error__out_of_memory_message),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
context.finish();
}
},
null);
}
event.progressBar.setVisibility(View.GONE);
}
static class SamplePagerAdapter extends FragmentPagerAdapter {
private static ArrayList<File> files;
public SamplePagerAdapter(FragmentManager fm) {
super(fm);
files = new ArrayList<File>();
}
public void add(File file) {
String mimeType = FileUtils.getMimeType(file.getFile());
if (mimeType != null)
if (!mimeType.contains("image"))
return; //abort if not images.
files.add(file);
notifyDataSetChanged();
}
@Override
public int getCount() {
return files.size();
}
@Override
public Fragment getItem(int position) {
return PhotoFragment.newInstance(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (position >= getCount()) {
((Fragment) object).onDestroy();
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
}
public static class PhotoFragment extends Fragment {
int mNum;
PhotoView photoView;
static PhotoFragment newInstance(int num) {
PhotoFragment f = new PhotoFragment();
Bundle args = new Bundle();
args.putInt(Config.gallery_item_extra, num);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt(Config.gallery_item_extra) : 1;
}
/**
* The Fragment's UI is just a simple text view showing its
* instance number.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Util.log("onCreateView!!");
final RelativeLayout relativeLayout = new RelativeLayout(container.getContext());
final File file = files.get(mNum);
final PhotoView photoView = new PhotoView(container.getContext());
this.photoView = photoView;
relativeLayout.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
photoView.setImageBitmap(file.getThumb(150));
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
final ProgressBar pBar = new ProgressBar(container.getContext());
pBar.setIndeterminate(false);
relativeLayout.addView(pBar, layoutParams);
CustomApp.jobManager.addJobInBackground(new ImageLoadJob(mNum, file, photoView, pBar));
return relativeLayout;
}
@Override
public void onDestroy() {
Util.log("onDestroy!!");
if (photoView != null) {
BitmapDrawable bd = (BitmapDrawable) photoView.getDrawable();
bd.getBitmap().recycle();
}
super.onDestroy();
}
}
}
}