Skip to content

Commit

Permalink
dialog fragment
Browse files Browse the repository at this point in the history
  • Loading branch information
Phong Truong Ho Phong committed Oct 16, 2019
1 parent 0b8bc14 commit bd101ec
Show file tree
Hide file tree
Showing 9 changed files with 244 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package com.example.measurehearthrate.Base

import android.os.Bundle
import android.os.Handler
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.measurehearthrate.View.DialogLoadingFragment

open class BaseActivity : AppCompatActivity() {


protected val TAG = this.javaClass.simpleName

private val mHandler = Handler()

private var mDialogFragment: DialogLoadingFragment?= null

protected fun addFragment(fragment: Fragment, tag: String?, frameId: Int) {
supportFragmentManager.beginTransaction()
.replace(frameId, fragment, tag)
Expand All @@ -23,6 +29,57 @@ open class BaseActivity : AppCompatActivity() {
MyApplication.instance.appComponent.inject(this)
}

fun showLoadingDialog() {
showLoadingDialog(false)
}

fun showLoadingDialog(title: String) {
showLoadingDialog(false,title)
}

private fun showLoadingDialog(cancelable: Boolean, title: String = "") {
Log.d(TAG, "showLoadingDialog: cancelable = $cancelable")
hideLoadingDialog()
mHandler.post(Runnable {
try {
if (isDestroyed || isFinishing) {
Log.d(TAG, "Activity is destroy or finishing, no need to show dialog")
return@Runnable
}

mDialogFragment = DialogLoadingFragment.newInstance(title)
mDialogFragment!!.isCancelable = cancelable
val ft = supportFragmentManager.beginTransaction()
ft.add(mDialogFragment!!, DialogLoadingFragment.TAG)
ft.commitAllowingStateLoss()
} catch (e: Exception) {
Log.d(TAG, "Exception when showing progress dialog=$e")
}
})
}

fun hideLoadingDialog() {
Log.d(TAG, "hideLoadingDialog")
mHandler.post {
try {
if (mDialogFragment == null) {
val foundDialog = supportFragmentManager.findFragmentByTag(DialogLoadingFragment.TAG)

foundDialog?.let {
mDialogFragment = foundDialog as DialogLoadingFragment
}
}
if (mDialogFragment != null) {
Log.d(TAG, "hideLoadingDialog dismissAllowingStateLoss")
mDialogFragment!!.dismissAllowingStateLoss()
mDialogFragment = null
}
} catch (e: Exception) {
Log.d(TAG, "Exception when dismiss progress dialog=$e")
}
}
}

override fun onBackPressed() {
super.onBackPressed()
finish()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.measurehearthrate.Base

import android.util.Log
import androidx.fragment.app.Fragment

open class BaseFragment : Fragment() {
Expand All @@ -15,4 +16,29 @@ open class BaseFragment : Fragment() {
transaction.add(frameId, fragment, tag)
transaction.commitAllowingStateLoss()
}

fun showLoadingDialog() {
Log.d(TAG,"showLoadingDialog")
if(isActive() && activity != null) {
(activity as BaseActivity).showLoadingDialog()
}
}

fun showLoadingDialog(title: String) {
Log.d(TAG,"showLoadingDialog")
if(isActive() && activity != null) {
(activity as BaseActivity).showLoadingDialog(title)
}
}

fun hideLoadingDialog() {
Log.d(TAG,"hideLoadingDialog")
if(activity != null) {
(activity as BaseActivity).hideLoadingDialog()
}
}

companion object {
const val TAG = "BaseFragment"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.measurehearthrate.Helper

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

class DialogHelper {


companion object {

private var mDialogState: MutableLiveData<DialogWrapper> = MutableLiveData()

val dialogState: LiveData<DialogWrapper>
get() = mDialogState

fun emitDialogState(
isshowingDialog: Boolean? = null
) {
val dialogModel = DialogWrapper(isshowingDialog)
mDialogState.postValue(dialogModel)

}

data class DialogWrapper(
var isshowingDialog: Boolean?
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.example.measurehearthrate.View

import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.DialogFragment
import com.example.measurehearthrate.R

class DialogLoadingFragment : DialogFragment() {

private var title = ""

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

Log.d(TAG,"onCreate")
arguments?.let {
title = it.getString(DIALOG_TITLE) ?: ""
}

}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_dialog_loading,container,false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val textView = view.findViewById<TextView>(R.id.tv_title)

if(TextUtils.isEmpty(title)) {
textView.visibility = View.GONE
} else {
textView.visibility = View.VISIBLE
textView.text = title
}

dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

}

companion object {
const val TAG = "DialogLoadingFragment"
const val DIALOG_TITLE = "DIALOG TITLE"

fun newInstance(title: String =""): DialogLoadingFragment {
val fragment = DialogLoadingFragment()
val args = Bundle()
args.putString(DIALOG_TITLE,title)
fragment.arguments = args
return fragment
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.widget.doOnTextChanged
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
Expand Down Expand Up @@ -99,7 +97,7 @@ class SignInFragment : BaseFragment() {
}

private fun viewModelObserve() {
mViewModel.btnLoginState.observe(this, Observer {
mViewModel.loginState.observe(this, Observer {
val btnLoginModel = it ?: return@Observer

mBinding.get()?.ivCheckedEmail?.let {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.example.measurehearthrate.ViewModel

import android.text.TextUtils
import android.widget.Toast
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.example.measurehearthrate.Base.BaseViewModel
import com.example.measurehearthrate.Base.MyApplication
import com.example.measurehearthrate.Helper.DialogHelper
import com.example.measurehearthrate.Helper.ValidationHelper
import com.example.measurehearthrate.Usecase.SigninUsecase
import com.example.measurehearthrate.Utils.CoroutineUsecase
Expand All @@ -20,10 +19,14 @@ class SigninViewModel @Inject constructor() : BaseViewModel() {
private var mEmail: String? = null
private var mPassword: String? = null

private var mBtnLoginState: MutableLiveData<UiBtnLoginWrapper> = MutableLiveData()
private var mLoginState: MutableLiveData<UiLoginWrapper> = MutableLiveData()
//private var mDialogState: MutableLiveData<DialogWrapper> = MutableLiveData()

val btnLoginState: LiveData<UiBtnLoginWrapper>
get() = mBtnLoginState
val loginState: LiveData<UiLoginWrapper>
get() = mLoginState

// val dialogState: LiveData<DialogWrapper>
// get() = mDialogState

override fun start() {
}
Expand All @@ -32,26 +35,28 @@ class SigninViewModel @Inject constructor() : BaseViewModel() {
mEmail = email
mPassword = pass

DialogHelper.emitDialogState(true)
mSigninUsecase.executeUsecase(SigninUsecase.RequestValue(email, pass),
object : CoroutineUsecase.UseCaseCallBack<SigninUsecase.ResponseValue, SigninUsecase.ErrorValue> {
override fun onSuccess(responseValue: SigninUsecase.ResponseValue) {
emitLoginState(true, false, false)
DialogHelper.emitDialogState(false)
emitLoginState(true, false, false)
}

override fun onError(errorValue: SigninUsecase.ErrorValue) {
DialogHelper.emitDialogState(false)
when (errorValue.errorCode) {
ResponseCode.ERROR_PASSWORD -> {
emitLoginState(false, true, true,false,true)
emitLoginState(false, true, true, false, true)
}
ResponseCode.WRONG_EMAIL -> {
emitLoginState(false, true, true,true)
emitLoginState(false, true, true, true)

}
}
}

})
//emitLoginState(true,true)
}

fun onEmailTextChanged(email: String) {
Expand Down Expand Up @@ -81,27 +86,29 @@ class SigninViewModel @Inject constructor() : BaseViewModel() {
val isEmailValid = ValidationHelper.isEmailValid(mEmail!!)

if (isEmailPassEmpty && isEmailValid) {
emitLoginState(null,true, true)
emitLoginState(null, true, true)
}
}


private fun emitLoginState(
isLoginSuccess: Boolean ?= null,
isLoginSuccess: Boolean? = null,
enableEmailCheck: Boolean = false,
enableBtnLogin: Boolean = false,
wrongEmail: Boolean = false,
wrongPassword: Boolean = false
) {
val uiBtnLoginModel = UiBtnLoginWrapper(isLoginSuccess, enableEmailCheck, enableBtnLogin,wrongEmail,wrongPassword)
mBtnLoginState.postValue(uiBtnLoginModel)
val uiLoginModel = UiLoginWrapper(isLoginSuccess, enableEmailCheck, enableBtnLogin, wrongEmail, wrongPassword)
mLoginState.postValue(uiLoginModel)
}

data class UiBtnLoginWrapper(
data class UiLoginWrapper(
var isLoginSuccess: Boolean?,
var enableChecked: Boolean,
var isEnable: Boolean,
var wrongEmail: Boolean,
var wrongPassword: Boolean
)


}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions SOURCE/app/src/main/res/drawable/loading_progress.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:pivotX="50%"
android:pivotY="50%">

<bitmap
android:src="@drawable/ic_dialog_loading"
android:tint="@color/primaryColor" />

</animated-rotate>
40 changes: 40 additions & 0 deletions SOURCE/app/src/main/res/layout/fragment_dialog_loading.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp152"
app:cardCornerRadius="@dimen/dp10">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="@dimen/dp30"
android:layout_height="@dimen/dp30"
android:layout_margin="@dimen/dp30"
android:indeterminate="true"
android:indeterminateDrawable="@drawable/loading_progress"
app:layout_constraintBottom_toTopOf="@id/tv_title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp50"
android:layout_marginEnd="@dimen/dp50"
android:layout_marginBottom="@dimen/dp30"
android:gravity="center_horizontal"
android:textColor="@color/primaryColor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/progress_bar"
app:layout_constraintVertical_chainStyle="packed" />
</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

0 comments on commit bd101ec

Please sign in to comment.