Increase minSdkVersion to 14 and merge implementations
AndroidX needs at least API level 14 (Ice Cream Sandwich) which was released 10 years ago and should not exclude many devices. Having a merged tree simplifies the development.
This commit is contained in:
parent
cf4a188e40
commit
0e04c1a849
9 changed files with 78 additions and 368 deletions
|
@ -13,6 +13,8 @@ android {
|
||||||
|
|
||||||
resValue('string', 'app_version', defaultConfig.versionName)
|
resValue('string', 'app_version', defaultConfig.versionName)
|
||||||
setProperty("archivesBaseName","BRouterApp." + defaultConfig.versionName)
|
setProperty("archivesBaseName","BRouterApp." + defaultConfig.versionName)
|
||||||
|
|
||||||
|
minSdkVersion 14
|
||||||
}
|
}
|
||||||
|
|
||||||
if(project.hasProperty("RELEASE_STORE_FILE")) {
|
if(project.hasProperty("RELEASE_STORE_FILE")) {
|
||||||
|
@ -70,13 +72,11 @@ android {
|
||||||
api19 {
|
api19 {
|
||||||
dimension "api"
|
dimension "api"
|
||||||
|
|
||||||
minSdkVersion 10
|
|
||||||
targetSdkVersion 19
|
targetSdkVersion 19
|
||||||
}
|
}
|
||||||
api30 {
|
api30 {
|
||||||
dimension "api"
|
dimension "api"
|
||||||
|
|
||||||
minSdkVersion 19
|
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
api30Implementation 'androidx.appcompat:appcompat:1.3.1'
|
implementation 'androidx.appcompat:appcompat:1.3.1'
|
||||||
|
|
||||||
implementation project(':brouter-mapaccess')
|
implementation project(':brouter-mapaccess')
|
||||||
implementation project(':brouter-core')
|
implementation project(':brouter-core')
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
package btools.routingapp;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.pm.ActivityInfo;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.os.PowerManager.WakeLock;
|
|
||||||
import android.os.StatFs;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class BInstallerMainActivity extends Activity {
|
|
||||||
|
|
||||||
|
|
||||||
static public long getAvailableSpace (String baseDir) {
|
|
||||||
StatFs stat = new StatFs(baseDir);
|
|
||||||
return (long)stat.getAvailableBlocks()*stat.getBlockSize();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,106 +0,0 @@
|
||||||
package btools.routingapp;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.ActivityManager;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.net.ConnectivityManager;
|
|
||||||
import android.net.Network;
|
|
||||||
import android.net.NetworkCapabilities;
|
|
||||||
import android.net.NetworkInfo;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Environment;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.os.PowerManager.WakeLock;
|
|
||||||
import android.os.StatFs;
|
|
||||||
import android.widget.EditText;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import btools.router.OsmNodeNamed;
|
|
||||||
|
|
||||||
public class BRouterMainActivity extends Activity
|
|
||||||
{
|
|
||||||
|
|
||||||
public boolean checkSelfPermission (Context context, String perm ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStorageState(File f ) {
|
|
||||||
return Environment.getExternalStorageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<File> getStorageDirectories() {
|
|
||||||
List<String> list = getFilesDirs();
|
|
||||||
ArrayList<File> flist = new ArrayList<>();
|
|
||||||
for (String s: list) {
|
|
||||||
File f = new File(s);
|
|
||||||
flist.add(f);
|
|
||||||
}
|
|
||||||
return flist;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getFilesDirs()
|
|
||||||
{
|
|
||||||
ArrayList<String> res = new ArrayList<String>();
|
|
||||||
|
|
||||||
// check write access on internal sd
|
|
||||||
try
|
|
||||||
{
|
|
||||||
File sd = Environment.getExternalStorageDirectory();
|
|
||||||
File testDir = new File( sd, "brouter" );
|
|
||||||
boolean didExist = testDir.isDirectory();
|
|
||||||
if ( !didExist )
|
|
||||||
{
|
|
||||||
testDir.mkdir();
|
|
||||||
}
|
|
||||||
File testFile = new File( testDir, "test" + System.currentTimeMillis() );
|
|
||||||
testFile.createNewFile();
|
|
||||||
if ( testFile.exists() )
|
|
||||||
{
|
|
||||||
testFile.delete();
|
|
||||||
res.add( sd.getPath() );
|
|
||||||
}
|
|
||||||
if ( !didExist )
|
|
||||||
{
|
|
||||||
testDir.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( Throwable t )
|
|
||||||
{
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
// not on api 10
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Method method = Context.class.getDeclaredMethod("getExternalFilesDirs", new Class[]{ String.class } );
|
|
||||||
File[] paths = (File[])method.invoke( this, new Object[1] );
|
|
||||||
for( File path : paths )
|
|
||||||
{
|
|
||||||
res.add( path.getPath() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( Exception e )
|
|
||||||
{
|
|
||||||
res.add( e.toString() );
|
|
||||||
res.add( Environment.getExternalStorageDirectory().getPath() );
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,104 +0,0 @@
|
||||||
package btools.routingapp;
|
|
||||||
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationChannel;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.media.AudioAttributes;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import static android.content.Context.NOTIFICATION_SERVICE;
|
|
||||||
|
|
||||||
public class NotificationHelper {
|
|
||||||
|
|
||||||
private static final boolean DEBUG = false;
|
|
||||||
|
|
||||||
public static String BRouterNotificationChannel1 = "brouter_channel_01";
|
|
||||||
|
|
||||||
private Context mContext;
|
|
||||||
private int NOTIFICATION_ID = 111;
|
|
||||||
private Notification mNotification;
|
|
||||||
private NotificationManager mNotificationManager;
|
|
||||||
private PendingIntent mContentIntent;
|
|
||||||
private CharSequence mContentTitle;
|
|
||||||
|
|
||||||
public NotificationHelper(Context context)
|
|
||||||
{
|
|
||||||
if (DEBUG) Log.d("NH", "init " );
|
|
||||||
mContext = context;
|
|
||||||
createNotificationChannels();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startNotification(Service service) {
|
|
||||||
if (DEBUG) Log.d("NH", "startNotification " );
|
|
||||||
|
|
||||||
mNotification = createNotification("BRouter Download", "Download some files");
|
|
||||||
if (mNotification != null) {
|
|
||||||
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
mNotificationManager.notify(NOTIFICATION_ID, mNotification);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void progressUpdate(String text) {
|
|
||||||
mNotification = createNotification("BRouter Download", text);
|
|
||||||
|
|
||||||
if (mNotification != null) {
|
|
||||||
mNotification.flags = Notification.FLAG_NO_CLEAR |
|
|
||||||
Notification.FLAG_ONGOING_EVENT;
|
|
||||||
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
mNotificationManager.notify(NOTIFICATION_ID, mNotification);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Notification createNotification(String title, String desc) {
|
|
||||||
|
|
||||||
Intent resultIntent = new Intent(mContext, BInstallerActivity.class);
|
|
||||||
|
|
||||||
Intent notificationIntent = new Intent();
|
|
||||||
mContentIntent = PendingIntent.getActivity(mContext, 0, resultIntent, PendingIntent.FLAG_IMMUTABLE);
|
|
||||||
|
|
||||||
Notification.Builder builder ;
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
|
||||||
builder = new Notification.Builder(mContext);
|
|
||||||
builder.setSmallIcon(android.R.drawable.stat_sys_download)
|
|
||||||
.setContentTitle(title)
|
|
||||||
.setContentText(desc)
|
|
||||||
.setOnlyAlertOnce(true)
|
|
||||||
.setContentIntent(mContentIntent);
|
|
||||||
|
|
||||||
if(Build.VERSION.SDK_INT>=11 && Build.VERSION.SDK_INT<=15)
|
|
||||||
return builder.getNotification();
|
|
||||||
else if (Build.VERSION.SDK_INT > 15)
|
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* create notification channels
|
|
||||||
*/
|
|
||||||
public void createNotificationChannels() {
|
|
||||||
if (DEBUG) Log.d("NH", "createNotificationChannels " );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopNotification() {
|
|
||||||
if (DEBUG) Log.d("NH", "stopNotification " );
|
|
||||||
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
mNotificationManager.deleteNotificationChannel(BRouterNotificationChannel1);
|
|
||||||
}
|
|
||||||
mNotificationManager.cancel(NOTIFICATION_ID);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
package btools.routingapp;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.pm.ActivityInfo;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.os.PowerManager.WakeLock;
|
|
||||||
import android.speech.tts.TextToSpeech.OnInitListener;
|
|
||||||
import android.os.StatFs;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class BInstallerMainActivity extends Activity implements OnInitListener {
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onInit(int i)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static public long getAvailableSpace (String baseDir) {
|
|
||||||
StatFs stat = new StatFs(baseDir);
|
|
||||||
|
|
||||||
return (long)stat.getAvailableBlocksLong()*stat.getBlockSizeLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,88 +0,0 @@
|
||||||
package btools.routingapp;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.ActivityManager;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.net.ConnectivityManager;
|
|
||||||
import android.net.Network;
|
|
||||||
import android.net.NetworkCapabilities;
|
|
||||||
import android.net.NetworkInfo;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Environment;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.os.PowerManager.WakeLock;
|
|
||||||
import android.os.StatFs;
|
|
||||||
import android.speech.tts.TextToSpeech.OnInitListener;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.widget.EditText;
|
|
||||||
|
|
||||||
import androidx.core.app.ActivityCompat;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import androidx.core.os.EnvironmentCompat;
|
|
||||||
|
|
||||||
import btools.router.OsmNodeNamed;
|
|
||||||
|
|
||||||
public class BRouterMainActivity extends Activity implements OnInitListener, ActivityCompat.OnRequestPermissionsResultCallback
|
|
||||||
{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onInit( int i )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean checkSelfPermission (Context context, String perm ) {
|
|
||||||
boolean b = checkSelfPermission(context, perm);
|
|
||||||
if (b) {
|
|
||||||
ActivityCompat.requestPermissions (this, new String[]{perm}, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStorageState(File f) {
|
|
||||||
return EnvironmentCompat.getStorageState(f); //Environment.MEDIA_MOUNTED
|
|
||||||
}
|
|
||||||
|
|
||||||
public File[] getExternFilesDirs(String d) {
|
|
||||||
return getExternalFilesDirs(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<File> getStorageDirectories () {
|
|
||||||
ArrayList<File> list = null;
|
|
||||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
|
|
||||||
list = new ArrayList<File>(Arrays.asList(getExternalMediaDirs()));
|
|
||||||
} else {
|
|
||||||
list = new ArrayList<File>(Arrays.asList(getExternFilesDirs(null)));
|
|
||||||
}
|
|
||||||
ArrayList<File> res = new ArrayList<File>();
|
|
||||||
|
|
||||||
for (File f : list) {
|
|
||||||
if (f != null) {
|
|
||||||
if (getStorageState(f).equals(Environment.MEDIA_MOUNTED))
|
|
||||||
res.add (f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// res.add(getContext().getFilesDir());
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
|
@ -19,7 +20,7 @@ import android.speech.tts.TextToSpeech.OnInitListener;
|
||||||
import android.os.StatFs;
|
import android.os.StatFs;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
public class BInstallerActivity extends BInstallerMainActivity {
|
public class BInstallerActivity extends Activity {
|
||||||
|
|
||||||
public static final String DOWNLOAD_ACTION = "btools.routingapp.download";
|
public static final String DOWNLOAD_ACTION = "btools.routingapp.download";
|
||||||
|
|
||||||
|
@ -151,4 +152,14 @@ public class BInstallerActivity extends BInstallerMainActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public long getAvailableSpace (String baseDir) {
|
||||||
|
StatFs stat = new StatFs(baseDir);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||||
|
return stat.getAvailableBlocksLong()*stat.getBlockSizeLong();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return stat.getAvailableBlocks()*stat.getBlockSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,9 +33,12 @@ import android.view.KeyEvent;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
|
import androidx.core.os.EnvironmentCompat;
|
||||||
|
|
||||||
import btools.router.OsmNodeNamed;
|
import btools.router.OsmNodeNamed;
|
||||||
|
|
||||||
public class BRouterActivity extends BRouterMainActivity {
|
public class BRouterActivity extends Activity {
|
||||||
|
|
||||||
private static final int DIALOG_SELECTPROFILE_ID = 1;
|
private static final int DIALOG_SELECTPROFILE_ID = 1;
|
||||||
private static final int DIALOG_EXCEPTION_ID = 2;
|
private static final int DIALOG_EXCEPTION_ID = 2;
|
||||||
|
@ -667,4 +670,62 @@ public class BRouterActivity extends BRouterMainActivity {
|
||||||
mWakeLock.release();
|
mWakeLock.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean checkSelfPermission (Context context, String perm ) {
|
||||||
|
boolean b = checkSelfPermission(context, perm);
|
||||||
|
if (b) {
|
||||||
|
ActivityCompat.requestPermissions (this, new String[]{perm}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStorageState(File f) {
|
||||||
|
return EnvironmentCompat.getStorageState(f); //Environment.MEDIA_MOUNTED
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<File> getStorageDirectories () {
|
||||||
|
ArrayList<File> list = null;
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
|
list = new ArrayList<File>(Arrays.asList(getExternalMediaDirs()));
|
||||||
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
|
list = new ArrayList<File>(Arrays.asList(getExternalFilesDirs(null)));
|
||||||
|
}
|
||||||
|
ArrayList<File> res = new ArrayList<File>();
|
||||||
|
|
||||||
|
for (File f : list) {
|
||||||
|
if (f != null) {
|
||||||
|
if (getStorageState(f).equals(Environment.MEDIA_MOUNTED))
|
||||||
|
res.add (f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkExternalStorageWritable()) {
|
||||||
|
res.add(Environment.getExternalStorageDirectory());
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkExternalStorageWritable() {
|
||||||
|
boolean isWritable = false;
|
||||||
|
try {
|
||||||
|
File sd = Environment.getExternalStorageDirectory();
|
||||||
|
File testDir = new File( sd, "brouter" );
|
||||||
|
boolean didExist = testDir.isDirectory();
|
||||||
|
if ( !didExist )
|
||||||
|
{
|
||||||
|
testDir.mkdir();
|
||||||
|
}
|
||||||
|
File testFile = new File( testDir, "test" + System.currentTimeMillis() );
|
||||||
|
testFile.createNewFile();
|
||||||
|
if ( testFile.exists() ) {
|
||||||
|
testFile.delete();
|
||||||
|
isWritable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Throwable t) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return isWritable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue