package com.doplgangr.secrecy.fragments; import android.app.Activity; import android.content.DialogInterface; import android.os.Bundle; import android.preference.PreferenceManager; 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.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.ProgressBar; import android.widget.RelativeLayout; import com.doplgangr.secrecy.Config; import com.doplgangr.secrecy.CustomApp; import com.doplgangr.secrecy.events.ImageLoadDoneEvent; import com.doplgangr.secrecy.exceptions.SecrecyFileException; import com.doplgangr.secrecy.filesystem.encryption.VaultHolder; import com.doplgangr.secrecy.filesystem.files.EncryptedFile; import com.doplgangr.secrecy.filesystem.encryption.Vault; import com.doplgangr.secrecy.jobs.ImageLoadJob; import com.doplgangr.secrecy.R; import com.doplgangr.secrecy.utils.Util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import de.greenrobot.event.EventBus; import uk.co.senab.photoview.PhotoView; public class FilePhotoFragment extends FragmentActivity { private static Activity context; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_view_pager); if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this); final SamplePagerAdapter adapter = new SamplePagerAdapter(getSupportFragmentManager()); Bundle extras = getIntent().getExtras(); mViewPager = (ViewPager) findViewById(R.id.view_pager); mViewPager.setAdapter(adapter); Vault secret = VaultHolder.getInstance().retrieveVault(); Vault.onFileFoundListener mListener = new Vault.onFileFoundListener() { @Override public void dothis(EncryptedFile file) { adapter.add(file); } }; secret.iterateAllFiles(mListener); context = this; adapter.sort(); int itemNo = extras.getInt(Config.gallery_item_extra); if (itemNo < (mViewPager.getAdapter().getCount())) { //check if requested item is in bound mViewPager.setCurrentItem(itemNo); } } @Override public void onDestroy(){ super.onDestroy(); EventBus.getDefault().unregister(this); } public void onEventMainThread(ImageLoadDoneEvent event) { Util.log("Recieving imageview and bm"); if (event.bitmap == 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 { event.imageView.setImageBitmap(event.bitmap); } 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 FragmentStatePagerAdapter { private static ArrayList<EncryptedFile> encryptedFiles; public SamplePagerAdapter(FragmentManager fm) { super(fm); encryptedFiles = new ArrayList<EncryptedFile>(); } public void add(EncryptedFile encryptedFile) { String mimeType = Util.getFileTypeFromExtension(encryptedFile.getFileExtension()); if (mimeType != null) if (!mimeType.contains("image")) return; //abort if not images. encryptedFiles.add(encryptedFile); notifyDataSetChanged(); } public void sort(){ Comparator<EncryptedFile> comparator; switch (PreferenceManager.getDefaultSharedPreferences(context).getString( Config.VAULT_SORT, Config.VAULT_SORT_ALPHABETIC)) { case Config.VAULT_SORT_ALPHABETIC: comparator = Config.COMPARATOR_ENCRYPTEDFILE_ALPHABETIC; break; case Config.VAULT_SORT_FILETYPE: comparator = Config.COMPARATOR_ENCRYPTEDFILE_FILETYPE; break; case Config.VAULT_SORT_LASTMODIFIED: comparator = Config.COMPARATOR_ENCRYPTEDFILE_LASTMODIFIED; break; default: comparator = null; } if (comparator != null) { Collections.sort(encryptedFiles, comparator); } } @Override public int getCount() { return encryptedFiles.size(); } @Override public Fragment getItem(int position) { return PhotoFragment.newInstance(position); } public static class PhotoFragment extends Fragment { int mNum; private ImageLoadJob imageLoadJob = null; 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 EncryptedFile encryptedFile = encryptedFiles.get(mNum); final PhotoView photoView = new PhotoView(container.getContext()); relativeLayout.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); try { photoView.setImageBitmap(encryptedFile.getEncryptedThumbnail().getThumb(150)); } catch (SecrecyFileException e) { Util.log("No bitmap available!"); } 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); imageLoadJob = new ImageLoadJob(mNum, encryptedFile, photoView, pBar); CustomApp.jobManager.addJobInBackground(imageLoadJob); return relativeLayout; } @Override public void onPause(){ super.onPause(); if (imageLoadJob != null) { imageLoadJob.setObsolet(true); } } @Override public void onDestroy(){ super.onDestroy(); if (imageLoadJob != null) { imageLoadJob.setObsolet(true); } } } } }