Mercurial > dwindows
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?, |