From 236c65d8edbcb5aff7537bcb8f58f7c678310a23 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Thu, 30 Dec 2021 14:24:03 +0100 Subject: [PATCH 1/2] Fix external storage access - Allow writing on all versions - Skip migration if BRouter version has already setup basedir --- .../src/main/java/btools/routingapp/BRouterActivity.java | 3 +-- .../src/main/java/btools/routingapp/BRouterView.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterActivity.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterActivity.java index 9f933be..5fb8e04 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterActivity.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterActivity.java @@ -596,8 +596,7 @@ public class BRouterActivity extends Activity implements ActivityCompat.OnReques } } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R - && checkExternalStorageWritable()) { + if (checkExternalStorageWritable()) { res.add(Environment.getExternalStorageDirectory()); } diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java index 3141278..8b5f69c 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java @@ -127,7 +127,7 @@ public class BRouterView extends View { // don't ask twice String version = "v" + getContext().getString(R.string.app_version); File vFile = new File(brd, "profiles2/"+version ); - if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.Q + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q && vFile.exists()) { startSetup(baseDir, false); return; From d9b8f69f59b1f246da9c7cc4003132a9e32b2b76 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Tue, 26 Oct 2021 10:13:43 +0200 Subject: [PATCH 2/2] Add test to ensure legacy storage access --- brouter-routing-app/build.gradle | 6 +++ .../routingapp/BRouterActivityTest.java | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 brouter-routing-app/src/androidTest/java/btools/routingapp/BRouterActivityTest.java diff --git a/brouter-routing-app/build.gradle b/brouter-routing-app/build.gradle index 58dde91..bd69984 100644 --- a/brouter-routing-app/build.gradle +++ b/brouter-routing-app/build.gradle @@ -17,6 +17,8 @@ android { setProperty("archivesBaseName","BRouterApp." + defaultConfig.versionName) minSdkVersion 14 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } sourceSets.main.assets.srcDirs += new File(project.buildDir, 'assets') @@ -99,6 +101,10 @@ dependencies { implementation project(':brouter-expressions') implementation project(':brouter-util') + testImplementation 'junit:junit:4.13.2' + + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' } task generateProfiles(type: Exec) { diff --git a/brouter-routing-app/src/androidTest/java/btools/routingapp/BRouterActivityTest.java b/brouter-routing-app/src/androidTest/java/btools/routingapp/BRouterActivityTest.java new file mode 100644 index 0000000..6a6a9cd --- /dev/null +++ b/brouter-routing-app/src/androidTest/java/btools/routingapp/BRouterActivityTest.java @@ -0,0 +1,47 @@ +package btools.routingapp; + +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + +import android.os.Build; +import android.os.Environment; + +import androidx.test.core.app.ActivityScenario; +import androidx.test.ext.junit.rules.ActivityScenarioRule; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +public class BRouterActivityTest { + @Rule + public ActivityScenarioRule rule = new ActivityScenarioRule<>(BRouterActivity.class); + + @Test + public void storageDirectories() { + ActivityScenario scenario = rule.getScenario(); + scenario.onActivity(activity -> { + List storageDirectories = activity.getStorageDirectories(); + + // Before Android Q (10) legacy storage access is possible + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + assertThat(storageDirectories, hasItem(Environment.getExternalStorageDirectory())); + } + + // When targeting older SDK we can access legacy storage on any android version + if (activity.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.Q) { + assertThat(storageDirectories, hasItem(Environment.getExternalStorageDirectory())); + } + + assertThat(storageDirectories, not(empty())); + }); + } + +}