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 0df89f884..bf9684911 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
@@ -85,11 +85,15 @@ class NearbyViewBinder {
Environment.isExternalStorageRemovable(activity.getExternalFilesDir("")));
File[] dirs = activity.getExternalFilesDirs("");
if (dirs != null) {
- for (File f : dirs) {
- if (f != null && Environment.isExternalStorageRemovable(f)) {
- // remove Android/data/org.fdroid.fdroid/files to get root
- externalStorage = f.getParentFile().getParentFile().getParentFile().getParentFile();
- break;
+ for (File dir : dirs) {
+ if (dir != null && Environment.isExternalStorageRemovable(dir)) {
+ String state = Environment.getExternalStorageState(dir);
+ if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)
+ || Environment.MEDIA_MOUNTED.equals(state)) {
+ // remove Android/data/org.fdroid.fdroid/files to get root
+ externalStorage = dir.getParentFile().getParentFile().getParentFile().getParentFile();
+ break;
+ }
}
}
}
@@ -100,7 +104,11 @@ class NearbyViewBinder {
externalStorage = Environment.getExternalStorageDirectory();
}
- if (externalStorage != null) {
+ final String writeExternalStorage = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+
+ if (externalStorage != null
+ || PackageManager.PERMISSION_GRANTED
+ != ContextCompat.checkSelfPermission(activity, writeExternalStorage)) {
nearbySplash.setVisibility(View.GONE);
View readExternalStorage = swapView.findViewById(R.id.readExternalStorage);
readExternalStorage.setVisibility(View.VISIBLE);
@@ -109,26 +117,20 @@ class NearbyViewBinder {
@RequiresApi(api = 21)
@Override
public void onClick(View v) {
- File storage = externalStorage.getParentFile();
- File[] files = storage.listFiles();
- String msg = "";
- if (files != null) for (File f : files) {
- msg += "|" + f.getName();
- }
- Toast.makeText(activity, msg, Toast.LENGTH_LONG).show();
- final String writeExternalStorage = Manifest.permission.WRITE_EXTERNAL_STORAGE;
if (Build.VERSION.SDK_INT >= 23
- && !externalStorage.canRead()
+ && (externalStorage == null || !externalStorage.canRead())
&& PackageManager.PERMISSION_GRANTED
!= ContextCompat.checkSelfPermission(activity, writeExternalStorage)) {
ActivityCompat.requestPermissions(activity, new String[]{writeExternalStorage},
MainActivity.REQUEST_STORAGE_PERMISSIONS);
} else {
+ Toast.makeText(activity,
+ activity.getString(R.string.scan_removable_storage_toast, externalStorage),
+ Toast.LENGTH_SHORT).show();
SDCardScannerService.scan(activity);
}
}
});
-
}
}
}
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/ApkVerifier.java b/app/src/main/java/org/fdroid/fdroid/installer/ApkVerifier.java
index e59ba3678..fc827122a 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/ApkVerifier.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/ApkVerifier.java
@@ -26,7 +26,6 @@ import android.net.Uri;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
-
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Apk;
@@ -91,9 +90,11 @@ class ApkVerifier {
Utils.debugLog(TAG, "expectedTargetSdkVersion: " + expectedTargetSdkVersion);
if (expectedTargetSdkVersion == Apk.SDK_VERSION_MIN_VALUE) {
// NOTE: In old fdroidserver versions, targetSdkVersion was not stored inside the repo!
- Log.w(TAG, "Skipping check for targetSdkVersion, not available in this repo!");
+ Log.w(TAG, "Skipping check for targetSdkVersion, not available in this app or repo!");
} else if (localTargetSdkVersion != expectedTargetSdkVersion) {
- throw new ApkVerificationException("TargetSdkVersion of apk file is not the expected targetSdkVersion!");
+ throw new ApkVerificationException(
+ String.format("TargetSdkVersion of apk file (%d) is not the expected targetSdkVersion (%d)!",
+ localTargetSdkVersion, expectedTargetSdkVersion));
}
}
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 444765855..26b506e99 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
@@ -56,6 +56,7 @@ import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.NewRepoConfig;
+import org.fdroid.fdroid.localrepo.SDCardScannerService;
import org.fdroid.fdroid.views.AppDetailsActivity;
import org.fdroid.fdroid.views.ManageReposActivity;
import org.fdroid.fdroid.views.apps.AppListActivity;
@@ -248,6 +249,11 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationB
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_LOCATION_PERMISSIONS) {
startActivity(new Intent(this, SwapWorkflowActivity.class));
+ } else if (requestCode == REQUEST_STORAGE_PERMISSIONS) {
+ Toast.makeText(this,
+ this.getString(R.string.scan_removable_storage_toast, ""),
+ Toast.LENGTH_SHORT).show();
+ SDCardScannerService.scan(this);
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b7bc47db7..f85b4273a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -60,6 +60,7 @@
The advertised title of your local repo: %s
Use encrypted HTTPS:// connection for local repo
Scan removable storage
+ Scanning %s…
Look for package repos on removable storage like SD Cards
and USB thumb drives