Start Automatically setting now starts the app instead of notifying

This commit is contained in:
Juha Heinanen
2023-11-17 11:51:33 +02:00
parent 3e4d16440c
commit a9ab10682e
4 changed files with 61 additions and 31 deletions

View File

@ -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)
}
}

View File

@ -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)

View File

@ -306,6 +306,8 @@
<string name="start_automatically">Käynnistä automaattisesti</string>
<string name="start_automatically_help">Jos merkitty, baresip
käynnistyy automaattisesti, kun laite käynnistyy.</string>
<string name="appear_on_top_permission">Automaattinen käynnistys vaatii "Näytä päällimmäisenä"
käyttöoikeuden.</string>
<string name="battery_optimizations">Akun käytön optimointi</string>
<string name="battery_optimizations_help">Ota akun käytön optimointi pois päältä (suositeltu),
jos haluat vähentää todennäköisyyttä, että Android rajoittaa baresip-sovelluksen toimintaa

View File

@ -288,6 +288,7 @@
<string name="configuration">Settings</string>
<string name="start_automatically">Start Automatically</string>
<string name="start_automatically_help">If checked, baresip starts automatically after device (re)start.</string>
<string name="appear_on_top_permission">Automatic start needs Appear on Top permission.</string>
<string name="battery_optimizations">Battery Optimizations</string>
<string name="battery_optimizations_help">Disable battery optimizations (recommended) if you want
to reduce likelihood that Android restricts baresip\'s access to network or enters baresip