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