From 885f5736c9d7523a08b41f683fc42f4d8776726e Mon Sep 17 00:00:00 2001 From: Benoit Marty <benoit@matrix.org> Date: Wed, 23 Jun 2021 16:44:41 +0200 Subject: [PATCH] Stop using ProgressDialog, there is a theme issue with it. It's not maintain by Google since it's deprecated. Force usage of MaterialAlertDialogBuilder to have the same UI effect. We sometimes need to block the UI :/ --- .../debug/DebugMaterialThemeActivity.kt | 6 +++ .../layout/activity_debug_material_theme.xml | 7 ++++ .../src/main/java/MaterialProgressDialog.kt | 37 +++++++++++++++++++ .../res/layout/dialog_progress_material.xml | 37 +++++++++++++++++++ .../app/core/platform/VectorBaseFragment.kt | 22 ++++------- 5 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 library/ui-styles/src/main/java/MaterialProgressDialog.kt create mode 100644 library/ui-styles/src/main/res/layout/dialog_progress_material.xml diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt index e91ade9c46..553d495e22 100644 --- a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt +++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt @@ -24,6 +24,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import im.vector.lib.ui.styles.R import im.vector.lib.ui.styles.databinding.ActivityDebugMaterialThemeBinding +import im.vector.lib.ui.styles.dialogs.MaterialProgressDialog // Rendering is not the same with VectorBaseActivity abstract class DebugMaterialThemeActivity : AppCompatActivity() { @@ -61,6 +62,11 @@ abstract class DebugMaterialThemeActivity : AppCompatActivity() { showTestDialog(R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive) } + views.debugShowProgressDialog.setOnClickListener { + MaterialProgressDialog(this) + .show(message = "Progress Dialog\nLine 2", cancellable = true) + } + views.debugShowBottomSheet.setOnClickListener { DebugBottomSheet().show(supportFragmentManager, "TAG") } diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml b/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml index e6d4404f2d..4828810e34 100644 --- a/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml +++ b/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml @@ -466,6 +466,13 @@ android:layout_gravity="center_horizontal" android:text="Show Dialog Neg Destructive" /> + <Button + android:id="@+id/debugShowProgressDialog" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="Show Progress Dialog" /> + <Button android:id="@+id/debugShowBottomSheet" android:layout_width="wrap_content" diff --git a/library/ui-styles/src/main/java/MaterialProgressDialog.kt b/library/ui-styles/src/main/java/MaterialProgressDialog.kt new file mode 100644 index 0000000000..9523c5c19c --- /dev/null +++ b/library/ui-styles/src/main/java/MaterialProgressDialog.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.lib.ui.styles.dialogs + +import android.content.Context +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import im.vector.lib.ui.styles.R +import im.vector.lib.ui.styles.databinding.DialogProgressMaterialBinding + +class MaterialProgressDialog(val context: Context) { + fun show(message: CharSequence, cancellable: Boolean = false): AlertDialog { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_progress_material, null) + val views = DialogProgressMaterialBinding.bind(view) + views.message.text = message + + return MaterialAlertDialogBuilder(context) + .setCancelable(cancellable) + .setView(view) + .show() + } +} diff --git a/library/ui-styles/src/main/res/layout/dialog_progress_material.xml b/library/ui-styles/src/main/res/layout/dialog_progress_material.xml new file mode 100644 index 0000000000..09c88cc50b --- /dev/null +++ b/library/ui-styles/src/main/res/layout/dialog_progress_material.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <!-- Inspired from https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/layout/progress_dialog.xml --> + <LinearLayout + android:id="@+id/body" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:baselineAligned="false" + android:orientation="horizontal" + android:paddingStart="8dp" + android:paddingTop="10dp" + android:paddingEnd="8dp" + android:paddingBottom="10dp"> + + <ProgressBar + android:id="@android:id/progress" + style="?android:attr/progressBarStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="12dp" + android:max="10000" /> + + <TextView + android:id="@+id/message" + style="@style/Widget.Vector.TextView.Body" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + tools:text="Content\nLine 2" /> + + </LinearLayout> + +</FrameLayout> \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt index c513007c3d..2c9452c4fd 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt @@ -14,11 +14,8 @@ * limitations under the License. */ -@file:Suppress("DEPRECATION") - package im.vector.app.core.platform -import android.app.ProgressDialog import android.content.Context import android.os.Bundle import android.os.Parcelable @@ -29,11 +26,12 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper import androidx.annotation.MainThread -import com.google.android.material.appbar.MaterialToolbar +import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider import androidx.viewbinding.ViewBinding import com.airbnb.mvrx.BaseMvRxFragment import com.bumptech.glide.util.Util.assertMainThread +import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.jakewharton.rxbinding3.view.clicks import im.vector.app.R @@ -44,14 +42,14 @@ import im.vector.app.core.dialogs.UnrecognizedCertificateDialog import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.extensions.toMvRxBundle import im.vector.app.features.navigation.Navigator +import im.vector.lib.ui.styles.dialogs.MaterialProgressDialog import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable - import timber.log.Timber import java.util.concurrent.TimeUnit -abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScreenInjector { +abstract class VectorBaseFragment<VB : ViewBinding> : BaseMvRxFragment(), HasScreenInjector { protected val vectorBaseActivity: VectorBaseActivity<*> by lazy { activity as VectorBaseActivity<*> @@ -67,7 +65,7 @@ abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScre protected lateinit var errorFormatter: ErrorFormatter protected lateinit var unrecognizedCertificateDialog: UnrecognizedCertificateDialog - private var progress: ProgressDialog? = null + private var progress: AlertDialog? = null /* ========================================================================================== * View model @@ -203,14 +201,10 @@ abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScre vectorBaseActivity.getCoordinatorLayout()?.showOptimizedSnackbar(errorFormatter.toHumanReadable(throwable)) } - protected fun showLoadingDialog(message: CharSequence? = null, cancelable: Boolean = false) { + protected fun showLoadingDialog(message: CharSequence? = null) { progress?.dismiss() - progress = ProgressDialog(requireContext()).apply { - setCancelable(cancelable) - setMessage(message ?: getString(R.string.please_wait)) - setProgressStyle(ProgressDialog.STYLE_SPINNER) - show() - } + progress = MaterialProgressDialog(requireContext()) + .show(message ?: getString(R.string.please_wait)) } protected fun dismissLoadingDialog() {