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