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