package info.guardianproject.otr.app.im.ui; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Point; import android.os.Build; import android.os.Bundle; import android.view.Display; import android.view.View; import info.guardianproject.iocipher.File; import info.guardianproject.iocipher.FileInputStream; import info.guardianproject.otr.app.im.R; import java.io.IOException; public class ImageViewActivity extends Activity { public static final String FILENAME = "filename"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_view_activity); } @Override protected void onStart() { super.onStart(); final String filename = getIntent().getStringExtra(FILENAME); runOnUiThread( new Runnable() { @Override public void run() { display(filename); } }); } private void display( String filename ) { try { Bitmap bitmap = fitToScreen(filename); PZSImageView imageView = (PZSImageView) findViewById(R.id.pzs_image_view); imageView.setImageBitmap(bitmap); } catch (Throwable t) { // may run Out Of Memory findViewById(R.id.pzs_image_view).setVisibility(View.INVISIBLE); findViewById(R.id.pzs_broken_image_view).setVisibility(View.VISIBLE); } } private Bitmap fitToScreen( String filename ) throws IOException { // read in dimensions only BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; options.inInputShareable = true; options.inPurgeable = true; FileInputStream fis = new FileInputStream(new File(filename)); BitmapFactory.decodeStream(fis, null, options); fis.close(); if ((options.outWidth <= 0) || (options.outHeight <= 0)) throw new IOException( "Image dimensions unknown"); // calculate down sampling ratio to fit screen int imageWidth = options.outWidth; int imageHeight = options.outHeight; options = new BitmapFactory.Options(); Point screenDimensions = getScreenDimensions(); if (imageHeight > imageWidth) { options.inSampleSize = imageHeight / screenDimensions.y; } else { options.inSampleSize = imageWidth / screenDimensions.x; } // read in downsampled image fis = new FileInputStream(new File(filename)); Bitmap scaledBitmap = BitmapFactory.decodeStream(fis, null, options); fis.close(); return scaledBitmap; } @SuppressLint("NewApi") private Point getScreenDimensions() { Display display = getWindowManager().getDefaultDisplay(); if (Build.VERSION.SDK_INT >= 13) { Point size = new Point(); display.getSize(size); return size; } return new Point( display.getWidth(), display.getHeight()); } }