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 61a02884..23a1f6b1 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 @@ -4,17 +4,12 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.ResolveInfo; -import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; -import android.provider.OpenableColumns; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.support.v7.content.res.AppCompatResources; import android.support.v7.preference.PreferenceManager; @@ -37,17 +32,12 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import java.util.List; import java.util.Locale; import gr.thmmy.mthmmy.R; @@ -73,12 +63,15 @@ public class UploadActivity extends BaseActivity { */ public static final String BUNDLE_UPLOAD_CATEGORY = "UPLOAD_CATEGORY"; private static final String uploadIndexUrl = "https://www.thmmy.gr/smf/index.php?action=tpmod;dl=upload"; - private static final String uploadedFrommThmmyPromptHtml = "
uploaded from mTHMMY"; - private static final int REQUEST_CODE_CHOOSE_FILE = 8; - private static final int REQUEST_CODE_CAMERA = 4; - private static final int REQUEST_CODE_FIELDS_BUILDER = 74; + private static final String uploadedFromThmmyPromptHtml = "
uploaded from mTHMMY"; + /** + * Request codes used in activities for result (AFR) calls + */ + private static final int AFR_REQUEST_CODE_CHOOSE_FILE = 8; + private static final int AFR_REQUEST_CODE_CAMERA = 4; + private static final int AFR_REQUEST_CODE_FIELDS_BUILDER = 74; - private static ArrayList uploadRootCategories = new ArrayList<>(); + private ArrayList uploadRootCategories = new ArrayList<>(); private ParseUploadPageTask parseUploadPageTask; private ArrayList bundleCategory; private String categorySelected = "-1"; @@ -95,7 +88,6 @@ public class UploadActivity extends BaseActivity { private EditText uploadDescription; private AppCompatButton titleDescriptionBuilderButton; private AppCompatButton selectFileButton; - //private static AppCompatButton titleDescriptionBuilderButton; @Override protected void onCreate(Bundle savedInstanceState) { @@ -141,7 +133,7 @@ public class UploadActivity extends BaseActivity { titleDescriptionBuilderButton = findViewById(R.id.upload_title_description_builder); titleDescriptionBuilderButton.setOnClickListener(view -> { if (categorySelected.equals("-1")) { - Toast.makeText(view.getContext(), "Please choose category first", Toast.LENGTH_SHORT).show(); + Toast.makeText(view.getContext(), "Please choose a category first", Toast.LENGTH_SHORT).show(); return; } @@ -186,15 +178,15 @@ public class UploadActivity extends BaseActivity { } //Fixes course and semester - maybeCourse = maybeCourse.replaceAll("-", "").replace("(ΝΠΣ)", "").trim(); - maybeSemester = maybeSemester.replaceAll("-", "").trim().substring(0, 1); + String course = maybeCourse.replaceAll("-", "").replace("(ΝΠΣ)", "").trim(); + String semester = maybeSemester.replaceAll("-", "").trim().substring(0, 1); Intent intent = new Intent(UploadActivity.this, UploadFieldsBuilderActivity.class); Bundle builderExtras = new Bundle(); - builderExtras.putString(BUNDLE_UPLOAD_FIELD_BUILDER_COURSE, maybeCourse); - builderExtras.putString(BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER, maybeSemester); + builderExtras.putString(BUNDLE_UPLOAD_FIELD_BUILDER_COURSE, course); + builderExtras.putString(BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER, semester); intent.putExtras(builderExtras); - startActivityForResult(intent, REQUEST_CODE_FIELDS_BUILDER); + startActivityForResult(intent, AFR_REQUEST_CODE_FIELDS_BUILDER); }); titleDescriptionBuilderButton.setEnabled(false); @@ -211,21 +203,11 @@ public class UploadActivity extends BaseActivity { builder.setTitle("Upload file"); builder.setItems(options, (dialog, item) -> { if (options[item].equals("Take photo")) { - /*Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - startActivityForResult(intent, REQUEST_CODE_CAMERA);*/ - Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePhotoIntent.putExtra("return-data", true); - takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(UploadsHelper.getTempFile(this))); - - Intent targetedIntent = new Intent(takePhotoIntent); - List resInfo = this.getPackageManager().queryIntentActivities(takePhotoIntent, 0); - for (ResolveInfo resolveInfo : resInfo) { - String packageName = resolveInfo.activityInfo.packageName; - targetedIntent.setPackage(packageName); - } - startActivityForResult(takePhotoIntent, REQUEST_CODE_CAMERA); + takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(UploadsHelper.getCacheFile(this))); + startActivityForResult(takePhotoIntent, AFR_REQUEST_CODE_CAMERA); } else if (options[item].equals("Choose file")) { String[] mimeTypes = {"image/jpeg", "text/html", "image/png", "image/jpg", "image/gif", "application/pdf", "application/rar", "application/x-tar", "application/zip", @@ -236,7 +218,7 @@ public class UploadActivity extends BaseActivity { .setType("image/jpeg") .putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); - startActivityForResult(intent, REQUEST_CODE_CHOOSE_FILE); + startActivityForResult(intent, AFR_REQUEST_CODE_CHOOSE_FILE); } else if (options[item].equals("Cancel")) { dialog.dismiss(); } @@ -245,6 +227,8 @@ public class UploadActivity extends BaseActivity { }); findViewById(R.id.upload_upload_button).setOnClickListener(view -> { + progressBar.setVisibility(View.VISIBLE); + String uploadTitleText = uploadTitle.getText().toString(); String uploadDescriptionText = uploadDescription.getText().toString(); @@ -262,15 +246,14 @@ public class UploadActivity extends BaseActivity { return; } - String tmpDescriptionText = uploadDescriptionText; - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(view.getContext()); if (sharedPrefs.getBoolean(UPLOADING_APP_SIGNATURE_ENABLE_KEY, true)) { - tmpDescriptionText += uploadedFrommThmmyPromptHtml; + uploadDescriptionText += uploadedFromThmmyPromptHtml; } String tempFilePath = null; if (uploadFilename != null) { + //File should be uploaded with a certain name. Temporarily copies the file and renames it tempFilePath = UploadsHelper.createTempFile(this, fileUri, uploadFilename); if (tempFilePath == null) { //Something went wrong, abort @@ -279,12 +262,11 @@ public class UploadActivity extends BaseActivity { } try { - final String finalTempFilePath = tempFilePath; new MultipartUploadRequest(view.getContext(), uploadIndexUrl) .setUtf8Charset() .addParameter("tp-dluploadtitle", uploadTitleText) .addParameter("tp-dluploadcat", categorySelected) - .addParameter("tp-dluploadtext", tmpDescriptionText) + .addParameter("tp-dluploadtext", uploadDescriptionText) .addFileToUpload(tempFilePath == null ? fileUri.toString() : tempFilePath @@ -302,29 +284,21 @@ public class UploadActivity extends BaseActivity { public void onError(Context context, UploadInfo uploadInfo, ServerResponse serverResponse, Exception exception) { Toast.makeText(context, "Upload failed", Toast.LENGTH_SHORT).show(); - if (finalTempFilePath != null) { - if (!UploadsHelper.deleteTempFile(finalTempFilePath)) { - Toast.makeText(context, "Failed to delete temporary file", Toast.LENGTH_SHORT).show(); - } - } + UploadsHelper.deleteTempFiles(); + progressBar.setVisibility(View.GONE); } @Override public void onCompleted(Context context, UploadInfo uploadInfo, ServerResponse serverResponse) { - if (finalTempFilePath != null) { - if (!UploadsHelper.deleteTempFile(finalTempFilePath)) { - Toast.makeText(context, "Failed to delete temporary file", Toast.LENGTH_SHORT).show(); - } - } + Toast.makeText(context, "Upload completed successfully", Toast.LENGTH_SHORT).show(); + UploadsHelper.deleteTempFiles(); + progressBar.setVisibility(View.GONE); } @Override public void onCancelled(Context context, UploadInfo uploadInfo) { - if (finalTempFilePath != null) { - if (!UploadsHelper.deleteTempFile(finalTempFilePath)) { - Toast.makeText(context, "Failed to delete temporary file", Toast.LENGTH_SHORT).show(); - } - } + UploadsHelper.deleteTempFiles(); + progressBar.setVisibility(View.GONE); } }) .startUpload(); @@ -334,36 +308,12 @@ public class UploadActivity extends BaseActivity { }); if (uploadRootCategories.isEmpty()) { + //Parses the uploads page parseUploadPageTask = new ParseUploadPageTask(); parseUploadPageTask.execute(uploadIndexUrl); } else { - String[] tmpSpinnerArray = new String[uploadRootCategories.size()]; - for (int i = 0; i < uploadRootCategories.size(); ++i) { - tmpSpinnerArray[i] = uploadRootCategories.get(i).getCategoryTitle(); - } - - ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(BaseApplication.getInstance().getApplicationContext(), - android.R.layout.simple_spinner_dropdown_item, tmpSpinnerArray); - spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - rootCategorySpinner.setAdapter(spinnerArrayAdapter); - - //Sets bundle selection - if (bundleCategory != null) { - int bundleSelectionIndex = -1, currentIndex = 0; - for (UploadCategory category : uploadRootCategories) { - if (bundleCategory.get(0).contains(category.getCategoryTitle())) { - bundleSelectionIndex = currentIndex; - break; - } - ++currentIndex; - } - - if (bundleSelectionIndex != -1) { - rootCategorySpinner.setSelection(bundleSelectionIndex, true); - bundleCategory.remove(0); - } - } - + //Renders the already parsed data + updateUIElements(); titleDescriptionBuilderButton.setEnabled(true); } } @@ -392,8 +342,8 @@ public class UploadActivity extends BaseActivity { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_CODE_CHOOSE_FILE && data != null) { - if (resultCode == Activity.RESULT_CANCELED) { + if (requestCode == AFR_REQUEST_CODE_CHOOSE_FILE) { + if (resultCode == Activity.RESULT_CANCELED || data == null) { return; } @@ -422,38 +372,39 @@ public class UploadActivity extends BaseActivity { fileIcon = "blank.gif"; } } - } else if (requestCode == REQUEST_CODE_CAMERA) { + } else if (requestCode == AFR_REQUEST_CODE_CAMERA) { if (resultCode == Activity.RESULT_CANCELED) { return; } Bitmap bitmap; - File cacheImageFile = UploadsHelper.getTempFile(this); - if (resultCode == Activity.RESULT_OK) { - fileUri = Uri.fromFile(cacheImageFile); - fileIcon = "jpg_image.gif"; - - bitmap = UploadsHelper.getImageResized(this, fileUri); - int rotation = UploadsHelper.getRotation(this, fileUri); - bitmap = UploadsHelper.rotate(bitmap, rotation); - - try { - FileOutputStream out = new FileOutputStream(cacheImageFile); - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); - out.flush(); - out.close(); - } catch (Exception e) { - e.printStackTrace(); - } + File cacheImageFile = UploadsHelper.getCacheFile(this); - String newFilename = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.FRANCE). - format(new Date()); - fileUri = Uri.parse(UploadsHelper.createTempFile(this, fileUri, newFilename)); + Uri cacheFileUri = Uri.fromFile(cacheImageFile); + fileIcon = "jpg_image.gif"; - newFilename += ".jpg"; - selectFileButton.setText(newFilename); + bitmap = UploadsHelper.getImageResized(this, cacheFileUri); + int rotation = UploadsHelper.getRotation(this, cacheFileUri); + bitmap = UploadsHelper.rotate(bitmap, rotation); + + try { + FileOutputStream out = new FileOutputStream(cacheImageFile); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); } - } else if (requestCode == REQUEST_CODE_FIELDS_BUILDER) { + + String newFilename = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.FRANCE). + format(new Date()); + fileUri = Uri.parse(UploadsHelper.createTempFile(this, cacheFileUri, newFilename)); + + newFilename += ".jpg"; + selectFileButton.setText(newFilename); + + UploadsHelper.deleteCacheFiles(this); + } else if (requestCode == AFR_REQUEST_CODE_FIELDS_BUILDER) { if (resultCode == Activity.RESULT_CANCELED) { return; } @@ -578,7 +529,7 @@ public class UploadActivity extends BaseActivity { UploadCategory secondLevelCategory = firstLevelCategory.getSubCategories().get(firstLevelCategory.getSubCategories().size() - 1); secondLevelCategory.addSubCategory(categoryValue, categoryText); } else if (categoryText.startsWith("---- ")) { - //This is a level three subcategory + //This is a level four subcategory UploadCategory rootLevelCategory = uploadRootCategories.get(uploadRootCategories.size() - 1); UploadCategory firstLevelCategory = rootLevelCategory.getSubCategories().get(rootLevelCategory.getSubCategories().size() - 1); UploadCategory secondLevelCategory = firstLevelCategory.getSubCategories().get(firstLevelCategory.getSubCategories().size() - 1); @@ -593,36 +544,39 @@ public class UploadActivity extends BaseActivity { @Override protected void postExecution(ResultCode result) { - String[] tmpSpinnerArray = new String[uploadRootCategories.size()]; - for (int i = 0; i < uploadRootCategories.size(); ++i) { - tmpSpinnerArray[i] = uploadRootCategories.get(i).getCategoryTitle(); - } + updateUIElements(); + titleDescriptionBuilderButton.setEnabled(true); + progressBar.setVisibility(ProgressBar.GONE); + } + } - ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(BaseApplication.getInstance().getApplicationContext(), - android.R.layout.simple_spinner_dropdown_item, tmpSpinnerArray); - spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - rootCategorySpinner.setAdapter(spinnerArrayAdapter); + private void updateUIElements() { + String[] tmpSpinnerArray = new String[uploadRootCategories.size()]; + for (int i = 0; i < uploadRootCategories.size(); ++i) { + tmpSpinnerArray[i] = uploadRootCategories.get(i).getCategoryTitle(); + } - //Sets bundle selection - if (bundleCategory != null) { - int bundleSelectionIndex = -1, currentIndex = 0; + ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(BaseApplication.getInstance().getApplicationContext(), + android.R.layout.simple_spinner_dropdown_item, tmpSpinnerArray); + spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + rootCategorySpinner.setAdapter(spinnerArrayAdapter); - for (UploadCategory category : uploadRootCategories) { - if (bundleCategory.get(0).contains(category.getCategoryTitle())) { - bundleSelectionIndex = currentIndex; - break; - } - ++currentIndex; - } + //Sets bundle selection + if (bundleCategory != null) { + int bundleSelectionIndex = -1, currentIndex = 0; - if (bundleSelectionIndex != -1) { - rootCategorySpinner.setSelection(bundleSelectionIndex, true); - bundleCategory.remove(0); + for (UploadCategory category : uploadRootCategories) { + if (bundleCategory.get(0).contains(category.getCategoryTitle())) { + bundleSelectionIndex = currentIndex; + break; } + ++currentIndex; } - titleDescriptionBuilderButton.setEnabled(true); - progressBar.setVisibility(ProgressBar.GONE); + if (bundleSelectionIndex != -1) { + rootCategorySpinner.setSelection(bundleSelectionIndex, true); + bundleCategory.remove(0); + } } } } \ No newline at end of file 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 9a2be209..9529d402 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 @@ -8,6 +8,7 @@ import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.ExifInterface; import android.net.Uri; +import android.os.Environment; import android.provider.OpenableColumns; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -25,7 +26,7 @@ import timber.log.Timber; class UploadsHelper { private static final int DEFAULT_MIN_WIDTH_QUALITY = 400; - private static final String TEMP_IMAGE_NAME = "tempUploadFile.jpg"; + private static final String CACHE_IMAGE_NAME = "tempUploadFile.jpg"; @NonNull static String filenameFromUri(Context context, Uri uri) { @@ -53,7 +54,7 @@ class UploadsHelper { static String createTempFile(Context context, Uri fileUri, String newFilename) { String oldFilename = filenameFromUri(context, fileUri); String fileExtension = oldFilename.substring(oldFilename.indexOf(".")); - String destinationFilename = android.os.Environment.getExternalStorageDirectory().getPath() + + String destinationFilename = Environment.getExternalStorageDirectory().getPath() + File.separatorChar + "~tmp_mThmmy_uploads" + File.separatorChar + newFilename + fileExtension; File tempDirectory = new File(android.os.Environment.getExternalStorageDirectory().getPath() + @@ -99,16 +100,35 @@ class UploadsHelper { return destinationFilename; } - static File getTempFile(Context context) { - File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME); + static File getCacheFile(Context context) { + File imageFile = new File(context.getExternalCacheDir(), CACHE_IMAGE_NAME); //noinspection ResultOfMethodCallIgnored imageFile.getParentFile().mkdirs(); return imageFile; } - static boolean deleteTempFile(String destinationFilename) { - File file = new File(destinationFilename); - return file.delete(); + @SuppressWarnings("ResultOfMethodCallIgnored") + static void deleteTempFiles() { + File tempFilesDirectory = new File(Environment.getExternalStorageDirectory().getPath() + + File.separatorChar + "~tmp_mThmmy_uploads"); + + if (tempFilesDirectory.isDirectory()) { + String[] tempFilesArray = tempFilesDirectory.list(); + for (String tempFile : tempFilesArray) { + new File(tempFilesDirectory, tempFile).delete(); + } + tempFilesDirectory.delete(); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + static void deleteCacheFiles(Context context) { + File cacheFilesDirectory = context.getExternalCacheDir(); + assert cacheFilesDirectory != null; + String[] tempFilesArray = cacheFilesDirectory.list(); + for (String tempFile : tempFilesArray) { + new File(cacheFilesDirectory, tempFile).delete(); + } } /**