From 2d738c0ab2a516830fd7981db9204fc99201e9fb Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Thu, 4 Jan 2024 12:49:55 +0100 Subject: [PATCH 01/16] chores(Loco): Update strings --- app/src/main/res/values-de/strings.xml | 4 ++++ app/src/main/res/values-es/strings.xml | 4 ++++ app/src/main/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-it/strings.xml | 4 ++++ app/src/main/res/values/strings.xml | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7040b012b9..9097cde439 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -347,9 +347,13 @@ Der Entwurf konnte nicht gespeichert werden Die E-Mail konnte nicht gesendet werden Gelöscht + Wenn Sie den Zugriff erlauben, wird die Verwaltung Ihrer Kontakte und Ihre E-Mail-Erfahrung vereinfacht. + Mail den Zugriff auf Ihre Kontakte erlauben Passen Sie Ihre Shortcuts in den Einstellungen der App frei an. Archivieren, Löschen, Verschieben oder Favorisieren mehrerer Nachrichten auf einmal. Erstellen Sie eine kostenlose Adresse oder melden Sie sich bei einem bestehenden Infomaniak-Konto an. + Verpassen Sie keine wichtigen E-Mails und seien Sie in der Lage, schnell zu antworten, indem Sie die Benachrichtigungen aktivieren. + Benachrichtigungen aktivieren Wählen Sie Ihr Thema Sparen Sie Zeit mit Wischaktionen Drücken Sie einige Sekunden auf eine Nachricht, um mehrere auszuwählen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3dbd908c11..3217931056 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -347,9 +347,13 @@ No se ha podido guardar el borrador No se ha podido enviar el correo electrónico Suprimido + Al autorizar el acceso, se simplificará la gestión de tus contactos y tu experiencia con el correo electrónico. + Autorizar el acceso de Mail a tus contactos Personaliza tus accesos directos libremente en los ajustes de la aplicación. Archiva, elimina, mueve o marca varios mensajes a la vez. Cree una dirección gratuita o conéctese a una cuenta Infomaniak existente. + No te pierdas los correos importantes y reacciona rápidamente activando las notificaciones. + Activar notificaciones Elija su tema Ahorre tiempo con las acciones de deslizamiento Pulse un mensaje durante unos segundos para seleccionar varios mensajes diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6b1629dd28..881e6520c5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -355,9 +355,13 @@ Le brouillon n’a pas pu être sauvegardé L’e-mail n’a pas pu être envoyé Supprimé + En autorisant l’accès, la gestion de vos contacts et votre expérience de messagerie seront simplifiées. + Autoriser Mail à accéder à vos contacts Personnalisez librement vos raccourcis dans les paramètres de l’app. Archivez, supprimez, déplacez ou mettez en favoris plusieurs messages en une fois. Créez une adresse gratuite ou connectez-vous à un compte Infomaniak existant. + Ne manquez plus aucun e-mail important et soyez en mesure de répondre rapidement en activant les notifications. + Autoriser les notifications Choisissez votre thème Gagnez du temps avec les actions de balayage Appuyez quelques secondes sur un message pour en sélectionner plusieurs diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 385c4675b9..20ccf7b531 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -347,9 +347,13 @@ Non è stato possibile salvare la bozza Non è stato possibile inviare l’e-mail Soppresso + Autorizzando l’accesso, la gestione dei vostri contatti e la vostra esperienza con la posta elettronica saranno semplificate. + Autorizzare Mail ad accedere ai contatti Personalizzate liberamente i vostri collegamenti nelle impostazioni dell’app. Archiviare, eliminare, spostare o inserire tra i preferiti più messaggi contemporaneamente. Create un indirizzo gratuito o collegatevi a un account Infomaniak esistente. + Non perdete le e-mail importanti e rispondete rapidamente attivando le notifiche. + Attivare le notifiche Scegliete il vostro tema Risparmiate tempo con le azioni a scorrimento Premere un messaggio per alcuni secondi per selezionare più messaggi diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3fc19c907..6c3f6a0e21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -353,9 +353,13 @@ The draft could not be saved The email could not be sent Deleted + By authorizing access, your contact management and messaging experience will be simplified. + Allow Mail to access your contacts Customize your shortcuts freely in the app settings. Archive, delete, move or favorite multiple messages at once. Create a free address or connect to an existing Infomaniak account. + Don’t miss any important emails and be able to respond quickly by activating notifications. + Enable notifications Choose your theme Save time with swipe actions Press a message for a few seconds to select multiple messages From a730b2d1b27e101ff23763e6f509cb1c49222684 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Thu, 4 Jan 2024 13:57:28 +0100 Subject: [PATCH 02/16] feat(PermissionsOnboarding): First version of layout --- .../PermissionsOnboardingFragment.kt | 23 +++ .../illustration_onboarding_contact.xml | 92 ++++++++++++ .../fragment_permissions_onboarding.xml | 142 ++++++++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt create mode 100644 app/src/main/res/drawable/illustration_onboarding_contact.xml create mode 100644 app/src/main/res/layout/fragment_permissions_onboarding.xml diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt new file mode 100644 index 0000000000..45b9af097b --- /dev/null +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt @@ -0,0 +1,23 @@ +/* + * Infomaniak Mail - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.mail.ui.main.onboarding + +import androidx.fragment.app.Fragment + +class PermissionsOnboardingFragment : Fragment() { +} diff --git a/app/src/main/res/drawable/illustration_onboarding_contact.xml b/app/src/main/res/drawable/illustration_onboarding_contact.xml new file mode 100644 index 0000000000..1dc6db2c9a --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_contact.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_permissions_onboarding.xml b/app/src/main/res/layout/fragment_permissions_onboarding.xml new file mode 100644 index 0000000000..ba3b35fef9 --- /dev/null +++ b/app/src/main/res/layout/fragment_permissions_onboarding.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + From 95d2efd327faf1c96fccb595fb0c794101d9dca6 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Mon, 8 Jan 2024 09:53:31 +0100 Subject: [PATCH 03/16] feat(PermissionsOnBoarding): Add illustrations --- .../illustration_onboarding_contacts.xml | 108 ++++++++++ .../illustration_onboarding_contacts_blue.xml | 108 ++++++++++ .../illustration_onboarding_notifications.xml | 203 ++++++++++++++++++ ...stration_onboarding_notifications_blue.xml | 203 ++++++++++++++++++ .../illustration_onboarding_contact.xml | 92 -------- .../illustration_onboarding_contacts.xml | 108 ++++++++++ .../illustration_onboarding_contacts_blue.xml | 108 ++++++++++ .../illustration_onboarding_notifications.xml | 200 +++++++++++++++++ ...stration_onboarding_notifications_blue.xml | 200 +++++++++++++++++ 9 files changed, 1238 insertions(+), 92 deletions(-) create mode 100644 app/src/main/res/drawable-night/illustration_onboarding_contacts.xml create mode 100644 app/src/main/res/drawable-night/illustration_onboarding_contacts_blue.xml create mode 100644 app/src/main/res/drawable-night/illustration_onboarding_notifications.xml create mode 100644 app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml delete mode 100644 app/src/main/res/drawable/illustration_onboarding_contact.xml create mode 100644 app/src/main/res/drawable/illustration_onboarding_contacts.xml create mode 100644 app/src/main/res/drawable/illustration_onboarding_contacts_blue.xml create mode 100644 app/src/main/res/drawable/illustration_onboarding_notifications.xml create mode 100644 app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml diff --git a/app/src/main/res/drawable-night/illustration_onboarding_contacts.xml b/app/src/main/res/drawable-night/illustration_onboarding_contacts.xml new file mode 100644 index 0000000000..408f0a78fb --- /dev/null +++ b/app/src/main/res/drawable-night/illustration_onboarding_contacts.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-night/illustration_onboarding_contacts_blue.xml b/app/src/main/res/drawable-night/illustration_onboarding_contacts_blue.xml new file mode 100644 index 0000000000..2af83dc4f8 --- /dev/null +++ b/app/src/main/res/drawable-night/illustration_onboarding_contacts_blue.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml b/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml new file mode 100644 index 0000000000..066a59abcb --- /dev/null +++ b/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml b/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml new file mode 100644 index 0000000000..10089b3257 --- /dev/null +++ b/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_contact.xml b/app/src/main/res/drawable/illustration_onboarding_contact.xml deleted file mode 100644 index 1dc6db2c9a..0000000000 --- a/app/src/main/res/drawable/illustration_onboarding_contact.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/illustration_onboarding_contacts.xml b/app/src/main/res/drawable/illustration_onboarding_contacts.xml new file mode 100644 index 0000000000..568ec0849e --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_contacts.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_contacts_blue.xml b/app/src/main/res/drawable/illustration_onboarding_contacts_blue.xml new file mode 100644 index 0000000000..49ce388c24 --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_contacts_blue.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_notifications.xml b/app/src/main/res/drawable/illustration_onboarding_notifications.xml new file mode 100644 index 0000000000..458bbcf147 --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_notifications.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml b/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml new file mode 100644 index 0000000000..29bbc0e779 --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 01f329113e767d590d3ab395c1062c8cacf79afb Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Tue, 9 Jan 2024 13:28:00 +0100 Subject: [PATCH 04/16] feat(PermissionsOn boarding): Add a ViewPager to slide to next screen --- .../com/infomaniak/mail/ui/MainActivity.kt | 3 + .../PermissionsOnboardingFragment.kt | 50 ++++++++++++ .../PermissionsOnboardingPagerFragment.kt | 70 ++++++++++++++++ .../PermissionsOnboardingViewModel.kt | 27 +++++++ .../onboarding/PermissionsPagerAdapter.kt | 38 +++++++++ .../infomaniak/mail/utils/PermissionUtils.kt | 28 +++---- .../fragment_permissions_onboarding.xml | 41 ++-------- .../fragment_permissions_onboarding_pager.xml | 80 +++++++++++++++++++ .../main/res/navigation/main_navigation.xml | 14 ++++ 9 files changed, 302 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt create mode 100644 app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt create mode 100644 app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsPagerAdapter.kt create mode 100644 app/src/main/res/layout/fragment_permissions_onboarding_pager.xml diff --git a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt index fa3a4a95dc..d93651a248 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt @@ -208,6 +208,9 @@ class MainActivity : BaseActivity() { permissionUtils.requestMainPermissionsIfNeeded() + // TODO make this only after login + navController.navigate(R.id.permissionsOnboardingPagerFragment) + initAppUpdateManager() } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt index 45b9af097b..da71894172 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt @@ -17,7 +17,57 @@ */ package com.infomaniak.mail.ui.main.onboarding +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes import androidx.fragment.app.Fragment +import androidx.navigation.fragment.navArgs +import com.infomaniak.lib.core.utils.safeBinding +import com.infomaniak.mail.R +import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingBinding class PermissionsOnboardingFragment : Fragment() { + + private var binding: FragmentPermissionsOnboardingBinding by safeBinding() + private val navigationArgs: PermissionsOnboardingFragmentArgs by navArgs() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + return FragmentPermissionsOnboardingBinding.inflate(inflater, container, false).also { binding = it }.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { + super.onViewCreated(view, savedInstanceState) + setPermissionUi() + } + + private fun setPermissionUi() = with(binding) { + val permission = if (navigationArgs.position == 0) PermissionType.CONTACTS else PermissionType.NOTIFICATIONS + iconLayout.setImageResource(permission.iconRes) + title.setText(permission.titleRes) + description.setText(permission.descritionRes) + waveBackground.setImageResource(permission.waveRes) + } + + enum class PermissionType( + @DrawableRes val iconRes: Int, + @StringRes val titleRes: Int, + @StringRes val descritionRes: Int, + @DrawableRes val waveRes: Int, + ) { + CONTACTS( + iconRes = R.drawable.illustration_onboarding_contacts, + titleRes = R.string.onBoardingContactsTitle, + descritionRes = R.string.onBoardingContactsDescription, + waveRes = R.drawable.ic_back_wave_1 + ), + NOTIFICATIONS( + iconRes = R.drawable.illustration_onboarding_notifications, + titleRes = R.string.onBoardingNotificationsTitle, + descritionRes = R.string.onBoardingNotificationsDescription, + waveRes = R.drawable.ic_back_wave_2 + ), + } } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt new file mode 100644 index 0000000000..b43d0a894c --- /dev/null +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -0,0 +1,70 @@ +/* + * Infomaniak Mail - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.mail.ui.main.onboarding + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.infomaniak.lib.core.utils.safeBinding +import com.infomaniak.lib.core.utils.safeNavigate +import com.infomaniak.mail.R +import com.infomaniak.mail.data.LocalSettings +import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingPagerBinding +import com.infomaniak.mail.utils.PermissionUtils +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class PermissionsOnboardingPagerFragment : Fragment() { + + private var binding: FragmentPermissionsOnboardingPagerBinding by safeBinding() + + private val permissionUtils by lazy { PermissionUtils(this) } + + @Inject + lateinit var localSettings: LocalSettings + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + return FragmentPermissionsOnboardingPagerBinding.inflate(inflater, container, false).also { binding = it }.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(binding) { + super.onViewCreated(view, savedInstanceState) + + permissionsViewpager.apply { + adapter = PermissionsPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) + isUserInputEnabled = false + } + + continueButton.setOnClickListener { + when (permissionsViewpager.currentItem) { + 0 -> { + // permissionUtils.requestMainPermissionsIfNeeded() + } + 1 -> { + // TODO: write in localSettings ? + safeNavigate(R.id.threadListFragment) + } + } + + permissionsViewpager.currentItem += 1 + } + } +} diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt new file mode 100644 index 0000000000..6f6a391326 --- /dev/null +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt @@ -0,0 +1,27 @@ +/* + * Infomaniak Mail - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.mail.ui.main.onboarding + +import androidx.lifecycle.ViewModel +import com.infomaniak.mail.ui.main.onboarding.PermissionsOnboardingFragment.PermissionType + + +class PermissionsOnboardingViewModel : ViewModel() { + + var currentPermission: PermissionType = PermissionType.CONTACTS +} diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsPagerAdapter.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsPagerAdapter.kt new file mode 100644 index 0000000000..04cd3bd59c --- /dev/null +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsPagerAdapter.kt @@ -0,0 +1,38 @@ +/* + * Infomaniak Mail - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.mail.ui.main.onboarding + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.Lifecycle +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.infomaniak.mail.utils.PermissionUtils + +class PermissionsPagerAdapter( + manager: FragmentManager, + lifecycle: Lifecycle, +) : FragmentStateAdapter(manager, lifecycle) { + + override fun getItemCount() = PermissionUtils.getMainPermissions(mustRequireNotification = true).count() + + override fun createFragment(position: Int): Fragment { + return PermissionsOnboardingFragment().apply { + arguments = PermissionsOnboardingFragmentArgs(position).toBundle() + } + } +} diff --git a/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt b/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt index 45a08074b1..1f11670911 100644 --- a/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt +++ b/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt @@ -61,20 +61,6 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity if (!activity.hasPermissions(mainPermissions)) mainForActivityResult?.launch(mainPermissions) } - /** - * If the user has manually disabled notifications permissions, stop requesting it. - * Manually disabled means the permission was granted at one point, but is no more. - */ - private fun getMainPermissions(mustRequireNotification: Boolean): Array { - val mainPermissions = mutableListOf(Manifest.permission.READ_CONTACTS) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && mustRequireNotification) { - mainPermissions.add(Manifest.permission.POST_NOTIFICATIONS) - } - - return mainPermissions.toTypedArray() - } - //region DownloadManager permissions private var downloadCallback: (() -> Unit)? = null @@ -101,5 +87,19 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity companion object { @get:DeprecatedSinceApi(Build.VERSION_CODES.Q, "Only used for DownloadManager below API 29") private const val storagePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE + + /** + * If the user has manually disabled notifications permissions, stop requesting it. + * Manually disabled means the permission was granted at one point, but is no more. + */ + fun getMainPermissions(mustRequireNotification: Boolean): Array { + val mainPermissions = mutableListOf(Manifest.permission.READ_CONTACTS) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && mustRequireNotification) { + mainPermissions.add(Manifest.permission.POST_NOTIFICATIONS) + } + + return mainPermissions.toTypedArray() + } } } diff --git a/app/src/main/res/layout/fragment_permissions_onboarding.xml b/app/src/main/res/layout/fragment_permissions_onboarding.xml index ba3b35fef9..92eb765500 100644 --- a/app/src/main/res/layout/fragment_permissions_onboarding.xml +++ b/app/src/main/res/layout/fragment_permissions_onboarding.xml @@ -28,7 +28,7 @@ android:layout_height="0dp" android:importantForAccessibility="no" android:scaleType="fitXY" - android:src="@drawable/ic_back_wave_1" + android:src="@drawable/ic_back_wave_2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent="0.5" app:layout_constraintHorizontal_bias="0.0" @@ -73,14 +73,13 @@ + app:layout_constraintStart_toStartOf="@id/start" + tools:src="@drawable/illustration_onboarding_contacts" /> - - - - - - diff --git a/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml b/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml new file mode 100644 index 0000000000..0253b57fb3 --- /dev/null +++ b/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/navigation/main_navigation.xml b/app/src/main/res/navigation/main_navigation.xml index 63430c030e..00339d7770 100644 --- a/app/src/main/res/navigation/main_navigation.xml +++ b/app/src/main/res/navigation/main_navigation.xml @@ -597,4 +597,18 @@ app:argType="com.infomaniak.mail.data.models.calendar.Attendee[]" /> + + + + + + From 1026f5039dfa8de275c7272cbb056d3c4c25fd62 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Wed, 10 Jan 2024 11:28:30 +0100 Subject: [PATCH 05/16] feat(PermissionsOnboarding): Add permission request for contacts only --- .../com/infomaniak/mail/ui/MainActivity.kt | 13 ++++---- .../PermissionsOnboardingPagerFragment.kt | 16 +++++++--- .../infomaniak/mail/utils/PermissionUtils.kt | 32 ++++++++++++++++--- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt index d93651a248..d306e1c8fb 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt @@ -17,7 +17,6 @@ */ package com.infomaniak.mail.ui -import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle @@ -206,10 +205,12 @@ class MainActivity : BaseActivity() { loadCurrentMailbox() - permissionUtils.requestMainPermissionsIfNeeded() - - // TODO make this only after login - navController.navigate(R.id.permissionsOnboardingPagerFragment) + if (localSettings.appLaunches == 0) { + // TODO make this only after login + navController.navigate(R.id.permissionsOnboardingPagerFragment) + } else { + permissionUtils.requestMainPermissionsIfNeeded() + } initAppUpdateManager() } @@ -425,7 +426,7 @@ class MainActivity : BaseActivity() { private fun registerMainPermissions() { permissionUtils.registerMainPermissions { permissionsResults -> - if (permissionsResults[Manifest.permission.READ_CONTACTS] == true) mainViewModel.updateUserInfo() + if (permissionsResults[PermissionUtils.READ_CONTACTS_PERMISSION] == true) mainViewModel.updateUserInfo() } } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index b43d0a894c..6e8b7ad9c0 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -22,11 +22,13 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.safeNavigate import com.infomaniak.mail.R import com.infomaniak.mail.data.LocalSettings import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingPagerBinding +import com.infomaniak.mail.ui.MainViewModel import com.infomaniak.mail.utils.PermissionUtils import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -35,12 +37,14 @@ import javax.inject.Inject class PermissionsOnboardingPagerFragment : Fragment() { private var binding: FragmentPermissionsOnboardingPagerBinding by safeBinding() - - private val permissionUtils by lazy { PermissionUtils(this) } + private val mainViewModel: MainViewModel by activityViewModels() @Inject lateinit var localSettings: LocalSettings + @Inject + lateinit var permissionUtils: PermissionUtils + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return FragmentPermissionsOnboardingPagerBinding.inflate(inflater, container, false).also { binding = it }.root } @@ -48,6 +52,8 @@ class PermissionsOnboardingPagerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(binding) { super.onViewCreated(view, savedInstanceState) + permissionUtils.registerReadContactsPermission(fragment = this@PermissionsOnboardingPagerFragment) + permissionsViewpager.apply { adapter = PermissionsPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) isUserInputEnabled = false @@ -56,7 +62,10 @@ class PermissionsOnboardingPagerFragment : Fragment() { continueButton.setOnClickListener { when (permissionsViewpager.currentItem) { 0 -> { - // permissionUtils.requestMainPermissionsIfNeeded() + permissionUtils.requestReadContactsPermission { + mainViewModel.updateUserInfo() + permissionsViewpager.currentItem += 1 + } } 1 -> { // TODO: write in localSettings ? @@ -64,7 +73,6 @@ class PermissionsOnboardingPagerFragment : Fragment() { } } - permissionsViewpager.currentItem += 1 } } } diff --git a/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt b/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt index 1f11670911..75503ee5f0 100644 --- a/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt +++ b/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt @@ -23,6 +23,7 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions import androidx.activity.result.contract.ActivityResultContracts.RequestPermission import androidx.annotation.DeprecatedSinceApi +import androidx.annotation.RequiresApi import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import com.infomaniak.lib.core.utils.hasPermissions @@ -34,10 +35,11 @@ import javax.inject.Inject class PermissionUtils @Inject constructor(private val activity: FragmentActivity, private val localSettings: LocalSettings) { private var mainForActivityResult: ActivityResultLauncher>? = null + private var contactsPermissionForActivityResult: ActivityResultLauncher? = null private var storageForActivityResult: ActivityResultLauncher? = null val hasDownloadManagerPermission - get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q || activity.hasPermissions(arrayOf(storagePermission)) + get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q || activity.hasPermissions(arrayOf(STORAGE_PERMISSION)) fun registerMainPermissions(onPermissionResult: ((permissions: Map) -> Unit)? = null) { mainForActivityResult = activity.registerForActivityResult(RequestMultiplePermissions()) { authorizedPermissions -> @@ -61,6 +63,22 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity if (!activity.hasPermissions(mainPermissions)) mainForActivityResult?.launch(mainPermissions) } + //region read contacts permissions + private var contactsCallback: (() -> Unit)? = null + + fun registerReadContactsPermission(fragment: Fragment) { + contactsPermissionForActivityResult = fragment.registerForActivityResult(RequestPermission()) { hasPermission -> + if (hasPermission) contactsCallback?.invoke() + } + } + + fun requestReadContactsPermission(contactsCallback: () -> Unit) { + contactsPermissionForActivityResult?.launch(READ_CONTACTS_PERMISSION) + this.contactsCallback = contactsCallback + } + //endregion + + //region DownloadManager permissions private var downloadCallback: (() -> Unit)? = null @@ -79,24 +97,28 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity * Request storage permission only for Android API below 29. */ fun requestDownloadManagerPermission(downloadCallback: () -> Unit) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) storageForActivityResult?.launch(storagePermission) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) storageForActivityResult?.launch(STORAGE_PERMISSION) this.downloadCallback = downloadCallback } //endregion companion object { + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private const val POST_NOTIFICATIONS_PERMISSION = Manifest.permission.POST_NOTIFICATIONS + const val READ_CONTACTS_PERMISSION = Manifest.permission.READ_CONTACTS @get:DeprecatedSinceApi(Build.VERSION_CODES.Q, "Only used for DownloadManager below API 29") - private const val storagePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE + private const val STORAGE_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE /** * If the user has manually disabled notifications permissions, stop requesting it. * Manually disabled means the permission was granted at one point, but is no more. */ fun getMainPermissions(mustRequireNotification: Boolean): Array { - val mainPermissions = mutableListOf(Manifest.permission.READ_CONTACTS) + val mainPermissions = mutableListOf(READ_CONTACTS_PERMISSION) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && mustRequireNotification) { - mainPermissions.add(Manifest.permission.POST_NOTIFICATIONS) + mainPermissions.add(POST_NOTIFICATIONS_PERMISSION) } return mainPermissions.toTypedArray() From 1ee0c8b791061ddc2dba09dc51461bf024a88d62 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Wed, 10 Jan 2024 13:39:56 +0100 Subject: [PATCH 06/16] feat(PermissionsOnboarding): Basic working flow for Api > 33 --- .../PermissionsOnboardingPagerFragment.kt | 12 ++++--- .../infomaniak/mail/utils/PermissionUtils.kt | 36 ++++++++++++++++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index 6e8b7ad9c0..6d92f98ad2 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -52,7 +52,10 @@ class PermissionsOnboardingPagerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(binding) { super.onViewCreated(view, savedInstanceState) - permissionUtils.registerReadContactsPermission(fragment = this@PermissionsOnboardingPagerFragment) + permissionUtils.apply { + registerReadContactsPermission(fragment = this@PermissionsOnboardingPagerFragment) + registerNotificationsPermissionIfNeeded(fragment = this@PermissionsOnboardingPagerFragment) + } permissionsViewpager.apply { adapter = PermissionsPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) @@ -62,14 +65,13 @@ class PermissionsOnboardingPagerFragment : Fragment() { continueButton.setOnClickListener { when (permissionsViewpager.currentItem) { 0 -> { - permissionUtils.requestReadContactsPermission { - mainViewModel.updateUserInfo() + permissionUtils.requestReadContactsPermission { hasPermission -> + if (hasPermission) mainViewModel.updateUserInfo() permissionsViewpager.currentItem += 1 } } 1 -> { - // TODO: write in localSettings ? - safeNavigate(R.id.threadListFragment) + permissionUtils.requestNotificationsPermissionIfNeeded { safeNavigate(R.id.threadListFragment) } } } diff --git a/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt b/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt index 75503ee5f0..e002a9ad2e 100644 --- a/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt +++ b/app/src/main/java/com/infomaniak/mail/utils/PermissionUtils.kt @@ -36,6 +36,7 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity private var mainForActivityResult: ActivityResultLauncher>? = null private var contactsPermissionForActivityResult: ActivityResultLauncher? = null + private var notificationsPermissionForActivityResult: ActivityResultLauncher? = null private var storageForActivityResult: ActivityResultLauncher? = null val hasDownloadManagerPermission @@ -64,20 +65,45 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity } //region read contacts permissions - private var contactsCallback: (() -> Unit)? = null + private var contactsCallback: ((Boolean) -> Unit)? = null fun registerReadContactsPermission(fragment: Fragment) { contactsPermissionForActivityResult = fragment.registerForActivityResult(RequestPermission()) { hasPermission -> - if (hasPermission) contactsCallback?.invoke() + contactsCallback?.invoke(hasPermission) } } - fun requestReadContactsPermission(contactsCallback: () -> Unit) { - contactsPermissionForActivityResult?.launch(READ_CONTACTS_PERMISSION) + fun requestReadContactsPermission(contactsCallback: (Boolean) -> Unit) { this.contactsCallback = contactsCallback + contactsPermissionForActivityResult?.launch(READ_CONTACTS_PERMISSION) } //endregion + //region notifications permissions + private var notificationsCallback: ((Boolean) -> Unit)? = null + + /** + * Register notifications permission only for Android API above or equal 33 and if user never manually disabled it. + */ + fun registerNotificationsPermissionIfNeeded(fragment: Fragment) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !localSettings.hasAlreadyEnabledNotifications) { + notificationsPermissionForActivityResult = fragment.registerForActivityResult(RequestPermission()) { hasPermission -> + if (hasPermission) localSettings.hasAlreadyEnabledNotifications = true + notificationsCallback?.invoke(hasPermission) + } + } + } + + /** + * Request notifications permission only for Android API above or equal 33 and if user never manually disabled it. + */ + fun requestNotificationsPermissionIfNeeded(notificationsCallback: (Boolean) -> Unit) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !localSettings.hasAlreadyEnabledNotifications) { + this.notificationsCallback = notificationsCallback + notificationsPermissionForActivityResult?.launch(POST_NOTIFICATIONS_PERMISSION) + } + } + //endregion //region DownloadManager permissions private var downloadCallback: (() -> Unit)? = null @@ -97,8 +123,8 @@ class PermissionUtils @Inject constructor(private val activity: FragmentActivity * Request storage permission only for Android API below 29. */ fun requestDownloadManagerPermission(downloadCallback: () -> Unit) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) storageForActivityResult?.launch(STORAGE_PERMISSION) this.downloadCallback = downloadCallback + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) storageForActivityResult?.launch(STORAGE_PERMISSION) } //endregion From 2fe72f0b083e1091bf6ca99d929ebcb121af697e Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Wed, 10 Jan 2024 16:37:25 +0100 Subject: [PATCH 07/16] feat(PermissionsOnboarding): Remove overScroll in Api < 31 --- .../com/infomaniak/mail/ui/login/LoginFragment.kt | 11 ++--------- .../onboarding/PermissionsOnboardingPagerFragment.kt | 2 ++ .../main/java/com/infomaniak/mail/utils/Extensions.kt | 8 ++++++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/login/LoginFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/login/LoginFragment.kt index 3c31d02dd3..15a1f786e2 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/login/LoginFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/login/LoginFragment.kt @@ -18,7 +18,6 @@ package com.infomaniak.mail.ui.login import android.content.res.ColorStateList -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -30,7 +29,6 @@ import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.infomaniak.lib.core.R import com.infomaniak.lib.core.utils.* @@ -42,6 +40,7 @@ import com.infomaniak.mail.di.IoDispatcher import com.infomaniak.mail.di.MainDispatcher import com.infomaniak.mail.utils.LoginUtils import com.infomaniak.mail.utils.UiUtils +import com.infomaniak.mail.utils.removeOverScrollForApiBelow31 import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject @@ -99,9 +98,7 @@ class LoginFragment : Fragment() { } }) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - removeOverScroll() - } + removeOverScrollForApiBelow31() } dotsIndicator.apply { @@ -193,10 +190,6 @@ class LoginFragment : Fragment() { signInButton.isEnabled = true } - private fun ViewPager2.removeOverScroll() { - (getChildAt(0) as? RecyclerView)?.overScrollMode = View.OVER_SCROLL_NEVER - } - private fun getViewPagerCurrentItem(): Int = binding.introViewpager.currentItem private fun goBackAPage() { diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index 6d92f98ad2..7965a4ddad 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -30,6 +30,7 @@ import com.infomaniak.mail.data.LocalSettings import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingPagerBinding import com.infomaniak.mail.ui.MainViewModel import com.infomaniak.mail.utils.PermissionUtils +import com.infomaniak.mail.utils.removeOverScrollForApiBelow31 import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -60,6 +61,7 @@ class PermissionsOnboardingPagerFragment : Fragment() { permissionsViewpager.apply { adapter = PermissionsPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) isUserInputEnabled = false + removeOverScrollForApiBelow31() } continueButton.setOnClickListener { diff --git a/app/src/main/java/com/infomaniak/mail/utils/Extensions.kt b/app/src/main/java/com/infomaniak/mail/utils/Extensions.kt index 75c45053db..a10d6c78bb 100644 --- a/app/src/main/java/com/infomaniak/mail/utils/Extensions.kt +++ b/app/src/main/java/com/infomaniak/mail/utils/Extensions.kt @@ -48,6 +48,8 @@ import androidx.lifecycle.* import androidx.navigation.NavDirections import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieProperty import com.airbnb.lottie.SimpleColorFilter @@ -625,3 +627,9 @@ fun ShapeableImageView.setInnerStrokeWidth(strokeWidth: Float) { val halfStrokeWidth = (strokeWidth / 2.0f).roundToInt() setPaddingRelative(halfStrokeWidth, halfStrokeWidth, halfStrokeWidth, halfStrokeWidth) } + +fun ViewPager2.removeOverScrollForApiBelow31() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + (getChildAt(0) as? RecyclerView)?.overScrollMode = View.OVER_SCROLL_NEVER + } +} From 55436ab3d090eb7ccb454963cc929f370e1c9961 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Wed, 10 Jan 2024 16:38:34 +0100 Subject: [PATCH 08/16] feat(PermissionsOnboarding): Fix navigation in Api < 33 --- .../PermissionsOnboardingPagerFragment.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index 7965a4ddad..2cc07864a0 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -23,6 +23,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.viewpager2.widget.ViewPager2 import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.safeNavigate import com.infomaniak.mail.R @@ -69,14 +70,17 @@ class PermissionsOnboardingPagerFragment : Fragment() { 0 -> { permissionUtils.requestReadContactsPermission { hasPermission -> if (hasPermission) mainViewModel.updateUserInfo() - permissionsViewpager.currentItem += 1 + if (permissionsViewpager.isLastPage()) leaveOnboarding() else permissionsViewpager.currentItem += 1 } } - 1 -> { - permissionUtils.requestNotificationsPermissionIfNeeded { safeNavigate(R.id.threadListFragment) } - } + 1 -> permissionUtils.requestNotificationsPermissionIfNeeded { leaveOnboarding() } } - } } + + private fun ViewPager2.isLastPage() = adapter?.let { currentItem == it.itemCount - 1 } ?: true + + private fun leaveOnboarding() { + safeNavigate(R.id.threadListFragment) + } } From 764bc3b26f286600500d26d5227df66c7c350f48 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Wed, 17 Jan 2024 16:34:56 +0100 Subject: [PATCH 09/16] fix(PermissionsOnboarding): Fix Onboarding being displayed unnecessarily --- .../com/infomaniak/mail/ui/MainActivity.kt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt index d306e1c8fb..0fed776ef3 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt @@ -44,6 +44,7 @@ import com.infomaniak.lib.core.utils.SentryLog import com.infomaniak.lib.core.utils.Utils import com.infomaniak.lib.core.utils.Utils.toEnumOrThrow import com.infomaniak.lib.core.utils.UtilsUi.openUrl +import com.infomaniak.lib.core.utils.hasPermissions import com.infomaniak.lib.core.utils.year import com.infomaniak.lib.stores.StoreUtils.checkUpdateIsAvailable import com.infomaniak.lib.stores.StoreUtils.initAppUpdateManager @@ -205,12 +206,7 @@ class MainActivity : BaseActivity() { loadCurrentMailbox() - if (localSettings.appLaunches == 0) { - // TODO make this only after login - navController.navigate(R.id.permissionsOnboardingPagerFragment) - } else { - permissionUtils.requestMainPermissionsIfNeeded() - } + managePermissionsRequesting() initAppUpdateManager() } @@ -487,6 +483,16 @@ class MainActivity : BaseActivity() { ) } + private fun managePermissionsRequesting() { + if (!hasPermissions(PermissionUtils.getMainPermissions(mustRequireNotification = true))) { + if (localSettings.appLaunches == 0) { + navController.navigate(R.id.permissionsOnboardingPagerFragment) + } else { + permissionUtils.requestMainPermissionsIfNeeded() + } + } + } + private fun initAppUpdateManager() { initAppUpdateManager( context = this, From 1555bbddad8ba0df47452bddd8bfada2ab7f3479 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Wed, 17 Jan 2024 16:39:30 +0100 Subject: [PATCH 10/16] chores(PermissonsOnboarding): Update strings --- app/src/main/res/values-de/strings.xml | 4 ++-- app/src/main/res/values-es/strings.xml | 4 ++-- app/src/main/res/values-fr/strings.xml | 4 ++-- app/src/main/res/values-it/strings.xml | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9097cde439..ec2d87e652 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -347,8 +347,8 @@ Der Entwurf konnte nicht gespeichert werden Die E-Mail konnte nicht gesendet werden Gelöscht - Wenn Sie den Zugriff erlauben, wird die Verwaltung Ihrer Kontakte und Ihre E-Mail-Erfahrung vereinfacht. - Mail den Zugriff auf Ihre Kontakte erlauben + Mit diesem Zugang können Sie Ihren Kontakten ganz einfach über Infomaniak Mail schreiben.\nWir respektieren Ihre Privatsphäre und Ihre Kontakte werden nicht für andere Zwecke verwendet. + Erlauben Sie der App den Zugriff auf Ihre Kontakte Passen Sie Ihre Shortcuts in den Einstellungen der App frei an. Archivieren, Löschen, Verschieben oder Favorisieren mehrerer Nachrichten auf einmal. Erstellen Sie eine kostenlose Adresse oder melden Sie sich bei einem bestehenden Infomaniak-Konto an. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3217931056..fd5398bbe4 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -347,8 +347,8 @@ No se ha podido guardar el borrador No se ha podido enviar el correo electrónico Suprimido - Al autorizar el acceso, se simplificará la gestión de tus contactos y tu experiencia con el correo electrónico. - Autorizar el acceso de Mail a tus contactos + Este acceso le permitirá escribir fácilmente a sus contactos desde Infomaniak Mail.\nRespetamos su privacidad y sus contactos no se utilizarán para ningún otro fin. + Permitir que la aplicación acceda a tus contactos Personaliza tus accesos directos libremente en los ajustes de la aplicación. Archiva, elimina, mueve o marca varios mensajes a la vez. Cree una dirección gratuita o conéctese a una cuenta Infomaniak existente. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 881e6520c5..0e2c3abb1f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -355,8 +355,8 @@ Le brouillon n’a pas pu être sauvegardé L’e-mail n’a pas pu être envoyé Supprimé - En autorisant l’accès, la gestion de vos contacts et votre expérience de messagerie seront simplifiées. - Autoriser Mail à accéder à vos contacts + Cet accès permettra d’écrire facilement à vos contacts depuis Infomaniak Mail.\nNous respectons vos données et vos contacts ne seront pas utilisés à d’autres fins. + Autoriser l’app à accéder à vos contacts Personnalisez librement vos raccourcis dans les paramètres de l’app. Archivez, supprimez, déplacez ou mettez en favoris plusieurs messages en une fois. Créez une adresse gratuite ou connectez-vous à un compte Infomaniak existant. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 20ccf7b531..c650eb1db0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -347,8 +347,8 @@ Non è stato possibile salvare la bozza Non è stato possibile inviare l’e-mail Soppresso - Autorizzando l’accesso, la gestione dei vostri contatti e la vostra esperienza con la posta elettronica saranno semplificate. - Autorizzare Mail ad accedere ai contatti + Questo accesso ti permetterà di scrivere facilmente ai tuoi contatti da Infomaniak Mail.\nRispettiamo la tua privacy e i tuoi contatti non saranno utilizzati per altri scopi. + Consenti al l’applicazione di accedere ai contatti Personalizzate liberamente i vostri collegamenti nelle impostazioni dell’app. Archiviare, eliminare, spostare o inserire tra i preferiti più messaggi contemporaneamente. Create un indirizzo gratuito o collegatevi a un account Infomaniak esistente. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c3f6a0e21..7840750729 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -353,8 +353,8 @@ The draft could not be saved The email could not be sent Deleted - By authorizing access, your contact management and messaging experience will be simplified. - Allow Mail to access your contacts + This access will allow you to write easily to your contacts from Infomaniak Mail.\nWe respect your privacy and your contacts will not be used for any other purpose. + Allow the app to access your contacts Customize your shortcuts freely in the app settings. Archive, delete, move or favorite multiple messages at once. Create a free address or connect to an existing Infomaniak account. From 1781bacfa8c156b6c3f54ec5bb77f00de7f66314 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Thu, 18 Jan 2024 10:54:11 +0100 Subject: [PATCH 11/16] feat(PermissionsOnboarding): Fix colors not updated when changing theme --- .../PermissionsOnboardingFragment.kt | 15 +- .../PermissionsOnboardingPagerFragment.kt | 3 + .../fragment_permissions_onboarding.xml | 169 +++++++++--------- .../fragment_permissions_onboarding_pager.xml | 51 ++---- 4 files changed, 122 insertions(+), 116 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt index da71894172..ecd0964b17 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt @@ -17,6 +17,7 @@ */ package com.infomaniak.mail.ui.main.onboarding +import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -27,18 +28,25 @@ import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.mail.R +import com.infomaniak.mail.data.LocalSettings import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingBinding +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject +@AndroidEntryPoint class PermissionsOnboardingFragment : Fragment() { private var binding: FragmentPermissionsOnboardingBinding by safeBinding() private val navigationArgs: PermissionsOnboardingFragmentArgs by navArgs() + @Inject + lateinit var localSettings: LocalSettings + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return FragmentPermissionsOnboardingBinding.inflate(inflater, container, false).also { binding = it }.root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(binding) { super.onViewCreated(view, savedInstanceState) setPermissionUi() } @@ -48,7 +56,10 @@ class PermissionsOnboardingFragment : Fragment() { iconLayout.setImageResource(permission.iconRes) title.setText(permission.titleRes) description.setText(permission.descritionRes) - waveBackground.setImageResource(permission.waveRes) + waveBackground.apply { + setImageResource(permission.waveRes) + imageTintList = ColorStateList.valueOf(localSettings.accentColor.getOnboardingSecondaryBackground(context)) + } } enum class PermissionType( diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index 2cc07864a0..dc12c44008 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -24,6 +24,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.viewpager2.widget.ViewPager2 +import com.infomaniak.lib.core.utils.context import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.safeNavigate import com.infomaniak.mail.R @@ -76,6 +77,8 @@ class PermissionsOnboardingPagerFragment : Fragment() { 1 -> permissionUtils.requestNotificationsPermissionIfNeeded { leaveOnboarding() } } } + + requireActivity().window.statusBarColor = localSettings.accentColor.getOnboardingSecondaryBackground(context) } private fun ViewPager2.isLastPage() = adapter?.let { currentItem == it.itemCount - 1 } ?: true diff --git a/app/src/main/res/layout/fragment_permissions_onboarding.xml b/app/src/main/res/layout/fragment_permissions_onboarding.xml index 92eb765500..313f6288fa 100644 --- a/app/src/main/res/layout/fragment_permissions_onboarding.xml +++ b/app/src/main/res/layout/fragment_permissions_onboarding.xml @@ -15,99 +15,104 @@ ~ You should have received a copy of the GNU General Public License ~ along with this program. If not, see . --> - + android:fillViewport="true"> - + android:layout_height="match_parent"> - + + + - + - + - + - + - + - + - + + diff --git a/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml b/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml index 0253b57fb3..2c5546ff6f 100644 --- a/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml +++ b/app/src/main/res/layout/fragment_permissions_onboarding_pager.xml @@ -15,46 +15,33 @@ ~ You should have received a copy of the GNU General Public License ~ along with this program. If not, see . --> - - - + android:fillViewport="true"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:context=".ui.main.onboarding.PermissionsOnboardingPagerFragment"> - + app:layout_constraintTop_toTopOf="parent" /> + + app:layout_constraintTop_toTopOf="@id/bottomGuideLine" /> - + From 2829fe81debd8222aa9147ae4580d3d8b41d98a0 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Thu, 18 Jan 2024 15:12:38 +0100 Subject: [PATCH 12/16] feat(PermissionsOnboarding): Persist the position when recreating the activity --- .../ui/main/onboarding/PermissionsOnboardingPagerFragment.kt | 3 +++ .../mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index dc12c44008..8b31f7c072 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -40,6 +40,7 @@ import javax.inject.Inject class PermissionsOnboardingPagerFragment : Fragment() { private var binding: FragmentPermissionsOnboardingPagerBinding by safeBinding() + private val permissionsOnboardingViewModel: PermissionsOnboardingViewModel by activityViewModels() private val mainViewModel: MainViewModel by activityViewModels() @Inject @@ -63,10 +64,12 @@ class PermissionsOnboardingPagerFragment : Fragment() { permissionsViewpager.apply { adapter = PermissionsPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) isUserInputEnabled = false + setCurrentItem(permissionsOnboardingViewModel.currentPermissionPosition, false) removeOverScrollForApiBelow31() } continueButton.setOnClickListener { + permissionsOnboardingViewModel.currentPermissionPosition = permissionsViewpager.currentItem when (permissionsViewpager.currentItem) { 0 -> { permissionUtils.requestReadContactsPermission { hasPermission -> diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt index 6f6a391326..e4a136f49d 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt @@ -18,10 +18,9 @@ package com.infomaniak.mail.ui.main.onboarding import androidx.lifecycle.ViewModel -import com.infomaniak.mail.ui.main.onboarding.PermissionsOnboardingFragment.PermissionType class PermissionsOnboardingViewModel : ViewModel() { - var currentPermission: PermissionType = PermissionType.CONTACTS + var currentPermissionPosition: Int = 0 } From 0838dda104082c408f721ba043ec85a047b1c6a9 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Thu, 18 Jan 2024 16:49:48 +0100 Subject: [PATCH 13/16] feat(PermissionsOnboarding): Manage Accent color --- .../PermissionsOnboardingFragment.kt | 26 +- ...ustration_onboarding_contacts_material.xml | 108 ++++++ .../illustration_onboarding_notifications.xml | 347 +++++++++--------- ...stration_onboarding_notifications_blue.xml | 347 +++++++++--------- ...tion_onboarding_notifications_material.xml | 200 ++++++++++ ...ustration_onboarding_contacts_material.xml | 108 ++++++ .../illustration_onboarding_notifications.xml | 341 +++++++++-------- ...stration_onboarding_notifications_blue.xml | 341 +++++++++-------- ...tion_onboarding_notifications_material.xml | 197 ++++++++++ 9 files changed, 1315 insertions(+), 700 deletions(-) create mode 100644 app/src/main/res/drawable-night/illustration_onboarding_contacts_material.xml create mode 100644 app/src/main/res/drawable-night/illustration_onboarding_notifications_material.xml create mode 100644 app/src/main/res/drawable/illustration_onboarding_contacts_material.xml create mode 100644 app/src/main/res/drawable/illustration_onboarding_notifications_material.xml diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt index ecd0964b17..d0bef9042a 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt @@ -29,6 +29,7 @@ import androidx.navigation.fragment.navArgs import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.mail.R import com.infomaniak.mail.data.LocalSettings +import com.infomaniak.mail.data.LocalSettings.* import com.infomaniak.mail.databinding.FragmentPermissionsOnboardingBinding import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -53,7 +54,7 @@ class PermissionsOnboardingFragment : Fragment() { private fun setPermissionUi() = with(binding) { val permission = if (navigationArgs.position == 0) PermissionType.CONTACTS else PermissionType.NOTIFICATIONS - iconLayout.setImageResource(permission.iconRes) + iconLayout.setImageResource(getIconResWithAccentColor(permission)) title.setText(permission.titleRes) description.setText(permission.descritionRes) waveBackground.apply { @@ -62,23 +63,36 @@ class PermissionsOnboardingFragment : Fragment() { } } + + private fun getIconResWithAccentColor(permission: PermissionType) = when (localSettings.accentColor) { + AccentColor.PINK -> permission.pinkIconRes + AccentColor.BLUE -> permission.blueIconRes + AccentColor.SYSTEM -> permission.systemIconRes + } + enum class PermissionType( - @DrawableRes val iconRes: Int, + @DrawableRes val pinkIconRes: Int, + @DrawableRes val blueIconRes: Int, + @DrawableRes val systemIconRes: Int, @StringRes val titleRes: Int, @StringRes val descritionRes: Int, @DrawableRes val waveRes: Int, ) { CONTACTS( - iconRes = R.drawable.illustration_onboarding_contacts, + pinkIconRes = R.drawable.illustration_onboarding_contacts, + blueIconRes = R.drawable.illustration_onboarding_contacts_blue, + systemIconRes = R.drawable.illustration_onboarding_contacts_material, titleRes = R.string.onBoardingContactsTitle, descritionRes = R.string.onBoardingContactsDescription, - waveRes = R.drawable.ic_back_wave_1 + waveRes = R.drawable.ic_back_wave_1, ), NOTIFICATIONS( - iconRes = R.drawable.illustration_onboarding_notifications, + pinkIconRes = R.drawable.illustration_onboarding_notifications, + blueIconRes = R.drawable.illustration_onboarding_notifications_blue, + systemIconRes = R.drawable.illustration_onboarding_notifications_material, titleRes = R.string.onBoardingNotificationsTitle, descritionRes = R.string.onBoardingNotificationsDescription, - waveRes = R.drawable.ic_back_wave_2 + waveRes = R.drawable.ic_back_wave_2, ), } } diff --git a/app/src/main/res/drawable-night/illustration_onboarding_contacts_material.xml b/app/src/main/res/drawable-night/illustration_onboarding_contacts_material.xml new file mode 100644 index 0000000000..731705598e --- /dev/null +++ b/app/src/main/res/drawable-night/illustration_onboarding_contacts_material.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml b/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml index 066a59abcb..ee73889eec 100644 --- a/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml +++ b/app/src/main/res/drawable-night/illustration_onboarding_notifications.xml @@ -20,184 +20,181 @@ android:height="225dp" android:viewportWidth="378" android:viewportHeight="225"> + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:fillColor="#F2357A" + android:pathData="M156.2,109.56L161.37,111.12L158.77,113.39C158.57,113.56 158.27,113.5 158.15,113.28L156.2,109.56Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M156.32,135.03L161.49,136.59L158.89,138.86C158.69,139.03 158.39,138.98 158.27,138.75L156.32,135.03Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M188,53L201.72,57.13L194.82,63.15C194.31,63.6 193.5,63.45 193.18,62.85L188,53Z" /> + + + + diff --git a/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml b/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml index 10089b3257..614707357e 100644 --- a/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml +++ b/app/src/main/res/drawable-night/illustration_onboarding_notifications_blue.xml @@ -20,184 +20,181 @@ android:height="225dp" android:viewportWidth="378" android:viewportHeight="225"> + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:fillColor="#F2357A" + android:pathData="M156.2,109.56L161.37,111.12L158.77,113.39C158.57,113.56 158.27,113.5 158.15,113.28L156.2,109.56Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M156.32,135.03L161.49,136.59L158.89,138.86C158.69,139.03 158.39,138.98 158.27,138.75L156.32,135.03Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M188,53L201.72,57.13L194.82,63.15C194.31,63.6 193.5,63.45 193.18,62.85L188,53Z" /> + + + + diff --git a/app/src/main/res/drawable-night/illustration_onboarding_notifications_material.xml b/app/src/main/res/drawable-night/illustration_onboarding_notifications_material.xml new file mode 100644 index 0000000000..398121cf1f --- /dev/null +++ b/app/src/main/res/drawable-night/illustration_onboarding_notifications_material.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_contacts_material.xml b/app/src/main/res/drawable/illustration_onboarding_contacts_material.xml new file mode 100644 index 0000000000..8631a85440 --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_contacts_material.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_notifications.xml b/app/src/main/res/drawable/illustration_onboarding_notifications.xml index 458bbcf147..fab689867f 100644 --- a/app/src/main/res/drawable/illustration_onboarding_notifications.xml +++ b/app/src/main/res/drawable/illustration_onboarding_notifications.xml @@ -20,181 +20,178 @@ android:height="225dp" android:viewportWidth="378" android:viewportHeight="225"> + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:fillColor="#F2357A" + android:pathData="M156.2,109.56L161.37,111.12L158.77,113.39C158.57,113.56 158.27,113.5 158.15,113.28L156.2,109.56Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M156.32,135.03L161.49,136.59L158.89,138.86C158.69,139.03 158.39,138.98 158.27,138.75L156.32,135.03Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M188,53L201.72,57.13L194.82,63.15C194.31,63.6 193.5,63.45 193.18,62.85L188,53Z" /> + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml b/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml index 29bbc0e779..4d6bb96db2 100644 --- a/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml +++ b/app/src/main/res/drawable/illustration_onboarding_notifications_blue.xml @@ -20,181 +20,178 @@ android:height="225dp" android:viewportWidth="378" android:viewportHeight="225"> + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:fillColor="#F2357A" + android:pathData="M155.87,109.25L161.04,110.81L158.44,113.07C158.25,113.24 157.94,113.19 157.82,112.96L155.87,109.25Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M155.99,134.72L161.17,136.28L158.56,138.55C158.37,138.72 158.07,138.66 157.95,138.43L155.99,134.72Z" /> + + + + + + + + + + + + + android:fillColor="#F2357A" + android:pathData="M187.69,52.87L201.46,56.99L194.53,62.99C194.02,63.44 193.21,63.29 192.89,62.69L187.69,52.87Z" /> + + + + diff --git a/app/src/main/res/drawable/illustration_onboarding_notifications_material.xml b/app/src/main/res/drawable/illustration_onboarding_notifications_material.xml new file mode 100644 index 0000000000..99844583c6 --- /dev/null +++ b/app/src/main/res/drawable/illustration_onboarding_notifications_material.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7509998da6913179d2ccd888e99e7f3a8cb8a706 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Mon, 22 Jan 2024 16:11:09 +0100 Subject: [PATCH 14/16] feat(PermissionsOnboarding): Fix sync discovery and permissions being displayed over onboarding when recreating activity --- .../com/infomaniak/mail/data/LocalSettings.kt | 1 + .../com/infomaniak/mail/ui/MainActivity.kt | 16 ++++++++---- .../PermissionsOnboardingPagerFragment.kt | 24 +++++++++++++---- .../PermissionsOnboardingViewModel.kt | 26 ------------------- 4 files changed, 31 insertions(+), 36 deletions(-) delete mode 100644 app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt diff --git a/app/src/main/java/com/infomaniak/mail/data/LocalSettings.kt b/app/src/main/java/com/infomaniak/mail/data/LocalSettings.kt index 6f7e751594..860e14516b 100644 --- a/app/src/main/java/com/infomaniak/mail/data/LocalSettings.kt +++ b/app/src/main/java/com/infomaniak/mail/data/LocalSettings.kt @@ -67,6 +67,7 @@ class LocalSettings private constructor(context: Context) : SharedValues { var showSyncDiscoveryBottomSheet by sharedValue("showSyncDiscoveryBottomSheetKey", true) var appReviewLaunches by sharedValue("appReviewLaunchesKey", DEFAULT_APP_REVIEW_LAUNCHES) var showAppReviewDialog by sharedValue("showAppReviewDialogKey", true) + var showPermissionsOnboarding by sharedValue("showPermissionsOnboardingKey", true) fun removeSettings() = sharedPreferences.transaction { clear() } diff --git a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt index 0fed776ef3..9e64e682b8 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt @@ -69,6 +69,7 @@ import com.infomaniak.mail.ui.alertDialogs.TitleAlertDialog import com.infomaniak.mail.ui.main.SnackbarManager import com.infomaniak.mail.ui.main.folder.TwoPaneFragment import com.infomaniak.mail.ui.main.menu.MenuDrawerFragment +import com.infomaniak.mail.ui.main.onboarding.PermissionsOnboardingPagerFragment import com.infomaniak.mail.ui.newMessage.NewMessageActivity import com.infomaniak.mail.ui.sync.SyncAutoConfigActivity import com.infomaniak.mail.utils.* @@ -368,8 +369,11 @@ class MainActivity : BaseActivity() { } fun popBack() { - val fragment = currentFragment - if (fragment is TwoPaneFragment) fragment.handleOnBackPressed() else navController.popBackStack() + when (val fragment = currentFragment) { + is TwoPaneFragment -> fragment.handleOnBackPressed() + is PermissionsOnboardingPagerFragment -> fragment.leaveOnboarding() + else -> navController.popBackStack() + } } onBackPressedDispatcher.addCallback(this@MainActivity) { @@ -485,8 +489,10 @@ class MainActivity : BaseActivity() { private fun managePermissionsRequesting() { if (!hasPermissions(PermissionUtils.getMainPermissions(mustRequireNotification = true))) { - if (localSettings.appLaunches == 0) { - navController.navigate(R.id.permissionsOnboardingPagerFragment) + if (localSettings.showPermissionsOnboarding) { + if (currentFragment !is PermissionsOnboardingPagerFragment) { + navController.navigate(R.id.permissionsOnboardingPagerFragment) + } } else { permissionUtils.requestMainPermissionsIfNeeded() } @@ -518,7 +524,7 @@ class MainActivity : BaseActivity() { } private fun showSyncDiscovery() = with(localSettings) { - if (showSyncDiscoveryBottomSheet && appLaunches > 1 && !isUserAlreadySynchronized()) { + if (!showPermissionsOnboarding && showSyncDiscoveryBottomSheet && appLaunches > 1 && !isUserAlreadySynchronized()) { showSyncDiscoveryBottomSheet = false navController.navigate(R.id.syncDiscoveryBottomSheetDialog) } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt index 8b31f7c072..d57e99621f 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingPagerFragment.kt @@ -40,8 +40,8 @@ import javax.inject.Inject class PermissionsOnboardingPagerFragment : Fragment() { private var binding: FragmentPermissionsOnboardingPagerBinding by safeBinding() - private val permissionsOnboardingViewModel: PermissionsOnboardingViewModel by activityViewModels() private val mainViewModel: MainViewModel by activityViewModels() + private var currentPosition = 0 @Inject lateinit var localSettings: LocalSettings @@ -64,17 +64,21 @@ class PermissionsOnboardingPagerFragment : Fragment() { permissionsViewpager.apply { adapter = PermissionsPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) isUserInputEnabled = false - setCurrentItem(permissionsOnboardingViewModel.currentPermissionPosition, false) + savedInstanceState?.getInt(VIEW_PAGER_POSITION_KEY)?.let { setCurrentItem(it, false) } removeOverScrollForApiBelow31() } continueButton.setOnClickListener { - permissionsOnboardingViewModel.currentPermissionPosition = permissionsViewpager.currentItem when (permissionsViewpager.currentItem) { 0 -> { permissionUtils.requestReadContactsPermission { hasPermission -> if (hasPermission) mainViewModel.updateUserInfo() - if (permissionsViewpager.isLastPage()) leaveOnboarding() else permissionsViewpager.currentItem += 1 + if (permissionsViewpager.isLastPage()) { + leaveOnboarding() + } else { + currentPosition += 1 + permissionsViewpager.currentItem += 1 + } } } 1 -> permissionUtils.requestNotificationsPermissionIfNeeded { leaveOnboarding() } @@ -84,9 +88,19 @@ class PermissionsOnboardingPagerFragment : Fragment() { requireActivity().window.statusBarColor = localSettings.accentColor.getOnboardingSecondaryBackground(context) } + override fun onSaveInstanceState(outState: Bundle) { + outState.putInt(VIEW_PAGER_POSITION_KEY, currentPosition) + super.onSaveInstanceState(outState) + } + private fun ViewPager2.isLastPage() = adapter?.let { currentItem == it.itemCount - 1 } ?: true - private fun leaveOnboarding() { + fun leaveOnboarding() { + localSettings.showPermissionsOnboarding = false safeNavigate(R.id.threadListFragment) } + + companion object { + private const val VIEW_PAGER_POSITION_KEY = "viewPagerPositionKey" + } } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt deleted file mode 100644 index e4a136f49d..0000000000 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingViewModel.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Infomaniak Mail - Android - * Copyright (C) 2024 Infomaniak Network SA - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.infomaniak.mail.ui.main.onboarding - -import androidx.lifecycle.ViewModel - - -class PermissionsOnboardingViewModel : ViewModel() { - - var currentPermissionPosition: Int = 0 -} From 4a5c70f143b9bf421d222b9dc2c0aa7f933bfdcd Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Mon, 29 Jan 2024 09:18:58 +0100 Subject: [PATCH 15/16] chores(PR): Apply suggestions --- .../java/com/infomaniak/mail/ui/MainActivity.kt | 14 +++++++------- .../onboarding/PermissionsOnboardingFragment.kt | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt index 9e64e682b8..34260e7110 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt @@ -488,14 +488,14 @@ class MainActivity : BaseActivity() { } private fun managePermissionsRequesting() { - if (!hasPermissions(PermissionUtils.getMainPermissions(mustRequireNotification = true))) { - if (localSettings.showPermissionsOnboarding) { - if (currentFragment !is PermissionsOnboardingPagerFragment) { - navController.navigate(R.id.permissionsOnboardingPagerFragment) - } - } else { - permissionUtils.requestMainPermissionsIfNeeded() + if (hasPermissions(PermissionUtils.getMainPermissions(mustRequireNotification = true))) return + + if (localSettings.showPermissionsOnboarding) { + if (currentFragment !is PermissionsOnboardingPagerFragment) { + navController.navigate(R.id.permissionsOnboardingPagerFragment) } + } else { + permissionUtils.requestMainPermissionsIfNeeded() } } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt index d0bef9042a..f07d5648db 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/onboarding/PermissionsOnboardingFragment.kt @@ -63,7 +63,6 @@ class PermissionsOnboardingFragment : Fragment() { } } - private fun getIconResWithAccentColor(permission: PermissionType) = when (localSettings.accentColor) { AccentColor.PINK -> permission.pinkIconRes AccentColor.BLUE -> permission.blueIconRes From 4dc6c3bedb6084739fd964bf4cb275ab8a224534 Mon Sep 17 00:00:00 2001 From: Fabian Devel Date: Tue, 30 Jan 2024 12:52:42 +0100 Subject: [PATCH 16/16] chores(PR): Apply suggestions --- .idea/navEditor.xml | 237 ++++++++---------- .../PermissionsOnboardingPagerFragment.kt | 4 +- .../onboarding/PermissionsPagerAdapter.kt | 12 +- .../infomaniak/mail/utils/PermissionUtils.kt | 5 +- .../illustration_onboarding_contacts.xml | 91 +++---- .../illustration_onboarding_contacts_blue.xml | 103 ++++---- ...ustration_onboarding_contacts_material.xml | 89 ++++--- .../illustration_onboarding_notifications.xml | 14 -- ...stration_onboarding_notifications_blue.xml | 14 -- ...tion_onboarding_notifications_material.xml | 14 -- .../illustration_onboarding_contacts.xml | 83 +++--- .../illustration_onboarding_contacts_blue.xml | 89 ++++--- ...ustration_onboarding_contacts_material.xml | 91 +++---- .../illustration_onboarding_notifications.xml | 14 -- ...stration_onboarding_notifications_blue.xml | 14 -- ...tion_onboarding_notifications_material.xml | 14 -- .../fragment_permissions_onboarding_pager.xml | 6 +- .../main/res/navigation/main_navigation.xml | 6 +- 18 files changed, 416 insertions(+), 484 deletions(-) diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index 926609d7dd..8ef978dfdc 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -100,8 +100,8 @@ @@ -112,8 +112,8 @@ @@ -487,8 +518,8 @@