From af0a5a03a5163fea5e64fe0d575325160d4126fd Mon Sep 17 00:00:00 2001 From: Schoumi Date: Wed, 9 Nov 2016 02:09:54 +0100 Subject: [PATCH] Better handle of big picture (thumb,send,display,...) Fixe #11, #7 --- app/build.gradle | 10 +- .../java/fr/mobdev/goblim/NetworkManager.java | 93 ++++++++----- .../mobdev/goblim/activity/LinkActivity.java | 5 +- .../goblim/activity/UploadActivity.java | 128 ++++++++---------- app/src/main/res/layout-land/upload.xml | 10 +- app/src/main/res/layout/upload.xml | 9 ++ build.gradle | 2 +- 7 files changed, 145 insertions(+), 112 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d8dba10..aeea146 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion "24.0.1" + compileSdkVersion 25 + buildToolsVersion "24.0.3" defaultConfig { applicationId "fr.mobdev.goblim" minSdkVersion 15 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 4 versionName "2.1" } @@ -22,6 +22,6 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:24.2.0' - compile 'com.android.support:design:24.2.0' + compile 'com.android.support:appcompat-v7:25.0.0' + compile 'com.android.support:design:25.0.0' } diff --git a/app/src/main/java/fr/mobdev/goblim/NetworkManager.java b/app/src/main/java/fr/mobdev/goblim/NetworkManager.java index e2f7f55..1f50450 100644 --- a/app/src/main/java/fr/mobdev/goblim/NetworkManager.java +++ b/app/src/main/java/fr/mobdev/goblim/NetworkManager.java @@ -32,10 +32,12 @@ import org.json.JSONException; import org.json.JSONObject; import android.content.Context; +import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; -import android.util.Base64; +import android.net.Uri; +import android.provider.OpenableColumns; import fr.mobdev.goblim.listener.NetworkListener; import fr.mobdev.goblim.objects.Img; @@ -44,17 +46,15 @@ public class NetworkManager { private NetworkListener listener; private static NetworkManager instance; - private Context context; - private NetworkManager(NetworkListener listener,Context context) + private NetworkManager(NetworkListener listener) { this.listener = listener; - this.context = context; } - public static NetworkManager getInstance(NetworkListener listener, Context context){ + public static NetworkManager getInstance(NetworkListener listener) { if (instance == null) - instance = new NetworkManager(listener,context); + instance = new NetworkManager(listener); if(listener != null && listener != instance.getListener()) instance.setListener(listener); return instance; @@ -70,7 +70,7 @@ public class NetworkManager { this.listener = listener; } - public void upload(final String siteUrl, final int nbDays, final String fileName, final byte[] bytearray) + public void upload(final Context context, final String siteUrl, final int nbDays, final Uri imageUri) { if(!isConnectedToInternet(context)) { listener.fileUploadError(context.getString(R.string.no_network)); @@ -80,14 +80,14 @@ public class NetworkManager { @Override public void run() { - Img img = uploadImage(siteUrl,nbDays, fileName,bytearray); + Img img = uploadImage(context, siteUrl, nbDays,imageUri); if(img != null) listener.fileUploaded(img); } }).start(); } - public Img uploadImage(String siteUrl, int nbDays, String fileName, byte[] byteArray) { + private Img uploadImage(Context context, String siteUrl, int nbDays, Uri imageUri) { URL url = null; Img imgOutput = null; @@ -97,7 +97,7 @@ public class NetworkManager { e1.printStackTrace(); } - HttpURLConnection conn; + HttpURLConnection conn = null; InputStream stream = null; DataOutputStream request = null; try { @@ -148,6 +148,15 @@ public class NetworkManager { duration += crlf; duration += nbDays + crlf; request_size += duration.length(); + String[] proj = {OpenableColumns.DISPLAY_NAME,OpenableColumns.SIZE}; + Cursor cursor = context.getContentResolver().query(imageUri,proj,null,null,null); + String fileName = null; + long size = 0; + if(cursor != null && cursor.moveToFirst()) { + fileName = cursor.getString(0); + size = cursor.getLong(1); + cursor.close(); + } //setup filename and say that octets follow String outputInformations = hyphens + boundary + crlf; @@ -156,7 +165,7 @@ public class NetworkManager { outputInformations += crlf; request_size += outputInformations.length(); - request_size += byteArray.length; + request_size += size; //finish the format http post packet String endHttp = crlf; @@ -171,26 +180,48 @@ public class NetworkManager { request.writeBytes(duration); request.writeBytes(outputInformations); request.flush(); - //write in loop - int byteWriten = 0; - int blockSize = byteArray.length / 100; - while(byteWriten < byteArray.length) { - if(byteArray.length - byteWriten < blockSize) - blockSize = byteArray.length - byteWriten; - request.write(byteArray,byteWriten,blockSize); - byteWriten+=blockSize; - listener.uploadProgress(byteWriten,byteArray.length); + InputStream streamIn = null; + try{ + streamIn = context.getContentResolver().openInputStream(imageUri); + } + catch (Exception e) + { + e.printStackTrace(); + } + //read data from the file and write it + if(streamIn != null) { + int readed = 0; + int byteWriten = 0; + int blockSize = 1024; + byte[] buffer = new byte[blockSize]; + while(readed != -1) { + try { + readed = streamIn.read(buffer); + if(readed != -1) { + request.write(buffer, 0, readed); + byteWriten+=readed; + listener.uploadProgress(byteWriten,(int)size); + } + } catch (IOException e) { + e.printStackTrace(); + readed = -1; + } + } } request.writeBytes(endHttp); request.flush(); - //get answer stream = conn.getInputStream(); } } catch (IOException e1) { - e1.printStackTrace(); - listener.fileUploadError(context.getString(R.string.network_error)); + if(conn != null) { + stream = conn.getErrorStream(); + } + else { + e1.printStackTrace(); + listener.fileUploadError(context.getString(R.string.network_error)); + } } if(stream != null) { @@ -213,10 +244,10 @@ public class NetworkManager { isReading = false; } } while (isReading); - //parse JSON answer try { - request.close(); + if(request != null) + request.close(); stream.close(); } catch (IOException e) { e.printStackTrace(); @@ -225,15 +256,15 @@ public class NetworkManager { // Parse the JSON to a JSONObject JSONObject rootObject = new JSONObject(jsonStr); // Get msg (root) element - JSONObject msg = rootObject.getJSONObject("msg"); + String msgStr = rootObject.getString("msg"); // is there an error? - if(msg.has("msg")) { - String error = msg.getString("msg"); - listener.fileUploadError(error); + if(!msgStr.contains("{")) { + listener.fileUploadError(msgStr); return null; } - else if(msg.has("short")) { + else if(rootObject.has("msg")){ //retrieve useful data + JSONObject msg = rootObject.getJSONObject("msg"); String hashOutput = msg.getString("short"); String realHashOutput = msg.getString("real_short"); String token = msg.getString("token"); @@ -247,7 +278,7 @@ public class NetworkManager { return imgOutput; } - public void deleteImage(final String deleteUrl) { + public void deleteImage(final Context context, final String deleteUrl) { new Thread(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/fr/mobdev/goblim/activity/LinkActivity.java b/app/src/main/java/fr/mobdev/goblim/activity/LinkActivity.java index 3d08885..e8ba0ce 100644 --- a/app/src/main/java/fr/mobdev/goblim/activity/LinkActivity.java +++ b/app/src/main/java/fr/mobdev/goblim/activity/LinkActivity.java @@ -21,7 +21,6 @@ package fr.mobdev.goblim.activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -45,7 +44,7 @@ import fr.mobdev.goblim.objects.Img; /* * Activity display the link of the uploaded picture and allow user to share it with other app - * or copy it to cleapboard + * or copy it to clipboard */ public class LinkActivity extends AppCompatActivity { @@ -146,7 +145,7 @@ public class LinkActivity extends AppCompatActivity { long days = millis / (24*60*60*1000); //storage duration has ended or not? if(storageDuration == 0 || storageDuration - days >= 0) - NetworkManager.getInstance(listener, getApplicationContext()).deleteImage(deleteUrl); + NetworkManager.getInstance(listener).deleteImage(LinkActivity.this, deleteUrl); else { //image is no more on the server, delete is only local now listener.deleteSucceed(); diff --git a/app/src/main/java/fr/mobdev/goblim/activity/UploadActivity.java b/app/src/main/java/fr/mobdev/goblim/activity/UploadActivity.java index d471236..1fbc18e 100644 --- a/app/src/main/java/fr/mobdev/goblim/activity/UploadActivity.java +++ b/app/src/main/java/fr/mobdev/goblim/activity/UploadActivity.java @@ -19,16 +19,15 @@ package fr.mobdev.goblim.activity; import android.app.ProgressDialog; -import android.content.ContentResolver; import android.content.Intent; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; +import android.graphics.BitmapFactory; import android.net.Uri; -import android.provider.MediaStore; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.DisplayMetrics; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -36,12 +35,12 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.Toast; import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -74,8 +73,6 @@ public class UploadActivity extends AppCompatActivity { private static final int THIRTY = 30; private static final int YEAR = 365; - private static final int THUMB_MAX_SIDE = 800; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -104,16 +101,24 @@ public class UploadActivity extends AppCompatActivity { resetImage(); } }); - + ProgressBar thumbProgress = (ProgressBar) findViewById(R.id.progress_thumb); + thumbProgress.setVisibility(View.GONE); //retrieve previous state if it exist if(savedInstanceState != null) { int selectedServer = savedInstanceState.getInt("selectedServer"); imageUri = savedInstanceState.getParcelable("imageURI"); + bt = savedInstanceState.getParcelable("thumb"); + if(bt != null) { + ImageView th = (ImageView) findViewById(R.id.thumbnail_main); + th.setImageBitmap(bt); + } else { + displayImage(); + } + if (selectedServer < urls.size()) { Spinner servers = (Spinner) findViewById(R.id.servers_spinner); servers.setSelection(selectedServer); } - displayImage(); } //prepare the listener that handle upload result @@ -222,6 +227,7 @@ public class UploadActivity extends AppCompatActivity { Spinner selectedServer = (Spinner) findViewById(R.id.servers_spinner); int pos = selectedServer.getSelectedItemPosition(); savedInstanceState.putInt("selectedServer", pos); + savedInstanceState.putParcelable("thumb",bt); super.onSaveInstanceState(savedInstanceState); } @@ -250,16 +256,28 @@ public class UploadActivity extends AppCompatActivity { private void displayImage() { if(imageUri != null) { - ContentResolver contentResolver = getContentResolver(); //display it in the imageView - try { - bt = MediaStore.Images.Media.getBitmap(contentResolver, imageUri); - bt = generateThumb(bt); - ImageView view = (ImageView) findViewById(R.id.thumbnail_main); - view.setImageBitmap(bt); - } catch (IOException e) { - e.printStackTrace(); - } + final ProgressBar thumbProgress = (ProgressBar) findViewById(R.id.progress_thumb); + thumbProgress.setVisibility(View.VISIBLE); + final ImageView view = (ImageView) findViewById(R.id.thumbnail_main); + view.setVisibility(View.GONE); + final Button send = (Button) findViewById(R.id.upload_button); + send.setEnabled(false); + new Thread(new Runnable() { + @Override + public void run() { + bt = generateThumb(imageUri); + runOnUiThread(new Runnable() { + @Override + public void run() { + view.setVisibility(View.VISIBLE); + view.setImageBitmap(bt); + thumbProgress.setVisibility(View.GONE); + send.setEnabled(true); + } + }); + } + }).start(); } } @@ -284,56 +302,25 @@ public class UploadActivity extends AppCompatActivity { int delete = deletedDays.get(pos); //read image as bytes to upload it - byte[] bytearray = null; - //create a fileStream from the file path - InputStream stream = null; - try{ - stream = getContentResolver().openInputStream(imageUri); - } - catch (Exception e) - { - e.printStackTrace(); - } - //read data from the file and store it in a byte array - if(stream != null) { - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - int readed = 0; - byte[] buffer = new byte[1024]; - while(readed != -1) { - try { - readed = stream.read(buffer); - if(readed != -1) - outStream.write(buffer,0,readed); - } catch (IOException e) { - e.printStackTrace(); - readed = -1; - } - } - bytearray = outStream.toByteArray(); - } //upload image and display a progress bar - if(bytearray != null && bytearray.length > 0) { - runOnUiThread(new Runnable() { + runOnUiThread(new Runnable() { @Override public void run() { - progressDialog = new ProgressDialog(UploadActivity.this); - progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - progressDialog.setMax(100); - progressDialog.setMessage(getString(R.string.upload_progress)); - progressDialog.setCancelable(false); - progressDialog.show(); - } + progressDialog = new ProgressDialog(UploadActivity.this); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setMax(100); + progressDialog.setMessage(getString(R.string.upload_progress)); + progressDialog.setCancelable(false); + progressDialog.show(); + } }); - NetworkManager.getInstance(listener, getApplicationContext()).upload(url, delete, null, bytearray); - } - else { - listener.fileUploadError(getString(R.string.empty_file)); - } + NetworkManager.getInstance(listener).upload(this,url, delete, imageUri); } private void resetImage(){ imageUri = null; + bt = null; ImageView view = (ImageView) findViewById(R.id.thumbnail_main); view.setImageBitmap(null); ImageButton resetButton = (ImageButton) findViewById(R.id.reset_button); @@ -352,20 +339,19 @@ public class UploadActivity extends AppCompatActivity { } - private Bitmap generateThumb(Bitmap original){ + private Bitmap generateThumb(Uri imageUri){ - int ratio = 1; - if(original.getWidth()>THUMB_MAX_SIDE || original.getHeight() > THUMB_MAX_SIDE){ - if(original.getWidth()>original.getHeight()) - ratio = original.getWidth()/THUMB_MAX_SIDE; - else - ratio = original.getHeight()/THUMB_MAX_SIDE; + Bitmap thumb = null; + try { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inScaled = true; + opts.inDensity = 640; + opts.inTargetDensity = DisplayMetrics.DENSITY_MEDIUM; + thumb = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri),null,opts); + System.out.println("thumb "+thumb.getWidth()+"x"+thumb.getHeight()); + } catch (FileNotFoundException e) { + e.printStackTrace(); } - - int newWidth = original.getWidth()/ratio; - int newHeight = original.getHeight()/ratio; - - Bitmap thumb = Bitmap.createScaledBitmap(original,newWidth,newHeight,false); return thumb; } diff --git a/app/src/main/res/layout-land/upload.xml b/app/src/main/res/layout-land/upload.xml index 2a50c2b..0f08c38 100644 --- a/app/src/main/res/layout-land/upload.xml +++ b/app/src/main/res/layout-land/upload.xml @@ -88,7 +88,15 @@ /> - + +