Commit 3cb979cb13 for strongswan.org

commit 3cb979cb13a49b38113c4d3ecdaef1c3608d4b27
Author: Tobias Brunner <tobias@strongswan.org>
Date:   Fri Oct 16 13:53:41 2026 +0200

    android: Remove compatibility checks related to Android M (23)

    Android 6 is now our minimum version, so we don't need these anymore.

diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/data/ManagedConfigurationService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/data/ManagedConfigurationService.java
index ac8e73d9b4..b2afb8b120 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/data/ManagedConfigurationService.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/data/ManagedConfigurationService.java
@@ -19,14 +19,12 @@ package org.strongswan.android.data;
 import android.content.Context;
 import android.content.RestrictionsManager;
 import android.content.SharedPreferences;
-import android.os.Build;
 import android.os.Bundle;

 import org.strongswan.android.utils.Constants;

 import java.util.Collections;
 import java.util.Map;
-import java.util.UUID;

 import androidx.preference.PreferenceManager;

@@ -44,11 +42,6 @@ public class ManagedConfigurationService

 	public void loadConfiguration()
 	{
-		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
-		{
-			return;
-		}
-
 		final RestrictionsManager restrictionsService = mContext.getSystemService(RestrictionsManager.class);
 		if (restrictionsService == null)
 		{
diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java
index 97e93e8e04..0f1dfdc4b3 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java
@@ -479,11 +479,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
 				intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 				intent.setAction(VpnProfileControlActivity.START_PROFILE);
 				intent.putExtra(VpnProfileControlActivity.EXTRA_VPN_PROFILE_UUID, profile.getUUID().toString());
-				int flags = PendingIntent.FLAG_UPDATE_CURRENT;
-				if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-				{
-					flags |= PendingIntent.FLAG_IMMUTABLE;
-				}
+				int flags = PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE;
 				PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent,
 																  flags);
 				builder.addAction(R.drawable.ic_notification_connecting, getString(R.string.retry), pending);
@@ -515,11 +511,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
 		}
 		builder.setContentTitle(getString(s));

-		int flags = PendingIntent.FLAG_UPDATE_CURRENT;
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-		{
-			flags |= PendingIntent.FLAG_IMMUTABLE;
-		}
+		int flags = PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE;
 		if (!publicVersion)
 		{
 			if (add_action)
@@ -850,11 +842,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
 			 * we just use our main Activity */
 			Context context = getApplicationContext();
 			Intent intent = new Intent(context, MainActivity.class);
-			int flags = PendingIntent.FLAG_UPDATE_CURRENT;
-			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-			{
-				flags |= PendingIntent.FLAG_IMMUTABLE;
-			}
+			int flags = PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE;
 			PendingIntent pending = PendingIntent.getActivity(context, 0, intent, flags);
 			builder.setConfigureIntent(pending);

@@ -1412,12 +1400,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
 	 */
 	private static String getAndroidVersion()
 	{
-		String version = "Android " + Build.VERSION.RELEASE + " - " + Build.DISPLAY;
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-		{
-			version += "/" + Build.VERSION.SECURITY_PATCH;
-		}
-		return version;
+		return "Android " + Build.VERSION.RELEASE + " - " + Build.DISPLAY + "/" + Build.VERSION.SECURITY_PATCH;
 	}

 	/**
diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java
index 7288b287ac..47714b1f20 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/Scheduler.java
@@ -29,8 +29,6 @@ import java.util.ArrayList;
 import java.util.PriorityQueue;
 import java.util.UUID;

-import androidx.annotation.RequiresApi;
-
 public class Scheduler extends BroadcastReceiver
 {
 	private final String EXECUTE_JOB = "org.strongswan.android.Scheduler.EXECUTE_JOB";
@@ -91,11 +89,7 @@ public class Scheduler extends BroadcastReceiver
 		/* using component/class doesn't work with dynamic broadcast receivers */
 		Intent intent = new Intent(EXECUTE_JOB);
 		intent.setPackage(mContext.getPackageName());
-		int flags = 0;
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-		{
-			flags |= PendingIntent.FLAG_IMMUTABLE;
-		}
+		int flags = PendingIntent.FLAG_IMMUTABLE;
 		return PendingIntent.getBroadcast(mContext, 0, intent, flags);
 	}

@@ -106,7 +100,6 @@ public class Scheduler extends BroadcastReceiver
 	 * @param id job ID
 	 * @param ms delta in milliseconds when the job should be executed
 	 */
-	@RequiresApi(api = Build.VERSION_CODES.M)
 	public void scheduleJob(String id, long ms)
 	{
 		synchronized (this)
@@ -122,7 +115,6 @@ public class Scheduler extends BroadcastReceiver
 		}
 	}

-	@RequiresApi(api = Build.VERSION_CODES.M)
 	@Override
 	public void onReceive(Context context, Intent intent)
 	{
diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java
index 9ff07175e3..eeeda5a0f0 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java
@@ -282,23 +282,20 @@ public class VpnProfileControlActivity extends AppCompatActivity
 	 */
 	private boolean checkPowerWhitelist()
 	{
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-		{
-			PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
-			SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
-			if (!pm.isIgnoringBatteryOptimizations(this.getPackageName()) &&
-				!pref.getBoolean(Constants.PREF_IGNORE_POWER_WHITELIST, false))
-			{
-				if (getSupportFragmentManager().isStateSaved())
-				{	/* we might get called via service connection and manual onActivityResult()
-					 * call when the activity is not active anymore and fragment transactions
-					 * would cause an illegalStateException */
-					return false;
-				}
-				PowerWhitelistRequired whitelist = new PowerWhitelistRequired();
-				whitelist.show(getSupportFragmentManager(), DIALOG_TAG);
+		PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
+		SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
+		if (!pm.isIgnoringBatteryOptimizations(this.getPackageName()) &&
+			!pref.getBoolean(Constants.PREF_IGNORE_POWER_WHITELIST, false))
+		{
+			if (getSupportFragmentManager().isStateSaved())
+			{	/* we might get called via service connection and manual onActivityResult()
+				 * call when the activity is not active anymore and fragment transactions
+				 * would cause an illegalStateException */
 				return false;
 			}
+			PowerWhitelistRequired whitelist = new PowerWhitelistRequired();
+			whitelist.show(getSupportFragmentManager(), DIALOG_TAG);
+			return false;
 		}
 		return true;
 	}