Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Target Android 10, update permission handling #948

Merged
merged 11 commits into from
Jul 30, 2020
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
env:
global:
- ANDROID_API=28
- ANDROID_BUILD_TOOLS=29.0.3
- ANDROID_API=29
- ANDROID_BUILD_TOOLS=30.0.1
- ADB_INSTALL_TIMEOUT=5
language: android
jdk:
Expand Down
17 changes: 12 additions & 5 deletions app/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" android:minSdkVersion="29"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:minSdkVersion="29"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.INTERNET"/>
Expand All @@ -38,7 +40,7 @@
<uses-permission android:name="${applicationId}.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" android:minSdkVersion="28"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
Expand Down Expand Up @@ -227,8 +229,13 @@
android:value=".view.SettingsActivity"/>
</activity>

<service android:name=".tracker.Tracker"/>
<service android:name=".export.RunnerUpLiveSynchronizer$LiveService"/>
<service
android:name=".tracker.Tracker"
android:foregroundServiceType="location" />

<service
android:name=".export.RunnerUpLiveSynchronizer$LiveService"
android:foregroundServiceType="location" />

<receiver
android:name=".tracker.component.HeadsetButtonReceiver"
Expand Down
25 changes: 22 additions & 3 deletions app/assets/changes.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,34 @@
</head>
<body>
<h1>What's new</h1>
<h2>v2.1.0.1</h2>
<h2>v2.2.0.0</h2>
<p>
<ul>
<li>#947 AndroidX and AppCompatActivity migration</li>
<li>Version changed to 2.2 for Play release, previous production is 2.1.0.0</li>
<li>#949 Play console crashe corrections</li>
<li>#948 Target Android 10, update permission handling
<br>Changes required to target Android 10 and prepare for Android 11/R, required to update the app in Play.
<ul>
<li> Use SDK 29 scooped storage for external files, Google is limiting the file system use from Android 10/11
<br>For FileSynchronizer, save exports to a subdirectory of Documents, similar to the previous defaults.
<br>For db import/export use hardcoded getExternalFilesDir() and let the user copy files.</li>
<li>Permissions for activity and background for Android 10
<br>If permissions are denied, give motivation and let the user try again
(unless "don't ask again" is ticked)
<br>Remove snackbar as it will not rerequest permissions if the user ticks "don't ask again".
Instead use a popup that asks the user to go to system settings,
without starting the workout. (Linking to system settings is not
recommended in the Google guidelines.)
</li>
</ul>
</li>
<li>#947 AndroidX and AppCompatActivity migration
<br>Internal change, support libraries replaced with Google's updated libraries</li>
</ul>
<h2>v2.1.0.0</h2>
<p>
<ul>
<li>Minor version number changed to 2.1 to prepare for Play release, previous production is 2.0.2.1</li>
<li>Minor version number changed to 2.1 for Play release, previous production is 2.0.2.1</li>
<li>#946 Play console feedback
<ul>
<li>Translations update: Czech cue, Romanian, Indonesian </li>
Expand Down
3 changes: 2 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ android {

splits {
abi {
enable rootProject.ext.allowNonFree && gradle.startParameter.taskNames.contains("assembleLatestRelease")
// Disable, app bundles used in play
// enable rootProject.ext.allowNonFree && gradle.startParameter.taskNames.contains("assembleLatestRelease")
// relevant archs only - these are the only available anyway for newer NDK
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk true
Expand Down
2 changes: 1 addition & 1 deletion app/res/layout/filepermission.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:text="URL"
android:text="URI"
tools:ignore="HardcodedText"/>

<EditText
Expand Down
32 changes: 23 additions & 9 deletions app/src/main/org/runnerup/db/DBHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.runnerup.db;

import androidx.appcompat.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
Expand All @@ -27,6 +26,7 @@
import android.database.sqlite.SQLiteOpenHelper;
import android.os.AsyncTask;
import android.util.Log;
import androidx.appcompat.app.AlertDialog;

import org.json.JSONException;
import org.json.JSONObject;
Expand All @@ -51,6 +51,7 @@
import org.runnerup.util.FileUtil;
import org.runnerup.workout.FileFormats;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -624,6 +625,11 @@ public static String getDbPath(Context ctx) {
return ctx.getFilesDir().getPath() + "/../databases/" + DBNAME;
}

private static String getDefaultBackupPath(Context ctx) {
// A path that can be used with SDK 29 scooped storage
return ctx.getExternalFilesDir(null) + File.separator + "runnerup.db.export";
}

public static void importDatabase(Context ctx, String from) {
final DBHelper mDBHelper = DBHelper.getHelper(ctx);
final SQLiteDatabase db = mDBHelper.getWritableDatabase();
Expand All @@ -637,16 +643,20 @@ public void onClick(DialogInterface dialog, int which) {
}
};

if (from == null) {
from = getDefaultBackupPath(ctx);
}
AlertDialog.Builder builder = new AlertDialog.Builder(ctx)
.setTitle("Import " + DBNAME + " from " + from);
.setTitle("Import " + DBNAME);
try {
String to = getDbPath(ctx);
int cnt = FileUtil.copyFile(to, from);
builder.setMessage("Copied " + cnt + " bytes")
builder.setMessage("Copied " + cnt + " bytes from " + from +
"\n\nRestart to use the database")
.setPositiveButton(ctx.getString(R.string.OK), listener);
} catch (IOException e) {
builder.setMessage("Exception: " + e.toString())
.setNegativeButton(ctx.getString(R.string.OK), listener);
builder.setMessage("Exception: " + e.toString() + " for " + from)
.setNegativeButton(ctx.getString(R.string.Cancel), listener);
}
builder.show();
}
Expand All @@ -659,16 +669,20 @@ public void onClick(DialogInterface dialog, int which) {
}
};

if (to == null) {
to = getDefaultBackupPath(ctx);
}
AlertDialog.Builder builder = new AlertDialog.Builder(ctx)
.setTitle("Export " + DBNAME + " to " + to);
.setTitle("Export " + DBNAME);
try {
String from = getDbPath(ctx);
int cnt = FileUtil.copyFile(to, from);
builder.setMessage("Copied " + cnt + " bytes")
builder.setMessage("Exported " + cnt + " bytes to " + to +
"\n\nNote that the file will be deleted at uninstall")
.setPositiveButton(ctx.getString(R.string.OK), listener);
} catch (IOException e) {
builder.setMessage("Exception: " + e.toString())
.setNegativeButton(ctx.getString(R.string.OK), listener);
builder.setMessage("Exception: " + e.toString() + " for " + to)
.setNegativeButton(ctx.getString(R.string.Cancel), listener);
}
builder.show();
}
Expand Down
Loading