comparison android/DWindows.kt @ 2555:d7d163d70763

Android: Initial implementations of DWContainerModel and DWContainerAdapter. These will be the basis for our custom ListView based Container widget.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 16 May 2021 19:39:34 +0000
parents 4c75fb6089a9
children d2d8c66ad062
comparison
equal deleted inserted replaced
2554:4c75fb6089a9 2555:d7d163d70763
9 import android.content.ClipboardManager 9 import android.content.ClipboardManager
10 import android.content.Context 10 import android.content.Context
11 import android.content.DialogInterface 11 import android.content.DialogInterface
12 import android.content.pm.ActivityInfo 12 import android.content.pm.ActivityInfo
13 import android.content.res.Configuration 13 import android.content.res.Configuration
14 import android.content.res.Resources
14 import android.graphics.* 15 import android.graphics.*
15 import android.graphics.drawable.BitmapDrawable 16 import android.graphics.drawable.BitmapDrawable
16 import android.graphics.drawable.Drawable 17 import android.graphics.drawable.Drawable
17 import android.graphics.drawable.GradientDrawable 18 import android.graphics.drawable.GradientDrawable
18 import android.media.AudioManager 19 import android.media.AudioManager
26 import android.util.Log 27 import android.util.Log
27 import android.util.SparseBooleanArray 28 import android.util.SparseBooleanArray
28 import android.util.TypedValue 29 import android.util.TypedValue
29 import android.view.* 30 import android.view.*
30 import android.view.View.OnTouchListener 31 import android.view.View.OnTouchListener
32 import android.view.ViewGroup
31 import android.view.inputmethod.EditorInfo 33 import android.view.inputmethod.EditorInfo
32 import android.webkit.WebView 34 import android.webkit.WebView
33 import android.webkit.WebViewClient 35 import android.webkit.WebViewClient
34 import android.widget.* 36 import android.widget.*
35 import android.widget.AdapterView.OnItemClickListener 37 import android.widget.AdapterView.OnItemClickListener
36 import android.widget.SeekBar.OnSeekBarChangeListener 38 import android.widget.SeekBar.OnSeekBarChangeListener
37 import androidx.annotation.RequiresApi
38 import androidx.appcompat.app.AlertDialog 39 import androidx.appcompat.app.AlertDialog
39 import androidx.appcompat.app.AppCompatActivity 40 import androidx.appcompat.app.AppCompatActivity
40 import androidx.appcompat.widget.AppCompatEditText 41 import androidx.appcompat.widget.AppCompatEditText
41 import androidx.collection.SimpleArrayMap 42 import androidx.collection.SimpleArrayMap
43 import androidx.constraintlayout.widget.ConstraintLayout
44 import androidx.constraintlayout.widget.ConstraintSet
42 import androidx.core.app.NotificationCompat 45 import androidx.core.app.NotificationCompat
43 import androidx.core.app.NotificationManagerCompat 46 import androidx.core.app.NotificationManagerCompat
44 import androidx.core.content.res.ResourcesCompat 47 import androidx.core.content.res.ResourcesCompat
45 import androidx.core.view.MenuCompat 48 import androidx.core.view.MenuCompat
46 import androidx.recyclerview.widget.RecyclerView 49 import androidx.recyclerview.widget.RecyclerView
454 } 457 }
455 } 458 }
456 } 459 }
457 460
458 external fun eventHandlerSimple(item: DWMenuItem, message: Int) 461 external fun eventHandlerSimple(item: DWMenuItem, message: Int)
462 }
463
464 // Class for storing container data
465 class DWContainerModel {
466 var columns = mutableListOf<String?>()
467 var types = mutableListOf<Int>()
468 var data = mutableListOf<Any?>()
469
470 fun numberOfColumns(): Int
471 {
472 return columns.size
473 }
474
475 fun numberOfRows(): Int
476 {
477 return data.size / columns.size
478 }
479
480 fun getColumnType(column: Int): Int
481 {
482 if(column < types.size) {
483 return types[column]
484 }
485 return -1
486 }
487
488 fun getRowAndColumn(row: Int, column: Int): Any?
489 {
490 var index: Int = (row * columns.size) + column
491
492 if(index > -1 && index < data.size) {
493 return data[index]
494 }
495 return null
496 }
497
498 fun setRowAndColumn(row: Int, column: Int, obj: Any?)
499 {
500 var index: Int = (row * columns.size) + column
501
502 if(index > -1 && index < data.size && column < types.size) {
503 // Verify the data matches the column type
504 if((((types[column] and 1) != 0) && (obj is Drawable)) ||
505 (((types[column] and (1 shl 1)) != 0) && (obj is String)) ||
506 (((types[column] and (1 shl 2)) != 0) && (obj is Int))) {
507 data[index] = obj
508 }
509 }
510 }
511
512 fun addColumn(title: String?, type: Int)
513 {
514 columns.add(title)
515 types.add(type)
516 // If we change the columns we have to invalidate the data
517 data.clear()
518 }
519
520 fun addRows(count: Int)
521 {
522 for(i in 0 until (count * columns.size))
523 {
524 // Fill in with nulls to be set later
525 data.add(null)
526 }
527 }
528
529 fun clear()
530 {
531 data.clear()
532 }
533 }
534
535 class DWContainerAdapter(c: Context) : BaseAdapter()
536 {
537 private var context = c
538 var model = DWContainerModel()
539
540 override fun getCount(): Int {
541 val count = model.numberOfRows()
542 if(count > 0) {
543 return count
544 }
545 return 1
546 }
547
548 override fun getItem(position: Int): Any? {
549 return model.getRowAndColumn(position, 1)
550 }
551
552 override fun getItemId(position: Int): Long {
553 return position.toLong()
554 }
555
556 override fun getView(position: Int, view: View?, parent: ViewGroup): View {
557 val rowView = ConstraintLayout(context)
558 val set = ConstraintSet()
559
560 // Every container at least has an icon and text
561 val imageview = ImageView(context)
562 val textview = TextView(context)
563
564 if(model.numberOfColumns() > 1 && model.numberOfRows() > position) {
565 val first = model.getRowAndColumn(position, 0)
566 val second = model.getRowAndColumn(position, 1)
567
568 if(first is Drawable) {
569 imageview.setImageDrawable(first)
570 }
571 if(second is String) {
572 textview.text = second
573 }
574 }
575
576 // Add the two main components to the layout
577 imageview.id = View.generateViewId()
578 textview.id = View.generateViewId()
579 rowView.addView(imageview)
580 rowView.addView(textview)
581 set.clone(rowView)
582 set.connect(imageview.id, ConstraintSet.LEFT, textview.id, ConstraintSet.RIGHT)
583 set.applyTo(rowView)
584
585 return rowView
586 }
459 } 587 }
460 588
461 class DWindows : AppCompatActivity() { 589 class DWindows : AppCompatActivity() {
462 var firstWindow: Boolean = true 590 var firstWindow: Boolean = true
463 var windowLayout: LinearLayout? = null 591 var windowLayout: LinearLayout? = null