From 0e04c1a849d49f63b624637cd024e369e5a42d46 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Thu, 21 Oct 2021 15:56:47 +0200 Subject: [PATCH] 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. --- brouter-routing-app/build.gradle | 6 +- .../routingapp/BInstallerMainActivity.java | 27 ----- .../routingapp/BRouterMainActivity.java | 106 ------------------ .../btools/routingapp/NotificationHelper.java | 104 ----------------- .../routingapp/BInstallerMainActivity.java | 37 ------ .../routingapp/BRouterMainActivity.java | 88 --------------- .../btools/routingapp/BInstallerActivity.java | 13 ++- .../btools/routingapp/BRouterActivity.java | 65 ++++++++++- .../btools/routingapp/NotificationHelper.java | 0 9 files changed, 78 insertions(+), 368 deletions(-) delete mode 100644 brouter-routing-app/src/api10/java/btools/routingapp/BInstallerMainActivity.java delete mode 100644 brouter-routing-app/src/api10/java/btools/routingapp/BRouterMainActivity.java delete mode 100644 brouter-routing-app/src/api10/java/btools/routingapp/NotificationHelper.java delete mode 100644 brouter-routing-app/src/api19/java/btools/routingapp/BInstallerMainActivity.java delete mode 100644 brouter-routing-app/src/api19/java/btools/routingapp/BRouterMainActivity.java rename brouter-routing-app/src/{api19 => main}/java/btools/routingapp/NotificationHelper.java (100%) diff --git a/brouter-routing-app/build.gradle b/brouter-routing-app/build.gradle index b58f639..c84a2a8 100644 --- a/brouter-routing-app/build.gradle +++ b/brouter-routing-app/build.gradle @@ -13,6 +13,8 @@ android { resValue('string', 'app_version', defaultConfig.versionName) setProperty("archivesBaseName","BRouterApp." + defaultConfig.versionName) + + minSdkVersion 14 } if(project.hasProperty("RELEASE_STORE_FILE")) { @@ -70,13 +72,11 @@ android { api19 { dimension "api" - minSdkVersion 10 targetSdkVersion 19 } api30 { dimension "api" - minSdkVersion 19 targetSdkVersion 30 } } @@ -85,7 +85,7 @@ android { dependencies { - api30Implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.appcompat:appcompat:1.3.1' implementation project(':brouter-mapaccess') implementation project(':brouter-core') diff --git a/brouter-routing-app/src/api10/java/btools/routingapp/BInstallerMainActivity.java b/brouter-routing-app/src/api10/java/btools/routingapp/BInstallerMainActivity.java deleted file mode 100644 index 9d354a5..0000000 --- a/brouter-routing-app/src/api10/java/btools/routingapp/BInstallerMainActivity.java +++ /dev/null @@ -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(); - } -} diff --git a/brouter-routing-app/src/api10/java/btools/routingapp/BRouterMainActivity.java b/brouter-routing-app/src/api10/java/btools/routingapp/BRouterMainActivity.java deleted file mode 100644 index 92f07ef..0000000 --- a/brouter-routing-app/src/api10/java/btools/routingapp/BRouterMainActivity.java +++ /dev/null @@ -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 getStorageDirectories() { - List list = getFilesDirs(); - ArrayList flist = new ArrayList<>(); - for (String s: list) { - File f = new File(s); - flist.add(f); - } - return flist; - } - - private List getFilesDirs() - { - ArrayList res = new ArrayList(); - - // 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; - } - -} diff --git a/brouter-routing-app/src/api10/java/btools/routingapp/NotificationHelper.java b/brouter-routing-app/src/api10/java/btools/routingapp/NotificationHelper.java deleted file mode 100644 index 18d0525..0000000 --- a/brouter-routing-app/src/api10/java/btools/routingapp/NotificationHelper.java +++ /dev/null @@ -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); - } -} \ No newline at end of file diff --git a/brouter-routing-app/src/api19/java/btools/routingapp/BInstallerMainActivity.java b/brouter-routing-app/src/api19/java/btools/routingapp/BInstallerMainActivity.java deleted file mode 100644 index 3b37d9e..0000000 --- a/brouter-routing-app/src/api19/java/btools/routingapp/BInstallerMainActivity.java +++ /dev/null @@ -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(); - } - -} diff --git a/brouter-routing-app/src/api19/java/btools/routingapp/BRouterMainActivity.java b/brouter-routing-app/src/api19/java/btools/routingapp/BRouterMainActivity.java deleted file mode 100644 index 8f33453..0000000 --- a/brouter-routing-app/src/api19/java/btools/routingapp/BRouterMainActivity.java +++ /dev/null @@ -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 getStorageDirectories () { - ArrayList list = null; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { - list = new ArrayList(Arrays.asList(getExternalMediaDirs())); - } else { - list = new ArrayList(Arrays.asList(getExternFilesDirs(null))); - } - ArrayList res = new ArrayList(); - - for (File f : list) { - if (f != null) { - if (getStorageState(f).equals(Environment.MEDIA_MOUNTED)) - res.add (f); - } - } - -// res.add(getContext().getFilesDir()); - return res; - } - - -} - - diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java b/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java index 14a4470..8014d37 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java @@ -12,6 +12,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; +import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.os.PowerManager.WakeLock; @@ -19,7 +20,7 @@ import android.speech.tts.TextToSpeech.OnInitListener; import android.os.StatFs; import android.util.Log; -public class BInstallerActivity extends BInstallerMainActivity { +public class BInstallerActivity extends Activity { 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(); + } + } } 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 900dca4..f9e244a 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterActivity.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterActivity.java @@ -33,9 +33,12 @@ import android.view.KeyEvent; import android.widget.EditText; +import androidx.core.app.ActivityCompat; +import androidx.core.os.EnvironmentCompat; + 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_EXCEPTION_ID = 2; @@ -54,7 +57,7 @@ public class BRouterActivity extends BRouterMainActivity { private static final int DIALOG_SHOW_WP_SCANRESULT_ID = 15; private static final int DIALOG_SHOW_REPEAT_TIMEOUT_HELP_ID = 16; private static final int DIALOG_SHOW_API23_HELP_ID = 17; - + private BRouterView mBRouterView; private PowerManager mPowerManager; @@ -667,4 +670,62 @@ public class BRouterActivity extends BRouterMainActivity { 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 getStorageDirectories () { + ArrayList list = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + list = new ArrayList(Arrays.asList(getExternalMediaDirs())); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + list = new ArrayList(Arrays.asList(getExternalFilesDirs(null))); + } + ArrayList res = new ArrayList(); + + 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; + } } diff --git a/brouter-routing-app/src/api19/java/btools/routingapp/NotificationHelper.java b/brouter-routing-app/src/main/java/btools/routingapp/NotificationHelper.java similarity index 100% rename from brouter-routing-app/src/api19/java/btools/routingapp/NotificationHelper.java rename to brouter-routing-app/src/main/java/btools/routingapp/NotificationHelper.java