Skip to content

Commit

Permalink
Fixed bottom fragments crashing after more than one show()
Browse files Browse the repository at this point in the history
  • Loading branch information
roeiedri committed Mar 28, 2021
1 parent eae4e7e commit 90269b0
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 38 deletions.
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ android {
compileSdkVersion 29

defaultConfig {
applicationId "com.chooloo.www.callmanager"
applicationId "com.chooloo.www.koler"
minSdkVersion 25
targetSdkVersion 30
versionCode 46
versionName "v0.6.2"
versionCode 50
versionName "v1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

javaCompileOptions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ class BottomFragment<FragmentType : Fragment>(
override fun finish() {
dismiss()
}

override fun dismiss() {
super.dismiss()
}
//endregion

//region permissions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ class DialpadFragment : BaseFragment(), DialpadContract.View {
keyStar.setOnLongClickListener(it)
}
}

_searchViewModel.number.observe(viewLifecycleOwner) { number ->
number?.let { _presenter.onTextChanged(it) }
}
}

override fun onDestroy() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,12 @@ class DialpadPresenter<V : DialpadContract.View> : BasePresenter<V>(),
}

override fun onTextChanged(text: String) {
if (mvpView?.isDialer == true) {
mvpView?.isDeleteButtonVisible = text.isNotEmpty()
mvpView?.isAddContactButtonVisible = text.isNotEmpty()
mvpView?.setViewModelNumber(text)
mvpView?.apply {
if (isDialer) {
isDeleteButtonVisible = text.isNotEmpty()
isAddContactButtonVisible = text.isNotEmpty()
setViewModelNumber(text)
}
}
}
}
37 changes: 13 additions & 24 deletions app/src/main/java/com/chooloo/www/koler/ui/main/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package com.chooloo.www.koler.ui.main

import android.content.Context
import android.content.Intent
import android.graphics.Rect
import android.os.Bundle
import android.view.MotionEvent
import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.lifecycle.ViewModelProvider
import androidx.viewpager2.widget.ViewPager2
import com.chooloo.www.koler.R
Expand All @@ -17,23 +13,21 @@ import com.chooloo.www.koler.databinding.ActivityMainBinding
import com.chooloo.www.koler.ui.base.BaseActivity
import com.chooloo.www.koler.ui.base.BottomFragment
import com.chooloo.www.koler.ui.dialpad.DialpadFragment
import com.chooloo.www.koler.ui.menu.MenuFragment
import com.chooloo.www.koler.ui.settings.SettingsFragment
import com.chooloo.www.koler.util.ignoreEditTextFocus
import com.chooloo.www.koler.util.permissions.checkDefaultDialer
import com.chooloo.www.koler.viewmodel.SearchViewModel

// TODO implement FAB Coordination
class MainActivity : BaseActivity(), MainContract.View {
private val _presenter by lazy { MainPresenter<MainContract.View>() }
private val _binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
private val _bottomSettingsFragment by lazy { BottomFragment(SettingsFragment.newInstance()) }
private val _bottomDialpadFragment by lazy { BottomFragment(DialpadFragment.newInstance(true)) }
private val _searchViewModel by lazy { ViewModelProvider(this).get(SearchViewModel::class.java) }

override var dialpadNumber: String
get() = _bottomDialpadFragment.fragment.number
get() = _searchViewModel.number.value.toString()
set(value) {
_bottomDialpadFragment.fragment.number = value
_searchViewModel.number.value = value
}

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -47,18 +41,7 @@ class MainActivity : BaseActivity(), MainContract.View {
}

override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is EditText) {
val outRect = Rect()
v.getGlobalVisibleRect(outRect)
if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
v.clearFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.getWindowToken(), 0)
}
}
}
ignoreEditTextFocus(event)
return super.dispatchTouchEvent(event)
}

Expand Down Expand Up @@ -98,11 +81,17 @@ class MainActivity : BaseActivity(), MainContract.View {
}

override fun openDialpad() {
_bottomDialpadFragment.show(supportFragmentManager, DialpadFragment.TAG)
BottomFragment(DialpadFragment.newInstance(true)).show(
supportFragmentManager,
DialpadFragment.TAG
)
}

override fun openMenu() {
_bottomSettingsFragment.show(supportFragmentManager, MenuFragment.TAG)
override fun openSettings() {
BottomFragment(SettingsFragment.newInstance()).show(
supportFragmentManager,
SettingsFragment.TAG
)
}

override fun updateSearchViewModelText(text: String?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ interface MainContract : BaseContract {
interface View : BaseContract.View {
var dialpadNumber: String

fun openMenu()
fun openSettings()
fun openDialpad()
fun updateSearchViewModelText(text: String?)
fun checkIntent()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.chooloo.www.koler.ui.main

import android.content.Intent
import android.view.MenuItem
import com.chooloo.www.koler.R
import com.chooloo.www.koler.ui.base.BasePresenter
import java.io.UnsupportedEncodingException
import java.net.URLDecoder
Expand All @@ -13,7 +11,7 @@ class MainPresenter<V : MainContract.View> : BasePresenter<V>(), MainContract.Pr
}

override fun onMenuClick() {
mvpView?.openMenu()
mvpView?.openSettings()
}

override fun onViewIntent(intent: Intent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsContract.View {
private val _kolerPreferences by lazy { context?.let { KolerPreferences(it) } }

companion object {
const val TAG = "settings_fragment"

fun newInstance() = SettingsFragment()
}

Expand Down
11 changes: 9 additions & 2 deletions app/src/main/java/com/chooloo/www/koler/ui/widgets/IconButton.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.content.Context
import android.content.res.ColorStateList
import android.util.AttributeSet
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat.getColor
import androidx.core.content.ContextCompat.getDrawable
import com.chooloo.www.koler.R
import com.chooloo.www.koler.util.getAttrColor
Expand All @@ -15,6 +16,8 @@ class IconButton : FloatingActionButton {
@DrawableRes private var _iconDefault: Int? = null
@DrawableRes private var _iconOnClick: Int? = null

private val colorOnSecondary by lazy { context.getAttrColor(R.attr.colorOnSecondary) }

constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(
Expand All @@ -29,8 +32,12 @@ class IconButton : FloatingActionButton {

elevation = 0f
compatElevation = 0f
imageTintList = imageTintList
?: ColorStateList.valueOf(context.getAttrColor(R.attr.colorOnSecondary))

imageTintList = if (isEnabled) {
imageTintList ?: ColorStateList.valueOf(colorOnSecondary)
} else {
ColorStateList.valueOf(getColor(context, android.R.color.darker_gray))
}

setImageDrawable(_iconDefault?.let { getDrawable(context, it) })
setOnClickListener {}
Expand Down
21 changes: 20 additions & 1 deletion app/src/main/java/com/chooloo/www/koler/util/ScreenUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ package com.chooloo.www.koler.util
import android.app.Activity
import android.app.KeyguardManager
import android.content.Context
import android.graphics.Rect
import android.os.Build
import android.os.PowerManager
import android.view.MotionEvent
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity


Expand All @@ -29,6 +33,21 @@ fun Activity.disableKeyboard() {
}
}

fun Activity.ignoreEditTextFocus(event: MotionEvent) {
if (event.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is EditText) {
val outRect = Rect()
v.getGlobalVisibleRect(outRect)
if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
v.clearFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.getWindowToken(), 0)
}
}
}
}

class ProximitySensor(
activity: Activity
) {
Expand All @@ -51,4 +70,4 @@ class ProximitySensor(
_wakeLock.release()
}
}
}
}

0 comments on commit 90269b0

Please sign in to comment.