tried to make it possible to answer incoming call even when screen is locked

This commit is contained in:
Juha Heinanen
2018-05-30 10:40:11 +03:00
parent d6ddbdc771
commit d3cab28eaf
2 changed files with 38 additions and 23 deletions
+3 -2
View File
@@ -9,6 +9,7 @@
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CALL_PHONE" />
<uses-feature <uses-feature
@@ -42,8 +43,8 @@
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity android:name=".MainActivity" <activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"> android:configChanges="orientation|keyboardHidden|screenSize"
<!-- android:screenOrientation="portrait"> --> android:launchMode="singleTask" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@@ -22,6 +22,7 @@ import android.util.Log
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.media.AudioManager import android.media.AudioManager
import android.net.NetworkInfo import android.net.NetworkInfo
import android.os.PowerManager
import android.support.v7.app.NotificationCompat import android.support.v7.app.NotificationCompat
import android.support.v7.view.menu.ActionMenuItemView import android.support.v7.view.menu.ActionMenuItemView
import android.text.Editable import android.text.Editable
@@ -47,6 +48,8 @@ class MainActivity : AppCompatActivity() {
internal lateinit var am: AudioManager internal lateinit var am: AudioManager
internal lateinit var imm: InputMethodManager internal lateinit var imm: InputMethodManager
internal lateinit var nm: NotificationManager internal lateinit var nm: NotificationManager
internal lateinit var pm: PowerManager
internal lateinit var wl: PowerManager.WakeLock
internal lateinit var nb: NotificationCompat.Builder internal lateinit var nb: NotificationCompat.Builder
internal lateinit var receiver: BroadcastReceiver internal lateinit var receiver: BroadcastReceiver
@@ -68,6 +71,13 @@ class MainActivity : AppCompatActivity() {
am = getSystemService(Context.AUDIO_SERVICE) as AudioManager am = getSystemService(Context.AUDIO_SERVICE) as AudioManager
imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
pm = getSystemService(Context.POWER_SERVICE) as PowerManager
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or
PowerManager.ACQUIRE_CAUSES_WAKEUP, "")
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
nb = NotificationCompat.Builder(this) nb = NotificationCompat.Builder(this)
nb.setVisibility(VISIBILITY_PUBLIC).setOngoing(true).setSmallIcon(R.drawable.ic_stat) nb.setVisibility(VISIBILITY_PUBLIC).setOngoing(true).setSmallIcon(R.drawable.ic_stat)
@@ -86,8 +96,6 @@ class MainActivity : AppCompatActivity() {
val intentExtras = intent.extras val intentExtras = intent.extras
val info = intentExtras.getParcelable<NetworkInfo>("networkInfo") val info = intentExtras.getParcelable<NetworkInfo>("networkInfo")
Log.d("Baresip", "Got event $info") Log.d("Baresip", "Got event $info")
//if (running && (info.state == NetworkInfo.State.CONNECTED)) {
// Log.d("Baresip", "Registering upon CONNECTED event")
if (running) UserAgent.register(uas) if (running) UserAgent.register(uas)
} }
} }
@@ -698,7 +706,7 @@ class MainActivity : AppCompatActivity() {
fun updateNotification() { fun updateNotification() {
val contentView = RemoteViews(getPackageName(), R.layout.notification) val contentView = RemoteViews(getPackageName(), R.layout.notification)
for (i: Int in 0 .. 5) { for (i: Int in 0 .. 5) {
val resID = resources.getIdentifier("status$i", "id", packageName); val resID = resources.getIdentifier("status$i", "id", packageName)
if (i < images.size) { if (i < images.size) {
contentView.setImageViewResource(resID, images[i]) contentView.setImageViewResource(resID, images[i])
contentView.setViewVisibility(resID, View.VISIBLE) contentView.setViewVisibility(resID, View.VISIBLE)
@@ -710,7 +718,7 @@ class MainActivity : AppCompatActivity() {
contentView.setViewVisibility(R.id.etc, View.VISIBLE) contentView.setViewVisibility(R.id.etc, View.VISIBLE)
else else
contentView.setViewVisibility(R.id.etc, View.INVISIBLE) contentView.setViewVisibility(R.id.etc, View.INVISIBLE)
nb.setContent(contentView); nb.setContent(contentView)
nm.notify(NOTIFICATION_ID, nb.build()) nm.notify(NOTIFICATION_ID, nb.build())
} }
@@ -763,6 +771,27 @@ class MainActivity : AppCompatActivity() {
} }
"call ringing" -> { "call ringing" -> {
} }
"call incoming" -> {
if (!pm.isInteractive) {
Log.d("Baresip", "Acquiring wake lock")
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or
PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag")
wl.acquire()
}
val peer_uri = call_peeruri(callp)
Log.d("Baresip", "Incoming call $uap/$callp/$peer_uri")
val new_call = Call(callp, ua, peer_uri, "in", "Answer", null)
this@MainActivity.runOnUiThread {
calls.add(new_call)
if (ua != uas[aorSpinner.selectedItemPosition])
aorSpinner.setSelection(UserAgent.findAorIndex(uas, aor)!!)
addCallViews(ua, new_call, Call.calls(calls, "in").size * 10)
am.mode = AudioManager.MODE_RINGTONE
}
val i = Intent(this, MainActivity::class.java)
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
startActivity(i)
}
"call established" -> { "call established" -> {
val call = Call.find(calls, callp) val call = Call.find(calls, callp)
if (call == null) { if (call == null) {
@@ -818,6 +847,7 @@ class MainActivity : AppCompatActivity() {
} }
history.add(History(aor, call.peerURI, "in", true)) history.add(History(aor, call.peerURI, "in", true))
call.hasHistory = true call.hasHistory = true
if (wl.isHeld) wl.release()
} }
am.mode = AudioManager.MODE_IN_COMMUNICATION am.mode = AudioManager.MODE_IN_COMMUNICATION
am.isSpeakerphoneOn = false am.isSpeakerphoneOn = false
@@ -827,23 +857,6 @@ class MainActivity : AppCompatActivity() {
if (History.aorHistory(history, aor) > HISTORY_SIZE) if (History.aorHistory(history, aor) > HISTORY_SIZE)
History.aorRemoveHistory(history, aor) History.aorRemoveHistory(history, aor)
} }
"call incoming" -> {
val peer_uri = call_peeruri(callp)
Log.d("Baresip", "Incoming call $uap/$callp/$peer_uri")
val new_call = Call(callp, ua, peer_uri, "in", "Answer", null)
this@MainActivity.runOnUiThread {
calls.add(new_call)
if (ua == uas[aorSpinner.selectedItemPosition]) {
addCallViews(ua, new_call, Call.calls(calls, "in").size * 10)
} else {
aorSpinner.setSelection(UserAgent.findAorIndex(uas, aor)!!)
}
am.mode = AudioManager.MODE_RINGTONE
}
val i = Intent(this, MainActivity::class.java)
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
startActivity(i);
}
"call verify" -> { "call verify" -> {
val call = Call.find(calls, callp) val call = Call.find(calls, callp)
if (call == null) { if (call == null) {
@@ -989,6 +1002,7 @@ class MainActivity : AppCompatActivity() {
false)) false))
} }
} }
if (wl.isHeld) wl.release()
if (calls.size == 0) am.mode = AudioManager.MODE_NORMAL if (calls.size == 0) am.mode = AudioManager.MODE_NORMAL
} }
else -> Log.d("Baresip", "Unknown event '${ev[0]}'") else -> Log.d("Baresip", "Unknown event '${ev[0]}'")