Quellcode durchsuchen

add increasing effect for new showInfo/Error windows BaseFragment

MrOzOn vor 5 Jahren
Ursprung
Commit
cbc4f6bb34

+ 1 - 0
utils/build.gradle

@@ -42,6 +42,7 @@ dependencies {
     implementation navigationUi
     implementation timber
     implementation retrofit
+    implementation constraintlayout
     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
 
 

+ 6 - 31
utils/src/main/java/com/mrozon/utils/base/BaseFragment.kt

@@ -1,22 +1,14 @@
 package com.mrozon.utils.base
 
-import android.graphics.Color
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import android.view.ViewTreeObserver
-import android.view.InflateException
 import androidx.annotation.LayoutRes
-import androidx.core.content.ContextCompat.getColor
 import androidx.databinding.DataBindingUtil
 import androidx.databinding.ViewDataBinding
 import androidx.fragment.app.Fragment
-import androidx.navigation.Navigation.findNavController
-import androidx.navigation.fragment.NavHostFragment
 import com.google.android.material.snackbar.Snackbar
-import com.mrozon.utils.R
-import timber.log.Timber
 
 abstract class BaseFragment<T : ViewDataBinding>: Fragment()//,
 {
@@ -60,35 +52,18 @@ abstract class BaseFragment<T : ViewDataBinding>: Fragment()//,
     }
 
     fun showError(message: String, action:()->Unit) {
-        val snackbar = Snackbar.make(binding?.root!!,message,Snackbar.LENGTH_INDEFINITE)
-        snackbar.view.setBackgroundColor(getColor(requireContext(),R.color.color_snack_error))
-        snackbar.setActionTextColor(Color.WHITE)
-        snackbar.setAction(R.string.Ok) {
-            snackbar.dismiss()
-            action()
-        }
-        snackbar.show()
+        MyInfoDialog.newInstance(MyInfoDialogType.ERROR,message, action)
+            .show(requireActivity().supportFragmentManager, MyInfoDialog.TAG)
     }
 
     fun showError(message: String) {
-        val snackbar = Snackbar.make(binding?.root!!,message,Snackbar.LENGTH_INDEFINITE)
-        snackbar.view.setBackgroundColor(getColor(requireContext(),R.color.color_snack_error))
-        snackbar.setActionTextColor(Color.WHITE)
-        snackbar.setAction(R.string.Ok) {
-            snackbar.dismiss()
-        }
-        snackbar.show()
+        MyInfoDialog.newInstance(MyInfoDialogType.ERROR,message)
+            .show(requireActivity().supportFragmentManager, MyInfoDialog.TAG)
     }
 
     fun showInfo(message: String, action:()->Unit) {
-        val snackbar = Snackbar.make(binding?.root!!,message,Snackbar.LENGTH_INDEFINITE)
-        snackbar.view.setBackgroundColor(getColor(requireContext(),R.color.color_snack_info))
-        snackbar.setActionTextColor(Color.WHITE)
-        snackbar.setAction(R.string.Ok) {
-            snackbar.dismiss()
-            action()
-        }
-        snackbar.show()
+        MyInfoDialog.newInstance(MyInfoDialogType.INFO,message, action)
+            .show(requireActivity().supportFragmentManager, MyInfoDialog.TAG)
     }
 
     fun show(message: String) {

+ 100 - 0
utils/src/main/java/com/mrozon/utils/base/MyInfoDialog.kt

@@ -0,0 +1,100 @@
+package com.mrozon.utils.base
+
+import android.animation.ObjectAnimator
+import android.animation.PropertyValuesHolder
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.WindowManager
+import androidx.fragment.app.DialogFragment
+import com.mrozon.utils.R
+import kotlinx.android.synthetic.main.fragment_my_info_dialog.*
+
+class MyInfoDialog: DialogFragment() {
+
+    companion object {
+
+        private var action: () -> Unit = {}
+        const val TAG = "MyInfoDialog"
+
+        private const val KEY_TYPE = "KEY_TYPE"
+        private const val KEY_MESSAGE = "KEY_MESSAGE"
+
+        fun newInstance(type: MyInfoDialogType, message: String, action:()->Unit): MyInfoDialog {
+            val args = Bundle()
+            args.putInt(KEY_TYPE, type.ordinal)
+            args.putString(KEY_MESSAGE, message)
+            this.action = action
+            val fragment = MyInfoDialog()
+            fragment.arguments = args
+            return fragment
+        }
+
+        fun newInstance(type: MyInfoDialogType, message: String): MyInfoDialog {
+            val args = Bundle()
+            args.putInt(KEY_TYPE, type.ordinal)
+            args.putString(KEY_MESSAGE, message)
+            val fragment = MyInfoDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_my_info_dialog, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        setupView()
+        setupClickListeners()
+    }
+
+    override fun onStart() {
+        super.onStart()
+        dialog?.window?.setLayout(
+            WindowManager.LayoutParams.MATCH_PARENT,
+            WindowManager.LayoutParams.WRAP_CONTENT
+        )
+        dialog?.setCanceledOnTouchOutside(false)
+        val decorView = dialog?.window?.decorView
+        val scaleDown: ObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(
+            decorView,
+            PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
+            PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
+            PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f)
+        )
+        scaleDown.duration = 400
+        scaleDown.start()
+    }
+
+    private fun setupClickListeners() {
+        buttonCloseDialog.setOnClickListener {
+            dismiss()
+            action()
+        }
+    }
+
+    private fun setupView() {
+        val type = MyInfoDialogType.values()[arguments?.getInt(KEY_TYPE,0)?:0]
+        if(type==MyInfoDialogType.INFO){
+            ivTypeIcon.setImageResource(R.drawable.ic_success)
+        }
+        else
+        {
+            ivTypeIcon.setImageResource(R.drawable.ic_error)
+        }
+        tvMessage.text = arguments?.getString(KEY_MESSAGE,"")
+    }
+
+}
+
+enum class MyInfoDialogType {
+    INFO,
+    ERROR
+}

+ 6 - 0
utils/src/main/res/drawable/ic_error.xml

@@ -0,0 +1,6 @@
+<vector android:height="80dp" android:viewportHeight="455.111"
+    android:viewportWidth="455.111" android:width="80dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#E24C4B" android:pathData="M227.556,227.556m-227.556,0a227.556,227.556 0,1 1,455.112 0a227.556,227.556 0,1 1,-455.112 0"/>
+    <path android:fillColor="#D1403F" android:pathData="M455.111,227.556c0,125.156 -102.4,227.556 -227.556,227.556c-72.533,0 -136.533,-32.711 -177.778,-85.333c38.4,31.289 88.178,49.778 142.222,49.778c125.156,0 227.556,-102.4 227.556,-227.556c0,-54.044 -18.489,-103.822 -49.778,-142.222C422.4,91.022 455.111,155.022 455.111,227.556z"/>
+    <path android:fillColor="#FFFFFF" android:pathData="M331.378,331.378c-8.533,8.533 -22.756,8.533 -31.289,0l-72.533,-72.533l-72.533,72.533c-8.533,8.533 -22.756,8.533 -31.289,0c-8.533,-8.533 -8.533,-22.756 0,-31.289l72.533,-72.533l-72.533,-72.533c-8.533,-8.533 -8.533,-22.756 0,-31.289c8.533,-8.533 22.756,-8.533 31.289,0l72.533,72.533l72.533,-72.533c8.533,-8.533 22.756,-8.533 31.289,0c8.533,8.533 8.533,22.756 0,31.289l-72.533,72.533l72.533,72.533C339.911,308.622 339.911,322.844 331.378,331.378z"/>
+</vector>

+ 7 - 0
utils/src/main/res/drawable/ic_success.xml

@@ -0,0 +1,7 @@
+<vector android:height="80dp" android:viewportHeight="455.431"
+    android:viewportWidth="455.431" android:width="80dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#8DC640" android:pathData="M405.493,412.764c-69.689,56.889 -287.289,56.889 -355.556,0c-69.689,-56.889 -62.578,-300.089 0,-364.089s292.978,-64 355.556,0S475.182,355.876 405.493,412.764z"/>
+    <path android:fillAlpha="0.2" android:fillColor="#FFFFFF"
+        android:pathData="M229.138,313.209c-62.578,49.778 -132.267,75.378 -197.689,76.8c-48.356,-82.489 -38.4,-283.022 18.489,-341.333c51.2,-52.622 211.911,-62.578 304.356,-29.867C377.049,112.676 330.116,232.142 229.138,313.209z" android:strokeAlpha="0.2"/>
+    <path android:fillColor="#FFFFFF" android:pathData="M195.004,354.453c-9.956,0 -19.911,-4.267 -25.6,-12.8l-79.644,-102.4c-11.378,-14.222 -8.533,-34.133 5.689,-45.511s34.133,-8.533 45.511,5.689l54.044,69.689l119.467,-155.022c11.378,-14.222 31.289,-17.067 45.511,-5.689s17.067,31.289 5.689,45.511L220.604,341.653C213.493,348.764 204.96,354.453 195.004,354.453z"/>
+</vector>

+ 44 - 0
utils/src/main/res/layout/fragment_my_info_dialog.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <ImageView
+        android:id="@+id/ivTypeIcon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/ic_success" />
+
+    <TextView
+        android:id="@+id/tvMessage"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:textAlignment="center"
+        android:textSize="16sp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.546"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/ivTypeIcon"
+        tools:text="adgjahsdgjahs" />
+
+    <Button
+        android:id="@+id/buttonCloseDialog"
+        style="@style/Widget.AppCompat.Button.Colored"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="16dp"
+        android:text="@string/button_close_dialog"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tvMessage" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 1
utils/src/main/res/values/strings.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <string name="Ok">Ok</string>
+    <string name="Ok">@android:string/ok</string>
     <string name="network_inactive">Sorry, no internet access!</string>
+    <string name="button_close_dialog">Close</string>
 </resources>