From 59dd2bb1c9b2be4c6b8802fbe0ee48085881d74d Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Thu, 27 Sep 2018 19:45:25 +0200 Subject: behave nicely (no foreground service by default) if app is built with targetSdk <26 --- .../pixart/messenger/services/EventReceiver.java | 7 ++++- .../messenger/services/NotificationService.java | 12 ++++---- .../messenger/services/XmppConnectionService.java | 2 +- .../de/pixart/messenger/utils/Compatibility.java | 35 +++++++++++++++++++--- 4 files changed, 44 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/main/java/de/pixart/messenger/services/EventReceiver.java b/src/main/java/de/pixart/messenger/services/EventReceiver.java index 529741ead..a77db569e 100644 --- a/src/main/java/de/pixart/messenger/services/EventReceiver.java +++ b/src/main/java/de/pixart/messenger/services/EventReceiver.java @@ -8,6 +8,7 @@ import android.support.v4.content.ContextCompat; import android.util.Log; import de.pixart.messenger.Config; +import de.pixart.messenger.utils.Compatibility; public class EventReceiver extends BroadcastReceiver { @@ -24,7 +25,11 @@ public class EventReceiver extends BroadcastReceiver { final String action = originalIntent.getAction(); if (action.equals("ui") || hasEnabledAccounts(context)) { try { - ContextCompat.startForegroundService(context, intentForService); + if (Compatibility.runsAndTargetsTwentySix(context)) { + ContextCompat.startForegroundService(context, intentForService); + } else { + context.startService(intentForService); + } } catch (RuntimeException e) { Log.d(Config.LOGTAG, "EventReceiver was unable to start service"); } diff --git a/src/main/java/de/pixart/messenger/services/NotificationService.java b/src/main/java/de/pixart/messenger/services/NotificationService.java index 8f82207ac..bce648731 100644 --- a/src/main/java/de/pixart/messenger/services/NotificationService.java +++ b/src/main/java/de/pixart/messenger/services/NotificationService.java @@ -845,7 +845,7 @@ public class NotificationService { public Notification createForegroundNotification() { final Notification.Builder mBuilder = new Notification.Builder(mXmppConnectionService); mBuilder.setContentTitle(mXmppConnectionService.getString(R.string.conversations_foreground_service)); - if (Compatibility.twentySix() || Config.SHOW_CONNECTED_ACCOUNTS) { + if (Compatibility.runsAndTargetsTwentySix(mXmppConnectionService) || Config.SHOW_CONNECTED_ACCOUNTS) { List accounts = mXmppConnectionService.getAccounts(); int enabled = 0; int connected = 0; @@ -896,7 +896,7 @@ public class NotificationService { mBuilder.setWhen(0); mBuilder.setPriority(Notification.PRIORITY_LOW); mBuilder.setSmallIcon(R.drawable.ic_link_white_24dp); - if (Compatibility.twentySix()) { + if (Compatibility.runsTwentySix()) { mBuilder.setChannelId(FOREGROUND_CHANNEL_ID); } return mBuilder.build(); @@ -949,7 +949,7 @@ public class NotificationService { 145, new Intent(mXmppConnectionService, ManageAccountActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)); - if (Compatibility.twentySix()) { + if (Compatibility.runsTwentySix()) { mBuilder.setChannelId(ERROR_CHANNEL_ID); } notify(ERROR_NOTIFICATION_ID, mBuilder.build()); @@ -962,7 +962,7 @@ public class NotificationService { mBuilder.setSmallIcon(R.drawable.ic_hourglass_empty_white_24dp); mBuilder.setContentIntent(createContentIntent(message.getConversation())); mBuilder.setOngoing(true); - if (Compatibility.twentySix()) { + if (Compatibility.runsTwentySix()) { mBuilder.setChannelId(VIDEOCOMPRESSION_CHANNEL_ID); } Notification notification = mBuilder.build(); @@ -980,7 +980,7 @@ public class NotificationService { mBuilder.setProgress(0, 0, true); mBuilder.setSmallIcon(R.drawable.ic_import_export_white_24dp); mBuilder.setOngoing(true); - if (Compatibility.twentySix()) { + if (Compatibility.runsTwentySix()) { mBuilder.setChannelId(BACKUP_CHANNEL_ID); } return mBuilder.build(); @@ -998,7 +998,7 @@ public class NotificationService { mBuilder.setSmallIcon(R.drawable.ic_update_notification); mBuilder.setContentIntent(intent); mBuilder.setOngoing(true); - if (Compatibility.twentySix()) { + if (Compatibility.runsTwentySix()) { mBuilder.setChannelId(UPDATE_CHANNEL_ID); } return mBuilder.build(); diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index 525354957..a32f591a6 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -1103,7 +1103,7 @@ public class XmppConnectionService extends Service { Resolver.init(this); this.mRandom = new SecureRandom(); updateMemorizingTrustmanager(); - if (Compatibility.twentySix()) { + if (Compatibility.runsTwentySix()) { mNotificationService.initializeChannels(); } final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); diff --git a/src/main/java/de/pixart/messenger/utils/Compatibility.java b/src/main/java/de/pixart/messenger/utils/Compatibility.java index 3ebc7c4f6..6d5f35bc4 100644 --- a/src/main/java/de/pixart/messenger/utils/Compatibility.java +++ b/src/main/java/de/pixart/messenger/utils/Compatibility.java @@ -2,6 +2,7 @@ package de.pixart.messenger.utils; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.preference.Preference; @@ -26,13 +27,13 @@ public class Compatibility { "notification_ringtone", "notification_headsup", "vibrate_on_notification"); - private static final List UNUESD_SETTINGS_PRE_TWENTYSIX = Collections.singletonList("more_notification_settings"); + private static final List UNUSED_SETTINGS_PRE_TWENTYSIX = Collections.singletonList("more_notification_settings"); public static boolean hasStoragePermission(Context context) { return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } - public static boolean twentySix() { + public static boolean runsTwentySix() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; } @@ -48,8 +49,22 @@ public class Compatibility { return PreferenceManager.getDefaultSharedPreferences(context); } + private static boolean targetsTwentySix(Context context) { + try { + final PackageManager packageManager = context.getPackageManager(); + final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0); + return applicationInfo == null || applicationInfo.targetSdkVersion >= 26; + } catch (PackageManager.NameNotFoundException e) { + return true; //when in doubt… + } + } + + public static boolean runsAndTargetsTwentySix(Context context) { + return runsTwentySix() && targetsTwentySix(context); + } + public static boolean keepForegroundService(Context context) { - return twentySix() || getBooleanPreference(context, SettingsActivity.SHOW_FOREGROUND_SERVICE, R.bool.show_foreground_service); + return runsTwentySix() || getBooleanPreference(context, SettingsActivity.SHOW_FOREGROUND_SERVICE, R.bool.show_foreground_service); } public static void removeUnusedPreferences(SettingsFragment settingsFragment) { @@ -57,7 +72,7 @@ public class Compatibility { (PreferenceScreen) settingsFragment.findPreference("notifications")); List categories = Arrays.asList( (PreferenceCategory) settingsFragment.findPreference("general")); - for (String key : (twentySix() ? UNUSED_SETTINGS_POST_TWENTYSIX : UNUESD_SETTINGS_PRE_TWENTYSIX)) { + for (String key : (runsTwentySix() ? UNUSED_SETTINGS_POST_TWENTYSIX : UNUSED_SETTINGS_PRE_TWENTYSIX)) { Preference preference = settingsFragment.findPreference(key); if (preference != null) { for (PreferenceScreen screen : screens) { @@ -72,5 +87,17 @@ public class Compatibility { } } } + if (Compatibility.runsTwentySix()) { + if (targetsTwentySix(settingsFragment.getContext())) { + Preference preference = settingsFragment.findPreference(SettingsActivity.SHOW_FOREGROUND_SERVICE); + if (preference != null) { + for (PreferenceCategory category : categories) { + if (category != null) { + category.removePreference(preference); + } + } + } + } + } } } \ No newline at end of file -- cgit v1.2.3