diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java index 88bfee7..3f1d9ec 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java @@ -31,9 +31,13 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.location.Location; import android.location.LocationManager; @@ -87,6 +91,7 @@ import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.OverlayItem; +import java.io.ByteArrayOutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -822,6 +827,30 @@ return name; } + public static Drawable convertByteArrayToDrawable(byte[] b, float scaleTo) { + if(scaleTo <= 0) return new BitmapDrawable(res, BitmapFactory.decodeByteArray(b, 0, b.length)); + Bitmap bitmap = new BitmapDrawable(res, BitmapFactory.decodeByteArray(b, 0, b.length)).getBitmap(); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + float widthScale = scaleTo / width; + float heightScale = scaleTo / height; + float scale = Math.min(widthScale, heightScale); + Matrix matrix = new Matrix(); + matrix.postScale(scale, scale); + Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); + return new BitmapDrawable(res, scaledBitmap); + } + + public static Drawable convertByteArrayToDrawable(byte[] b) { + return convertByteArrayToDrawable(b, -1); + } + + public static byte[] convertDrawableToByteArray(Drawable d) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + ((BitmapDrawable) d).getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, stream); + return stream.toByteArray(); + } + private void initGps(){ locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); boolean isLocationEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/adapters/EndangeredListAdapter.java b/app/src/main/java/de/apps4ics/mountainnavigation/adapters/EndangeredListAdapter.java index 9854b48..362103b 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/adapters/EndangeredListAdapter.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/adapters/EndangeredListAdapter.java @@ -23,7 +23,7 @@ import android.app.Activity; import android.content.Intent; -import android.graphics.BitmapFactory; +import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -38,6 +38,7 @@ import java.util.List; +import de.apps4ics.mountainnavigation.MainActivity; import de.apps4ics.mountainnavigation.R; import de.apps4ics.mountainnavigation.handlers.PoiHandler; import de.apps4ics.mountainnavigation.pois.Endangered; @@ -47,22 +48,35 @@ protected List items; protected ViewHolder currentHolder; protected int imagePosition; + protected int maxHeight; public EndangeredListAdapter(Activity context, List items) { super(context, R.layout.endangered_dialog_item, items); this.context = context; this.items = items; this.imagePosition = 0; + this.maxHeight = -1; } public void setImageAtPosition(Uri data) { - byte[] rawImage = PoiHandler.createImage(data, context.getApplicationContext()); - Drawable imageDraw = new BitmapDrawable(context.getResources(), BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length)); + byte[] rawImage = PoiHandler.createImage(data, context); + //Scale image to maximal res of max_db_image_* dimen to store it in DB + Drawable drawable = MainActivity.convertByteArrayToDrawable(rawImage); + Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); + int height = bitmap.getHeight(); + int width = bitmap.getWidth(); + boolean scaleToWidth = width > height; + int scaleTo = Math.max(height, width); + int dim = (int) (scaleToWidth ? MainActivity.getRes().getDimension(R.dimen.max_db_image_width) : MainActivity.getRes().getDimension(R.dimen.max_db_image_height)); + boolean needsScale = scaleTo > dim; + if(needsScale) { + rawImage = MainActivity.convertDrawableToByteArray(MainActivity.convertByteArrayToDrawable(rawImage, dim)); + } Endangered e = items.get(imagePosition); e.setImage(rawImage); items.set(imagePosition, e); - currentHolder.image.setImageDrawable(imageDraw); + currentHolder.image.setImageDrawable(MainActivity.convertByteArrayToDrawable(rawImage, maxHeight)); currentHolder.image.setVisibility(View.VISIBLE); currentHolder.addImage.setVisibility(View.GONE); } @@ -82,6 +96,7 @@ } else { holder = (ViewHolder) convertView.getTag(); } + if(maxHeight == -1) maxHeight = holder.image.getMaxHeight(); holder.title.setText(getItem(position).getName()); holder.addImage.setOnClickListener(new View.OnClickListener() { @Override @@ -111,7 +126,7 @@ }); byte[] b = items.get(position).getImage(); if(b == null) holder.image.setImageDrawable(null); - else holder.image.setImageDrawable(new BitmapDrawable(context.getResources(), BitmapFactory.decodeByteArray(b, 0, b.length))); + else holder.image.setImageDrawable(MainActivity.convertByteArrayToDrawable(b, maxHeight)); return convertView; } diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/adapters/ShowEndangeredListAdapter.java b/app/src/main/java/de/apps4ics/mountainnavigation/adapters/ShowEndangeredListAdapter.java index 33431b6..1173e5e 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/adapters/ShowEndangeredListAdapter.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/adapters/ShowEndangeredListAdapter.java @@ -25,9 +25,6 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,6 +34,7 @@ import java.util.List; +import de.apps4ics.mountainnavigation.MainActivity; import de.apps4ics.mountainnavigation.R; import de.apps4ics.mountainnavigation.pois.Endangered; @@ -60,15 +58,17 @@ } else { holder = (ViewHolder) convertView.getTag(); } + if(maxHeight == -1) maxHeight = holder.image.getMaxHeight(); holder.title.setText(items.get(position).getName()); holder.addImage.setVisibility(View.GONE); + holder.image.setVisibility(View.VISIBLE); holder.image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LayoutInflater inflater1 = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater1.inflate(R.layout.fullscreen_image, null, false); ImageView iv = (ImageView) layout.findViewById(R.id.fullscreenImageView); - iv.setImageDrawable(holder.image.getDrawable()); + iv.setImageDrawable(MainActivity.convertByteArrayToDrawable(items.get(position).getImage(), layout.getWidth())); final AlertDialog imageDisplay = new AlertDialog.Builder(context) .setView(layout) .setPositiveButton("Back", new DialogInterface.OnClickListener() { @@ -94,8 +94,7 @@ }); byte[] b = getItem(position).getImage(); - Drawable drawable = new BitmapDrawable(BitmapFactory.decodeByteArray(b, 0, b.length)); - holder.image.setImageDrawable(drawable); + holder.image.setImageDrawable(MainActivity.convertByteArrayToDrawable(b, maxHeight)); return convertView; } diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBiotaDialog.java b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBiotaDialog.java index a3a73b3..9cad93c 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBiotaDialog.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/pois/AddBiotaDialog.java @@ -85,12 +85,8 @@ Location l = MainActivity.getLocation(); GeoPoint gp = new GeoPoint(l.getLatitude(), l.getLongitude(), l.getAltitude()); poiHandler.addGp(new DbGeoPoint(gp, System.currentTimeMillis()/1000, biota.getId(), biota.getType())); - List items = new ArrayList<>(); for(int i=0; i16dp 16dp 24dp + 1500px + 1500px