comparison android/DWindows.kt @ 2522:66c490aa719d

Android: Implement notifications, images on notifications incomplete. Also detect the Android application ID, and generate one if not set or detected. Also store the path as the application directory.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 09 May 2021 19:27:23 +0000
parents 5f92284e2b08
children 82cdb3ad7c25
comparison
equal deleted inserted replaced
2521:5f92284e2b08 2522:66c490aa719d
1 package org.dbsoft.dwindows 1 package org.dbsoft.dwindows
2 2
3 import android.R.attr 3 import android.R.attr
4 import android.app.NotificationChannel
5 import android.app.NotificationManager
4 import android.content.ClipData 6 import android.content.ClipData
5 import android.content.ClipboardManager 7 import android.content.ClipboardManager
6 import android.content.Context 8 import android.content.Context
7 import android.content.DialogInterface 9 import android.content.DialogInterface
8 import android.content.pm.ActivityInfo 10 import android.content.pm.ActivityInfo
10 import android.graphics.Bitmap 12 import android.graphics.Bitmap
11 import android.graphics.BitmapFactory 13 import android.graphics.BitmapFactory
12 import android.graphics.drawable.GradientDrawable 14 import android.graphics.drawable.GradientDrawable
13 import android.media.AudioManager 15 import android.media.AudioManager
14 import android.media.ToneGenerator 16 import android.media.ToneGenerator
15 import android.os.Bundle 17 import android.os.*
16 import android.os.Handler
17 import android.os.Looper
18 import android.os.MessageQueue
19 import android.text.InputFilter 18 import android.text.InputFilter
20 import android.text.InputFilter.LengthFilter 19 import android.text.InputFilter.LengthFilter
21 import android.text.InputType 20 import android.text.InputType
22 import android.text.method.PasswordTransformationMethod 21 import android.text.method.PasswordTransformationMethod
23 import android.util.Base64 22 import android.util.Base64
36 import android.widget.SeekBar.OnSeekBarChangeListener 35 import android.widget.SeekBar.OnSeekBarChangeListener
37 import androidx.appcompat.app.AlertDialog 36 import androidx.appcompat.app.AlertDialog
38 import androidx.appcompat.app.AppCompatActivity 37 import androidx.appcompat.app.AppCompatActivity
39 import androidx.appcompat.widget.AppCompatEditText 38 import androidx.appcompat.widget.AppCompatEditText
40 import androidx.collection.SimpleArrayMap 39 import androidx.collection.SimpleArrayMap
40 import androidx.core.app.NotificationCompat
41 import androidx.core.app.NotificationManagerCompat
41 import androidx.recyclerview.widget.RecyclerView 42 import androidx.recyclerview.widget.RecyclerView
42 import androidx.viewpager2.widget.ViewPager2 43 import androidx.viewpager2.widget.ViewPager2
43 import com.google.android.material.tabs.TabLayout 44 import com.google.android.material.tabs.TabLayout
44 import com.google.android.material.tabs.TabLayout.OnTabSelectedListener 45 import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
45 import com.google.android.material.tabs.TabLayoutMediator 46 import com.google.android.material.tabs.TabLayoutMediator
238 class DWindows : AppCompatActivity() { 239 class DWindows : AppCompatActivity() {
239 var firstWindow: Boolean = true 240 var firstWindow: Boolean = true
240 var windowLayout: LinearLayout? = null 241 var windowLayout: LinearLayout? = null
241 var threadLock = ReentrantLock() 242 var threadLock = ReentrantLock()
242 var threadCond = threadLock.newCondition() 243 var threadCond = threadLock.newCondition()
244 var notificationID: Int = 0
243 245
244 // Our version of runOnUiThread that waits for execution 246 // Our version of runOnUiThread that waits for execution
245 fun waitOnUiThread(runnable: Runnable) 247 fun waitOnUiThread(runnable: Runnable)
246 { 248 {
247 if(Looper.myLooper() == Looper.getMainLooper()) { 249 if(Looper.myLooper() == Looper.getMainLooper()) {
277 val p = m.getPackageInfo(s!!, 0) 279 val p = m.getPackageInfo(s!!, 0)
278 s = p.applicationInfo.dataDir 280 s = p.applicationInfo.dataDir
279 281
280 // Initialize the Dynamic Windows code... 282 // Initialize the Dynamic Windows code...
281 // This will start a new thread that calls the app's dwmain() 283 // This will start a new thread that calls the app's dwmain()
282 dwindowsInit(s) 284 dwindowsInit(s, this.getPackageName())
283 } 285 }
284 286
285 override fun onConfigurationChanged(newConfig: Configuration) { 287 override fun onConfigurationChanged(newConfig: Configuration) {
286 super.onConfigurationChanged(newConfig) 288 super.onConfigurationChanged(newConfig)
287 289
1623 waitOnUiThread { 1625 waitOnUiThread {
1624 this.finishAffinity() 1626 this.finishAffinity()
1625 } 1627 }
1626 } 1628 }
1627 1629
1630 fun dwInit(appid: String, appname: String)
1631 {
1632 waitOnUiThread {
1633 // Create the notification channel in dw_init()
1634 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
1635 // Create the NotificationChannel
1636 val importance = NotificationManager.IMPORTANCE_DEFAULT
1637 val mChannel = NotificationChannel(appid, appname, importance)
1638 // Register the channel with the system; you can't change the importance
1639 // or other notification behaviors after this
1640 val notificationManager =
1641 getSystemService(NOTIFICATION_SERVICE) as NotificationManager
1642 notificationManager.createNotificationChannel(mChannel)
1643 }
1644 }
1645 }
1646
1647 fun notificationNew(title: String, imagepath: String, text: String, appid: String): NotificationCompat.Builder?
1648 {
1649 var builder: NotificationCompat.Builder? = null
1650
1651 waitOnUiThread {
1652 builder = NotificationCompat.Builder(this, appid)
1653 .setContentTitle(title)
1654 .setContentText(text)
1655 .setPriority(NotificationCompat.PRIORITY_DEFAULT)
1656 }
1657 return builder
1658 }
1659
1660 fun notificationSend(builder: NotificationCompat.Builder)
1661 {
1662 waitOnUiThread {
1663 notificationID += 1
1664 with(NotificationManagerCompat.from(this)) {
1665 // notificationId is a unique int for each notification that you must define
1666 notify(notificationID, builder.build())
1667 }
1668 }
1669 }
1670
1628 /* 1671 /*
1629 * Native methods that are implemented by the 'dwindows' native library, 1672 * Native methods that are implemented by the 'dwindows' native library,
1630 * which is packaged with this application. 1673 * which is packaged with this application.
1631 */ 1674 */
1632 external fun dwindowsInit(dataDir: String) 1675 external fun dwindowsInit(dataDir: String, appid: String)
1633 external fun eventHandler( 1676 external fun eventHandler(
1634 obj1: View?, 1677 obj1: View?,
1635 obj2: View?, 1678 obj2: View?,
1636 message: Int, 1679 message: Int,
1637 str1: String?, 1680 str1: String?,