diff --git a/app/src/basic/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java b/app/src/basic/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java
index 0d2329980..8446e2255 100644
--- a/app/src/basic/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java
+++ b/app/src/basic/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java
@@ -6,4 +6,6 @@ class NearbyViewBinder {
static void updateUsbOtg(Context context) {
throw new IllegalStateException("unimplemented");
}
+ static void updateExternalStorageViews(Context context) {
+ }
}
diff --git a/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java b/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java
index e31bf809f..cf7245ea5 100644
--- a/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java
+++ b/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java
@@ -13,6 +13,7 @@ import android.os.Environment;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.provider.DocumentsContract;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -73,8 +74,6 @@ public class NearbyViewBinder {
subtext.setText(activity.getString(R.string.nearby_splash__both_parties_need_fdroid,
activity.getString(R.string.app_name)));
- ImageView nearbySplash = swapView.findViewById(R.id.image);
-
Button startButton = swapView.findViewById(R.id.find_people_button);
startButton.setOnClickListener(v -> {
final String coarseLocation = Manifest.permission.ACCESS_COARSE_LOCATION;
@@ -86,6 +85,23 @@ public class NearbyViewBinder {
}
});
+ updateExternalStorageViews(activity);
+ updateUsbOtg(activity);
+ }
+
+ public static void updateExternalStorageViews(final AppCompatActivity activity) {
+ if (swapView == null || activity == null) {
+ return;
+ }
+
+ ImageView nearbySplash = swapView.findViewById(R.id.image);
+ TextView explainer = swapView.findViewById(R.id.read_external_storage_text);
+ Button button = swapView.findViewById(R.id.request_read_external_storage_button);
+
+ if (nearbySplash == null || explainer == null || button == null) {
+ return;
+ }
+
File[] dirs = activity.getExternalFilesDirs("");
if (dirs != null) {
for (File dir : dirs) {
@@ -102,28 +118,48 @@ public class NearbyViewBinder {
}
final String readExternalStorage = Manifest.permission.READ_EXTERNAL_STORAGE;
+
if (externalStorage != null) {
nearbySplash.setVisibility(View.GONE);
- TextView readExternalStorageText = swapView.findViewById(R.id.read_external_storage_text);
- readExternalStorageText.setVisibility(View.VISIBLE);
- Button requestReadExternalStorage = swapView.findViewById(R.id.request_read_external_storage_button);
- requestReadExternalStorage.setVisibility(View.VISIBLE);
- requestReadExternalStorage.setOnClickListener(v -> {
- if ((externalStorage == null || !externalStorage.canRead())
- && PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(activity,
- readExternalStorage)) {
- ActivityCompat.requestPermissions(activity, new String[]{readExternalStorage},
- MainActivity.REQUEST_STORAGE_PERMISSIONS);
+ explainer.setVisibility(View.VISIBLE);
+ button.setVisibility(View.VISIBLE);
+ if (Build.VERSION.SDK_INT >= 30) {
+ if (!Environment.isExternalStorageManager()) {
+ // we don't have permission to access files yet, so ask for it
+ explainer.setText(R.string.nearby_splach__external_storage_permission_explainer);
+ button.setText(R.string.nearby_splace__external_storage_permission_button);
+ button.setOnClickListener(view -> activity.startActivity(
+ new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
+ Uri.parse(String.format("package:%s",
+ activity.getPackageName())))));
} else {
- Toast.makeText(activity,
- activity.getString(R.string.scan_removable_storage_toast, externalStorage),
- Toast.LENGTH_SHORT).show();
- SDCardScannerService.scan(activity);
+ explainer.setText(R.string.nearby_splash__read_external_storage);
+ button.setText(R.string.nearby_splash__request_permission);
+ button.setOnClickListener(view -> scanExternalStorageNow(activity));
}
- });
+ } else {
+ if ((externalStorage == null || !externalStorage.canRead())
+ && PackageManager.PERMISSION_GRANTED
+ != ContextCompat.checkSelfPermission(activity, readExternalStorage)) {
+ explainer.setText(R.string.nearby_splach__external_storage_permission_explainer);
+ button.setText(R.string.nearby_splace__external_storage_permission_button);
+ button.setOnClickListener(v -> {
+ ActivityCompat.requestPermissions(activity, new String[]{readExternalStorage},
+ MainActivity.REQUEST_STORAGE_PERMISSIONS);
+ });
+ } else {
+ explainer.setText(R.string.nearby_splash__read_external_storage);
+ button.setText(R.string.nearby_splash__request_permission);
+ button.setOnClickListener(view -> scanExternalStorageNow(activity));
+ }
+ }
}
+ }
- updateUsbOtg(activity);
+ private static void scanExternalStorageNow(final AppCompatActivity activity) {
+ Toast.makeText(activity, activity.getString(R.string.scan_removable_storage_toast, externalStorage),
+ Toast.LENGTH_SHORT).show();
+ SDCardScannerService.scan(activity);
}
public static void updateUsbOtg(final Context context) {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f436c2d16..6395e7747 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -55,6 +55,7 @@
+
diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
index 9b05cc66e..bfdc0e972 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
@@ -173,6 +173,8 @@ public class MainActivity extends AppCompatActivity {
// AppDetailsActivity and RepoDetailsActivity set different NFC actions, so reset here
NfcHelper.setAndroidBeam(this, getApplication().getPackageName());
checkForAddRepoIntent(getIntent());
+
+ NearbyViewBinder.updateExternalStorageViews(this);
}
@Override
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e8264591f..2a144d4d6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -518,7 +518,9 @@ This often occurs with apps installed via Google Play or other sources, if they
Search SD Card for repos and mirrors.
Search USB OTG for repos and mirrors.
- Try it
+ Search now
+ F-Droid can search for repos and mirrors on your SD Card, but needs your permission to do so.
+ Try it
Touch to swap