From 7a525fb81eb5a5fa5efba89f6fe4777e6c148428 Mon Sep 17 00:00:00 2001 From: Apostolof Date: Fri, 7 Sep 2018 15:33:54 +0300 Subject: [PATCH] Create global upload receiver, Add upload progress dialog --- app/src/main/AndroidManifest.xml | 9 ++ .../activities/upload/UploadActivity.java | 140 ++++++++++++------ .../activities/upload/UploadsHelper.java | 4 +- .../gr/thmmy/mthmmy/base/BaseActivity.java | 8 +- .../mthmmy/services/UploadsReceiver.java | 75 ++++++++++ .../res/layout/dialog_upload_progress.xml | 38 +++++ app/src/main/res/values/strings.xml | 3 + 7 files changed, 227 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/gr/thmmy/mthmmy/services/UploadsReceiver.java create mode 100644 app/src/main/res/layout/dialog_upload_progress.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cd4582c4..18afb39f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,6 +20,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java index a4e700a4..6ace69a1 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java @@ -35,10 +35,7 @@ import android.widget.TextView; import android.widget.Toast; import net.gotev.uploadservice.MultipartUploadRequest; -import net.gotev.uploadservice.ServerResponse; -import net.gotev.uploadservice.UploadInfo; import net.gotev.uploadservice.UploadNotificationConfig; -import net.gotev.uploadservice.UploadStatusDelegate; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -53,6 +50,7 @@ import gr.thmmy.mthmmy.base.BaseActivity; import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.model.UploadCategory; import gr.thmmy.mthmmy.model.UploadFile; +import gr.thmmy.mthmmy.services.UploadsReceiver; import gr.thmmy.mthmmy.utils.AppCompatSpinnerWithoutDefault; import gr.thmmy.mthmmy.utils.FileUtils; import gr.thmmy.mthmmy.utils.TakePhoto; @@ -89,6 +87,7 @@ public class UploadActivity extends BaseActivity { private static final int MAX_FILE_SIZE_SUPPORTED = 45000000; + private UploadsReceiver uploadsReceiver = new UploadsReceiver(); private ArrayList uploadRootCategories = new ArrayList<>(); private ParseUploadPageTask parseUploadPageTask; private ArrayList bundleCategory; @@ -111,6 +110,58 @@ public class UploadActivity extends BaseActivity { private EditText uploadDescription; private AppCompatButton titleDescriptionBuilderButton; private LinearLayout filesListView; + private AlertDialog uploadProgressDialog; + private MaterialProgressBar dialogProgressBar; + private TextView dialogProgressText; + + private UploadsReceiver.Delegate uploadDelegate = new UploadsReceiver.Delegate() { + @Override + public void onProgress(long uploadedBytes, long totalBytes, int progress, double uploadRate) { + if (uploadProgressDialog != null) { + dialogProgressBar.setProgress(progress); + dialogProgressText.setText(getResources().getString( + R.string.upload_progress_dialog_bytes_uploaded, (float) uploadRate, + (int) uploadedBytes / 1000, (int) totalBytes / 1000)); + + if (uploadedBytes == totalBytes) { + uploadProgressDialog.dismiss(); + } + } + } + + @Override + public void onError(Exception exception) { + Toast.makeText(getApplicationContext(), "Upload failed", Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); + + } + + @Override + public void onCompleted(int serverResponseCode, byte[] serverResponseBody) { + Toast.makeText(getApplicationContext(), "Upload completed successfully", Toast.LENGTH_SHORT).show(); + + uploadTitle.setText(null); + textWatcher.setFileExtension(""); + uploadFilename.setText(null); + hasModifiedFilename = false; + uploadDescription.setText(null); + filesList.clear(); + filesListView.removeAllViews(); + photoFileCreated = null; + progressBar.setVisibility(View.GONE); + + if (uploadProgressDialog != null) { + uploadProgressDialog.dismiss(); + } + + } + + @Override + public void onCancelled() { + Toast.makeText(getApplicationContext(), "Upload canceled", Toast.LENGTH_SHORT).show(); + progressBar.setVisibility(View.GONE); + } + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -148,6 +199,9 @@ public class UploadActivity extends BaseActivity { progressBar = findViewById(R.id.progressBar); + uploadsReceiver.setDelegate(uploadDelegate); + uploadsReceiver.provideStorage(storage); + findViewById(R.id.upload_outer_scrollview).setVerticalScrollBarEnabled(false); categoriesSpinners = findViewById(R.id.upload_spinners); rootCategorySpinner = findViewById(R.id.upload_spinner_category_root); @@ -325,6 +379,26 @@ public class UploadActivity extends BaseActivity { builder.setTitle("Upload to thmmy"); builder.setMessage("Are you sure?"); builder.setPositiveButton("YES, FIRE AWAY", (dialog, which) -> { + AlertDialog.Builder progressDialogBuilder = new AlertDialog.Builder(this); + LayoutInflater inflater = this.getLayoutInflater(); + LinearLayout progressDialogLayout = (LinearLayout) inflater.inflate(R.layout.dialog_upload_progress, null); + + dialogProgressBar = progressDialogLayout.findViewById(R.id.dialogProgressBar); + dialogProgressBar.setMax(100); + dialogProgressText = progressDialogLayout.findViewById(R.id.dialog_bytes_uploaded); + + progressDialogBuilder.setView(progressDialogLayout); + progressDialogBuilder.setNeutralButton("Resume on background", (progressDialog, progressWhich) -> { + uploadProgressDialog.dismiss(); + finish(); + }); + uploadProgressDialog = progressDialogBuilder.create(); + uploadProgressDialog.setCancelable(false); + + dialog.dismiss(); + uploadProgressDialog.show(); + + //Checks settings and possibly adds "Uploaded from mTHMMY" string to description SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(view.getContext()); if (sharedPrefs.getBoolean(UPLOADING_APP_SIGNATURE_ENABLE_KEY, true)) { @@ -375,9 +449,16 @@ public class UploadActivity extends BaseActivity { tempFileUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", zipFile); + dialogProgressText.setText(R.string.upload_progress_dialog_zipping_files); UploadsHelper.zip(this, filesListArray, tempFileUri); } + for (UploadFile file : filesList) { + if (file.isCameraPhoto()) { + TakePhoto.galleryAddPic(this, file.getPhotoFile()); + } + } + try { UploadNotificationConfig uploadNotificationConfig = new UploadNotificationConfig(); uploadNotificationConfig.setIconForAllStatuses(android.R.drawable.stat_sys_upload); @@ -401,55 +482,11 @@ public class UploadActivity extends BaseActivity { .addParameter("tp-uploaduser", uploaderProfileIndex) .setNotificationConfig(uploadNotificationConfig) .setMaxRetries(2) - .setDelegate(new UploadStatusDelegate() { - @Override - public void onProgress(Context context, UploadInfo uploadInfo) { - } - - @Override - public void onError(Context context, UploadInfo uploadInfo, ServerResponse serverResponse, - Exception exception) { - Toast.makeText(context, "Upload failed", Toast.LENGTH_SHORT).show(); - UploadsHelper.deleteTempFiles(storage); - progressBar.setVisibility(View.GONE); - } - - @Override - public void onCompleted(Context context, UploadInfo uploadInfo, ServerResponse serverResponse) { - Toast.makeText(context, "Upload completed successfully", Toast.LENGTH_SHORT).show(); - UploadsHelper.deleteTempFiles(storage); - BaseApplication.getInstance().logFirebaseAnalyticsEvent("file_upload", null); - - for (UploadFile file : filesList) { - if (file.isCameraPhoto()) { - TakePhoto.galleryAddPic(context, file.getPhotoFile()); - } - } - - uploadTitle.setText(null); - uploadFilename.setText(null); - hasModifiedFilename = false; - uploadDescription.setText(null); - filesList.clear(); - filesListView.removeAllViews(); - photoFileCreated = null; - progressBar.setVisibility(View.GONE); - } - - @Override - public void onCancelled(Context context, UploadInfo uploadInfo) { - Toast.makeText(context, "Upload canceled", Toast.LENGTH_SHORT).show(); - - UploadsHelper.deleteTempFiles(storage); - progressBar.setVisibility(View.GONE); - } - }) .startUpload(); } catch (Exception exception) { Timber.e(exception, "AndroidUploadService: %s", exception.getMessage()); progressBar.setVisibility(View.GONE); } - dialog.dismiss(); }); builder.setNegativeButton("NOPE", (dialog, which) -> { @@ -489,6 +526,15 @@ public class UploadActivity extends BaseActivity { protected void onResume() { drawer.setSelection(UPLOAD_ID); super.onResume(); + uploadsReceiver.setDelegate(uploadDelegate); + uploadsReceiver.provideStorage(storage); + uploadsReceiver.register(this); + } + + @Override + protected void onPause() { + super.onPause(); + uploadsReceiver.unregister(this); } @Override diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java index d7755dac..a19f926b 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadsHelper.java @@ -25,7 +25,7 @@ import java.util.zip.ZipOutputStream; import gr.thmmy.mthmmy.utils.FileUtils; import timber.log.Timber; -class UploadsHelper { +public class UploadsHelper { private final static int BUFFER = 4096; private static final String TEMP_FILES_DIRECTORY = "~tmp_mThmmy_uploads"; @@ -131,7 +131,7 @@ class UploadsHelper { } } - static void deleteTempFiles(Storage storage) { + public static void deleteTempFiles(Storage storage) { File tempFilesDirectory = new File(Environment.getExternalStorageDirectory().getPath() + File.separatorChar + TEMP_FILES_DIRECTORY); diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java index 96d2008c..f6f11188 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java @@ -78,6 +78,9 @@ public abstract class BaseActivity extends AppCompatActivity { //SessionManager protected static SessionManager sessionManager; + //Storage manager + protected Storage storage; + //Bookmarks private static final String BOOKMARKS_SHARED_PREFS = "bookmarksSharedPrefs"; private static final String BOOKMARKED_TOPICS_KEY = "bookmarkedTopicsKey"; @@ -91,7 +94,6 @@ public abstract class BaseActivity extends AppCompatActivity { //Common UI elements protected Toolbar toolbar; protected Drawer drawer; - protected Storage storage; private MainActivity mainActivity; @@ -140,6 +142,10 @@ public abstract class BaseActivity extends AppCompatActivity { return sessionManager; } + public Storage getStorage() { + return storage; + } + //TODO: move stuff below (?) //------------------------------------------DRAWER STUFF---------------------------------------- protected static final int HOME_ID = 0; diff --git a/app/src/main/java/gr/thmmy/mthmmy/services/UploadsReceiver.java b/app/src/main/java/gr/thmmy/mthmmy/services/UploadsReceiver.java new file mode 100644 index 00000000..ebf245cc --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/services/UploadsReceiver.java @@ -0,0 +1,75 @@ +package gr.thmmy.mthmmy.services; + +import android.content.Context; + +import com.snatik.storage.Storage; + +import net.gotev.uploadservice.ServerResponse; +import net.gotev.uploadservice.UploadInfo; +import net.gotev.uploadservice.UploadServiceBroadcastReceiver; + +import gr.thmmy.mthmmy.activities.upload.UploadsHelper; +import gr.thmmy.mthmmy.base.BaseApplication; + +public class UploadsReceiver extends UploadServiceBroadcastReceiver { + public interface Delegate { + void onProgress(long uploadedBytes, long totalBytes, int progress, double uploadRate); + + void onError(Exception exception); + + void onCompleted(int serverResponseCode, byte[] serverResponseBody); + + void onCancelled(); + } + + private Delegate delegate; + private Storage storage; + + public void setDelegate(Delegate delegate) { + this.delegate = delegate; + } + + public void provideStorage(Storage storage) { + this.storage = storage; + } + + @Override + public void onProgress(Context context, UploadInfo uploadInfo) { + if (delegate != null) { + delegate.onProgress(uploadInfo.getUploadedBytes(), uploadInfo.getTotalBytes(), + uploadInfo.getProgressPercent(), uploadInfo.getUploadRate()); + } + } + + @Override + public void onError(Context context, UploadInfo uploadInfo, ServerResponse serverResponse, + Exception exception) { + if (delegate != null) { + delegate.onError(exception); + } + if (storage != null){ + UploadsHelper.deleteTempFiles(storage); + } + } + + @Override + public void onCompleted(Context context, UploadInfo uploadInfo, ServerResponse serverResponse) { + if (delegate != null) { + delegate.onCompleted(serverResponse.getHttpCode(), serverResponse.getBody()); + } + if (storage != null){ + UploadsHelper.deleteTempFiles(storage); + } + BaseApplication.getInstance().logFirebaseAnalyticsEvent("file_upload", null); + } + + @Override + public void onCancelled(Context context, UploadInfo uploadInfo) { + if (delegate != null) { + delegate.onCancelled(); + } + if (storage != null){ + UploadsHelper.deleteTempFiles(storage); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_upload_progress.xml b/app/src/main/res/layout/dialog_upload_progress.xml new file mode 100644 index 00000000..ac800ce9 --- /dev/null +++ b/app/src/main/res/layout/dialog_upload_progress.xml @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 17d61e6d..a3a65219 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -124,6 +124,9 @@ Please follow the filename rules as\ndescribed in this topic.\n \nThis does not rename your local files. + Uploading your files + Zipping files. + Uploading at %1$.2f Kbit/s, %2$d/%3$d KBytes uploaded. Select type of upload