From 50601ca31beb321d4d08dfe9bca5458d87e8b563 Mon Sep 17 00:00:00 2001 From: darthpaul Date: Thu, 6 Oct 2022 11:09:45 +0100 Subject: [PATCH] fix crash due to IndexOutOfBounds on the MaterialToggleGroup - this seems like a bug on the MaterialToggleGroup; for example, when 4 items are added to it and removed and later on 3 items added, it will crash - the only feasible fix is to create a new MaterialToggleGroup when displaying the options - calling invalidate, removeAllViews, etc do not work --- .../camera/activities/MainActivity.kt | 44 +++++++++++-------- app/src/main/res/layout/activity_main.xml | 7 +-- app/src/main/res/layout/layout_media_size.xml | 11 ----- 3 files changed, 27 insertions(+), 35 deletions(-) delete mode 100644 app/src/main/res/layout/layout_media_size.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt index fab961dc..7a4a7daa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt @@ -22,6 +22,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions import com.google.android.material.button.MaterialButton +import com.google.android.material.button.MaterialButtonToggleGroup import com.google.android.material.tabs.TabLayout import com.simplemobiletools.camera.BuildConfig import com.simplemobiletools.camera.R @@ -43,7 +44,6 @@ import kotlinx.android.synthetic.main.layout_flash.flash_auto import kotlinx.android.synthetic.main.layout_flash.flash_off import kotlinx.android.synthetic.main.layout_flash.flash_on import kotlinx.android.synthetic.main.layout_flash.flash_toggle_group -import kotlinx.android.synthetic.main.layout_media_size.media_size_toggle_group import kotlinx.android.synthetic.main.layout_top.change_resolution import kotlinx.android.synthetic.main.layout_top.default_icons import kotlinx.android.synthetic.main.layout_top.settings @@ -58,12 +58,12 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera lateinit var mTimerHandler: Handler private lateinit var defaultScene: Scene - private lateinit var mediaSizeScene: Scene private lateinit var flashModeScene: Scene private lateinit var mOrientationEventListener: OrientationEventListener private lateinit var mFocusCircleView: FocusCircleView private lateinit var mCameraImpl: MyCameraImpl private var mPreview: MyPreview? = null + private var mediaSizeToggleGroup: MaterialButtonToggleGroup? = null private var mPreviewUri: Uri? = null private var mIsInPhotoMode = true private var mIsCameraAvailable = false @@ -287,12 +287,17 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } } + private fun createToggleGroup(): MaterialButtonToggleGroup { + return MaterialButtonToggleGroup(this).apply { + isSingleSelection = true + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + private fun initializeCamera() { setContentView(R.layout.activity_main) initButtons() - defaultScene = Scene(top_options, default_icons) - mediaSizeScene = Scene(top_options, media_size_toggle_group) flashModeScene = Scene(top_options, flash_toggle_group) ViewCompat.setOnApplyWindowInsetsListener(view_holder) { _, windowInsets -> @@ -725,13 +730,14 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } private fun closeOptions(): Boolean { - if (media_size_toggle_group.isVisible() || + if (mediaSizeToggleGroup?.isVisible() == true || flash_toggle_group.isVisible() ) { val transitionSet = createTransition() TransitionManager.go(defaultScene, transitionSet) - media_size_toggle_group.beGone() + mediaSizeToggleGroup?.beGone() flash_toggle_group.beGone() + default_icons.beVisible() return true } @@ -752,8 +758,11 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera onSelect: (index: Int, changed: Boolean) -> Unit ) { - media_size_toggle_group.removeAllViews() - media_size_toggle_group.clearChecked() + top_options.removeView(mediaSizeToggleGroup) + val mediaSizeToggleGroup = createToggleGroup().apply { + mediaSizeToggleGroup = this + } + top_options.addView(mediaSizeToggleGroup) val onItemClick = { clickedViewId: Int -> closeOptions() @@ -764,11 +773,17 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera resolutions.map { createButton(it, onItemClick) }.forEach { button -> - media_size_toggle_group.addView(button) + mediaSizeToggleGroup.addView(button) } - media_size_toggle_group.check(selectedResolution.buttonViewId) - showResolutionOptions() + mediaSizeToggleGroup.check(selectedResolution.buttonViewId) + + val transitionSet = createTransition() + val mediaSizeScene = Scene(top_options, mediaSizeToggleGroup) + TransitionManager.go(mediaSizeScene, transitionSet) + default_icons.beGone() + mediaSizeToggleGroup.beVisible() + mediaSizeToggleGroup.children.map { it as MaterialButton }.forEach(::setButtonColors) } private fun createButton(resolutionOption: ResolutionOption, onClick: (clickedViewId: Int) -> Unit): MaterialButton { @@ -786,13 +801,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } } - private fun showResolutionOptions() { - val transitionSet = createTransition() - TransitionManager.go(mediaSizeScene, transitionSet) - media_size_toggle_group.beVisible() - media_size_toggle_group.children.map { it as MaterialButton }.forEach(::setButtonColors) - } - private fun createTransition(): Transition { val fadeTransition = Fade() return TransitionSet().apply { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 72a572f7..11a63854 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -31,12 +31,7 @@ app:layout_constraintTop_toTopOf="parent"> - - - - + diff --git a/app/src/main/res/layout/layout_media_size.xml b/app/src/main/res/layout/layout_media_size.xml deleted file mode 100644 index ba2bacf0..00000000 --- a/app/src/main/res/layout/layout_media_size.xml +++ /dev/null @@ -1,11 +0,0 @@ - -