From a9ab10682edff932da1dde07a73152152b0031c7 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Fri, 17 Nov 2023 11:51:33 +0200 Subject: [PATCH] Start Automatically setting now starts the app instead of notifying --- .../tutpro/baresip/BootCompletedReceiver.kt | 30 +--------- .../com/tutpro/baresip/ConfigActivity.kt | 59 ++++++++++++++++++- app/src/main/res/values-fi/strings.xml | 2 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 61 insertions(+), 31 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BootCompletedReceiver.kt b/app/src/main/kotlin/com/tutpro/baresip/BootCompletedReceiver.kt index 3e6da5b3..a9bbfa9e 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BootCompletedReceiver.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BootCompletedReceiver.kt @@ -1,23 +1,15 @@ package com.tutpro.baresip import android.annotation.SuppressLint -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent -import android.app.Service import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.os.Build import android.os.Bundle -import androidx.core.app.NotificationCompat import java.nio.charset.StandardCharsets class BootCompletedReceiver : BroadcastReceiver() { - private val START_NOTIFICATION_IN = 105 - @SuppressLint("UnspecifiedImmutableFlag") override fun onReceive(context: Context, intent: Intent) { @@ -28,34 +20,14 @@ class BootCompletedReceiver : BroadcastReceiver() { val asCv = Utils.getNameValue(config,"auto_start") if ((asCv.size > 0) && (asCv[0] == "yes")) { - Log.i(TAG, "Start baresip upon boot completed") - val i = Intent(context, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val b = Bundle() b.putBoolean("onStartup", true) putExtras(b) } - - if (Build.VERSION.SDK_INT < 29) { - context.startActivity(i) - } else { - val nm = context.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager - val channel = NotificationChannel("default", "default", - NotificationManager.IMPORTANCE_DEFAULT) - nm.createNotificationChannel(channel) - val pi = PendingIntent.getActivity(context, 0, i, - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT) - with(NotificationCompat.Builder(context, "default")) { - setSmallIcon(R.drawable.ic_stat) - setContentTitle(context.getString(R.string.app_name)) - setContentText(context.getString(R.string.tap_to_start)) - setContentIntent(pi) - setAutoCancel(true) - nm.notify(START_NOTIFICATION_IN, build()) - } - } + context.startActivity(i) } } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt index 7f557c67..02e782b7 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt @@ -10,11 +10,18 @@ import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.os.PowerManager +import android.provider.Settings import android.text.method.LinkMovementMethod import android.view.Menu import android.view.MenuItem import android.view.View -import android.widget.* +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.CheckBox +import android.widget.EditText +import android.widget.ScrollView +import android.widget.Spinner +import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts @@ -29,7 +36,7 @@ import com.tutpro.baresip.Utils.showSnackBar import com.tutpro.baresip.databinding.ActivityConfigBinding import java.io.File import java.io.FileInputStream -import java.util.* +import java.util.Locale class ConfigActivity : AppCompatActivity() { @@ -59,6 +66,7 @@ class ConfigActivity : AppCompatActivity() { private var oldAutoStart = "" private var oldListenAddr = "" + private var managingOverlayPermission = false private var oldDnsServers = "" private var oldCertificateFile = false private var oldVerifyServer = false @@ -95,6 +103,41 @@ class ConfigActivity : AppCompatActivity() { autoStart = binding.AutoStart oldAutoStart = Config.variable("auto_start") autoStart.isChecked = oldAutoStart == "yes" + if (autoStart.isChecked && !isAppearOnTopPermissionGranted(this)) { + Config.replaceVariable("auto_start", "no") + oldAutoStart = "no" + save = true + autoStart.isChecked = false + } + autoStart.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + if (!isAppearOnTopPermissionGranted(this)) { + with( + MaterialAlertDialogBuilder( + this@ConfigActivity, + R.style.AlertDialogTheme + ) + ) { + setTitle(getText(R.string.notice)) + setMessage(getText(R.string.appear_on_top_permission)) + setPositiveButton(getText(R.string.ok)) { dialog, _ -> + dialog.dismiss() + managingOverlayPermission = true + val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) + startActivity(intent) + } + setNegativeButton(getText(R.string.cancel)) { dialog, _ -> + dialog.dismiss() + } + val dialog = this.create() + dialog.setCancelable(false) + dialog.setCanceledOnTouchOutside(false) + dialog.show() + } + autoStart.isChecked = false + } + } + } val pm = getSystemService(Context.POWER_SERVICE) as PowerManager val androidSettingsRequest = registerForActivityResult( @@ -436,6 +479,14 @@ class ConfigActivity : AppCompatActivity() { } + override fun onResume() { + super.onResume() + if (managingOverlayPermission) { + managingOverlayPermission = false + autoStart.isChecked = isAppearOnTopPermissionGranted(this) + } + } + override fun onStart() { super.onStart() requestPermissionLauncher = @@ -636,6 +687,10 @@ class ConfigActivity : AppCompatActivity() { } + private fun isAppearOnTopPermissionGranted(ctx: Context): Boolean { + return Settings.canDrawOverlays(ctx) + } + private fun done() { if (save) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1326cc7b..0f3a0e44 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -306,6 +306,8 @@ Käynnistä automaattisesti Jos merkitty, baresip käynnistyy automaattisesti, kun laite käynnistyy. + Automaattinen käynnistys vaatii "Näytä päällimmäisenä" + käyttöoikeuden. Akun käytön optimointi Ota akun käytön optimointi pois päältä (suositeltu), jos haluat vähentää todennäköisyyttä, että Android rajoittaa baresip-sovelluksen toimintaa diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1eab74fa..17fcbb1d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -288,6 +288,7 @@ Settings Start Automatically If checked, baresip starts automatically after device (re)start. + Automatic start needs Appear on Top permission. Battery Optimizations Disable battery optimizations (recommended) if you want to reduce likelihood that Android restricts baresip\'s access to network or enters baresip