From 38eff704cd5b1f0181e35a90c11737ed3c28bf5c Mon Sep 17 00:00:00 2001
From: toto <>
Date: Tue, 8 Feb 2022 14:23:21 +0100
Subject: [PATCH] Partial Fix for Download with MediaStore
---
.../com/localtransfer/SettingsActivity.java | 14 ++++++-
.../main/java/com/localtransfer/Transfer.java | 5 ++-
.../fragment/DownloadFragment.java | 37 ++++++++++---------
app/src/main/res/values/ids.xml | 1 +
4 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/app/src/main/java/com/localtransfer/SettingsActivity.java b/app/src/main/java/com/localtransfer/SettingsActivity.java
index 43d97d6..93135bf 100644
--- a/app/src/main/java/com/localtransfer/SettingsActivity.java
+++ b/app/src/main/java/com/localtransfer/SettingsActivity.java
@@ -3,8 +3,10 @@ package com.localtransfer;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
+import android.provider.MediaStore;
import android.util.Log;
import android.view.MenuItem;
@@ -61,8 +63,16 @@ public class SettingsActivity extends AppCompatActivity {
case REQUEST_DIRECTORY_PICKER:
if (resultCode == Activity.RESULT_OK) {
String currentPath = data.getExtras().getString("data");
- if(currentPath.contains(Environment.getExternalStorageDirectory() + "/")) {
- String save_location = currentPath.replace(Environment.getExternalStorageDirectory() + "/", "");
+
+ Uri uri;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
+ uri = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
+ }
+ else {
+ uri = Uri.fromFile(Environment.getExternalStorageDirectory());
+ }
+ if(currentPath.contains(uri + "/")) {
+ String save_location = currentPath.replace(uri + "/", "");
Log.d("Path", save_location);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
prefs.edit().putString("local_storage", save_location).apply();
diff --git a/app/src/main/java/com/localtransfer/Transfer.java b/app/src/main/java/com/localtransfer/Transfer.java
index 6552791..be528d7 100644
--- a/app/src/main/java/com/localtransfer/Transfer.java
+++ b/app/src/main/java/com/localtransfer/Transfer.java
@@ -26,6 +26,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
@@ -288,7 +289,7 @@ public class Transfer {
return fileList;
}
- public void downloadFile(final File file, String name, long fileSize, String href, Button button) throws IOException {
+ public void downloadFile(final Uri uri, String name, long fileSize, String href, Button button) throws IOException {
/*final LinearLayout layout = activity.findViewById(id);
final Button button;
@@ -344,7 +345,7 @@ public class Transfer {
if (responseCode == HttpURLConnection.HTTP_OK) {
- FileOutputStream fileOutput = new FileOutputStream(file);
+ OutputStream fileOutput = activity.getContentResolver().openOutputStream(uri);
InputStream in = conn.getInputStream();
while ((bufferLength = in.read(buffer)) > 0) {
diff --git a/app/src/main/java/com/localtransfer/fragment/DownloadFragment.java b/app/src/main/java/com/localtransfer/fragment/DownloadFragment.java
index 54984ca..604f046 100644
--- a/app/src/main/java/com/localtransfer/fragment/DownloadFragment.java
+++ b/app/src/main/java/com/localtransfer/fragment/DownloadFragment.java
@@ -2,16 +2,16 @@ package com.localtransfer.fragment;
import android.animation.ObjectAnimator;
import android.content.ActivityNotFoundException;
+import android.content.ContentValues;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-
-import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.os.Environment;
+import android.provider.MediaStore;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -26,7 +26,6 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar;
-import com.localtransfer.BuildConfig;
import com.localtransfer.Progress;
import com.localtransfer.R;
import com.localtransfer.Transfer;
@@ -37,7 +36,6 @@ import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -231,6 +229,17 @@ public class DownloadFragment extends Fragment {
save_location = Environment.getExternalStorageDirectory() + "/" + Transfer.local_storage;
File file = new File(save_location, name);
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
+ values.put(MediaStore.MediaColumns.MIME_TYPE, mime);
+ values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
+
+ Uri uri;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
+ uri = getContext().getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
+ }
+ else
+ uri = null;
file_buttons.setId(View.generateViewId());
@@ -271,6 +280,7 @@ public class DownloadFragment extends Fragment {
file_buttons.setTag(R.id.ID_FILE_SIZE, size);
file_buttons.setTag(R.id.ID_FILE_HREF, href);
file_buttons.setTag(R.id.ID_FILE_MIME, mime);
+ file_buttons.setTag(R.id.ID_FILE_URI, uri);
file_buttons.setTag(R.id.ID_SAVE_LOCATION, save_location);
int state = file_buttons.getVisibility();
if(state == LinearLayout.GONE) {
@@ -300,15 +310,14 @@ public class DownloadFragment extends Fragment {
final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION));
final long fileSize = (long) layout.getTag(R.id.ID_FILE_SIZE);
final String href = (String) layout.getTag(R.id.ID_FILE_HREF);
-
- new File(save_location).mkdirs();
- File file = new File(save_location, name);
+ final String mime = (String) layout.getTag(R.id.ID_FILE_MIME);
+ final Uri uri = (Uri) layout.getTag(R.id.ID_FILE_URI);
Transfer tr = new Transfer();
new Thread(() -> {
try {
- tr.downloadFile(file, name, fileSize, href, button);
+ tr.downloadFile(uri, name, fileSize, href, button);
} catch (IOException e) {
final String ExceptionName = e.getClass().getSimpleName();
final String ExceptionMess = e.getMessage();
@@ -325,15 +334,12 @@ public class DownloadFragment extends Fragment {
LinearLayout layout = (LinearLayout) v.getParent();
final String name = (String) layout.getTag(R.id.ID_FILE_NAME);
final String type = (String) layout.getTag(R.id.ID_FILE_MIME);
-
- final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION));
- File file = new File(save_location, name);
- Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
+ final Uri uri = (Uri) layout.getTag(R.id.ID_FILE_URI);
if(type.equals("text/plain")) {
String text = null;
try {
- InputStream is = new FileInputStream(file);
+ InputStream is = getActivity().getContentResolver().openInputStream(uri);
BufferedReader buf = new BufferedReader(new InputStreamReader(is));
String line;
@@ -377,10 +383,7 @@ public class DownloadFragment extends Fragment {
LinearLayout layout = (LinearLayout) v.getParent();
final String name = (String) layout.getTag(R.id.ID_FILE_NAME);
final String type = (String) layout.getTag(R.id.ID_FILE_MIME);
-
- final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION));
- File file = new File(save_location, name);
- Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
+ final Uri uri = (Uri) layout.getTag(R.id.ID_FILE_URI);
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
index 4be3d1e..77b29e4 100644
--- a/app/src/main/res/values/ids.xml
+++ b/app/src/main/res/values/ids.xml
@@ -4,6 +4,7 @@
+
\ No newline at end of file