diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 79c2185d0a..ea857c0029 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -275,7 +275,7 @@ class ConversationsListActivity : adapter!!.addListener(this) prepareViews() - updateNotificationWarning() + showNotificationWarning() showShareToScreen = hasActivityActionSendIntent() @@ -296,6 +296,11 @@ class ConversationsListActivity : loadUserAvatar(binding.switchAccountButton) viewThemeUtils.material.colorMaterialTextButton(binding.switchAccountButton) viewThemeUtils.material.themeCardView(binding.conversationListHintInclude.hintLayoutCardview) + viewThemeUtils.material.themeCardView(binding.conversationListNotificationWarning.hintLayoutCardview) + viewThemeUtils.material.colorMaterialButtonText(binding.conversationListNotificationWarning.notNowButton) + viewThemeUtils.material.colorMaterialButtonText( + binding.conversationListNotificationWarning.showSettingsButton + ) searchBehaviorSubject.onNext(false) fetchRooms() fetchPendingInvitations() @@ -307,14 +312,6 @@ class ConversationsListActivity : showSearchOrToolbar() } - private fun updateNotificationWarning() { - if (shouldShowNotificationWarning()) { - showNotificationWarning() - } else { - binding.chatListNotificationWarning.visibility = View.GONE - } - } - private fun initObservers() { this.lifecycleScope.launch { networkMonitor.isOnline.onEach { isOnline -> @@ -1502,17 +1499,46 @@ class ConversationsListActivity : } private fun showNotificationWarning() { - binding.chatListNotificationWarning.visibility = View.VISIBLE - binding.chatListNotificationWarning.setOnClickListener { - val bundle = Bundle() - bundle.putBoolean(KEY_SCROLL_TO_NOTIFICATION_CATEGORY, true) - val settingsIntent = Intent(context, SettingsActivity::class.java) - settingsIntent.putExtras(bundle) - startActivity(settingsIntent) + if (shouldShowNotificationWarning()) { + binding.conversationListNotificationWarning.conversationListHintLayout.visibility = View.VISIBLE + binding.conversationListNotificationWarning.notNowButton.setOnClickListener { + binding.conversationListNotificationWarning.conversationListHintLayout.visibility = View.GONE + val lastWarningDate = System.currentTimeMillis() + appPreferences.setNotificationWarningLastPostponedDate(lastWarningDate) + } + binding.conversationListNotificationWarning.showSettingsButton.setOnClickListener { + val bundle = Bundle() + bundle.putBoolean(KEY_SCROLL_TO_NOTIFICATION_CATEGORY, true) + val settingsIntent = Intent(context, SettingsActivity::class.java) + settingsIntent.putExtras(bundle) + startActivity(settingsIntent) + } + } else { + binding.conversationListNotificationWarning.conversationListHintLayout.visibility = View.GONE } } private fun shouldShowNotificationWarning(): Boolean { + fun shouldShowWarningIfDateTooOld(date1: Long): Boolean { + val currentTimeMillis = System.currentTimeMillis() + val differenceMillis = currentTimeMillis - date1 + val daysForWarningInMillis = TimeUnit.DAYS.toMillis(DAYS_FOR_NOTIFICATION_WARNING) + return differenceMillis > daysForWarningInMillis + } + + fun shouldShowNotificationWarningByUserChoice(): Boolean { + if (appPreferences.showRegularNotificationWarning) { + val lastWarningDate = appPreferences.getNotificationWarningLastPostponedDate() + return if (lastWarningDate == NOTIFICATION_WARNING_DATE_NOT_SET) { + true + } else { + shouldShowWarningIfDateTooOld(lastWarningDate) + } + } else { + return false + } + } + val notificationPermissionNotGranted = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !platformPermissionUtil.isPostNotificationsPermissionGranted() val batteryOptimizationNotIgnored = !PowerManagerUtils().isIgnoringBatteryOptimizations() @@ -1529,10 +1555,8 @@ class ConversationsListActivity : callsChannelNotEnabled || !serverNotificationAppInstalled - val userWantsToBeNotifiedAboutWrongSettings = appPreferences.getShowNotificationWarning() - return settingsOfUserAreWrong && - userWantsToBeNotifiedAboutWrongSettings && + shouldShowNotificationWarningByUserChoice() && ClosedInterfaceImpl().isGooglePlayServicesAvailable } @@ -1927,5 +1951,7 @@ class ConversationsListActivity : const val MAINTENANCE_MODE_HEADER_KEY = "X-Nextcloud-Maintenance-Mode" const val REQUEST_POST_NOTIFICATIONS_PERMISSION = 111 const val BADGE_OFFSET = 35 + const val DAYS_FOR_NOTIFICATION_WARNING = 5L + const val NOTIFICATION_WARNING_DATE_NOT_SET = 0L } } diff --git a/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt b/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt index 06dd2e80f0..11217b80ee 100644 --- a/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt @@ -54,6 +54,7 @@ import com.nextcloud.talk.api.NcApiCoroutines import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.setAppTheme import com.nextcloud.talk.conversationlist.ConversationsListActivity +import com.nextcloud.talk.conversationlist.ConversationsListActivity.Companion.NOTIFICATION_WARNING_DATE_NOT_SET import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivitySettingsBinding import com.nextcloud.talk.diagnose.DiagnoseActivity @@ -927,13 +928,16 @@ class SettingsActivity : private fun setupCheckables() { binding.settingsShowNotificationWarningSwitch.isChecked = - appPreferences.showNotificationWarning + appPreferences.showRegularNotificationWarning if (ClosedInterfaceImpl().isGooglePlayServicesAvailable) { binding.settingsShowNotificationWarning.setOnClickListener { val isChecked = binding.settingsShowNotificationWarningSwitch.isChecked binding.settingsShowNotificationWarningSwitch.isChecked = !isChecked - appPreferences.setShowNotificationWarning(!isChecked) + appPreferences.setShowRegularNotificationWarning(!isChecked) + if (!isChecked) { + appPreferences.setNotificationWarningLastPostponedDate(NOTIFICATION_WARNING_DATE_NOT_SET) + } } } else { binding.settingsShowNotificationWarning.visibility = View.GONE @@ -1427,5 +1431,6 @@ class SettingsActivity : private const val LINEBREAK = "\n" const val HTTP_CODE_OK: Int = 200 const val HTTP_ERROR_CODE_BAD_REQUEST: Int = 400 + const val NO_NOTIFICATION_REMINDER_WANTED = 0L } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index ffe3e063b9..7c23556ecb 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -178,9 +178,13 @@ public interface AppPreferences { void deleteAllMessageQueuesFor(String userId); - boolean getShowNotificationWarning(); + Long getNotificationWarningLastPostponedDate(); - void setShowNotificationWarning(boolean showNotificationWarning); + void setNotificationWarningLastPostponedDate(Long showNotificationWarning); + + Boolean getShowRegularNotificationWarning(); + + void setShowRegularNotificationWarning(boolean value); void clear(); } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt index 1b6725162c..99318715f6 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt @@ -392,6 +392,17 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { } } + override fun getShowRegularNotificationWarning (): Boolean { + return runBlocking { async { readBoolean(SHOW_REGULAR_NOTIFICATION_WARNING, true).first() } }.getCompleted() + } + + override fun setShowRegularNotificationWarning(value: Boolean) = + runBlocking { + async { + writeBoolean(SHOW_REGULAR_NOTIFICATION_WARNING, value) + } + } + override fun setPhoneBookIntegrationLastRun(currentTimeMillis: Long) = runBlocking { async { @@ -544,18 +555,14 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { } } - override fun getShowNotificationWarning(): Boolean { - return runBlocking { - async { - readBoolean(SHOW_NOTIFICATION_WARNING, true).first() - } - }.getCompleted() + override fun getNotificationWarningLastPostponedDate(): Long { + return runBlocking { async { readLong(LAST_NOTIFICATION_WARNING).first() } }.getCompleted() } - override fun setShowNotificationWarning(showNotificationWarning: Boolean) = + override fun setNotificationWarningLastPostponedDate(showNotificationWarning: Long) = runBlocking { async { - writeBoolean(SHOW_NOTIFICATION_WARNING, showNotificationWarning) + writeLong(LAST_NOTIFICATION_WARNING, showNotificationWarning) } } @@ -643,7 +650,8 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { const val PHONE_BOOK_INTEGRATION_LAST_RUN = "phone_book_integration_last_run" const val TYPING_STATUS = "typing_status" const val MESSAGE_QUEUE = "@message_queue" - const val SHOW_NOTIFICATION_WARNING = "show_notification_warning" + const val SHOW_REGULAR_NOTIFICATION_WARNING = "show_regular_notification_warning" + const val LAST_NOTIFICATION_WARNING = "last_notification_warning" private fun String.convertStringToArray(): Array { var varString = this val floatList = mutableListOf() diff --git a/app/src/main/res/layout/activity_conversations.xml b/app/src/main/res/layout/activity_conversations.xml index 7518b482d5..7cf3800b6a 100644 --- a/app/src/main/res/layout/activity_conversations.xml +++ b/app/src/main/res/layout/activity_conversations.xml @@ -37,18 +37,6 @@ android:visibility="gone" tools:visibility="visible" /> - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a4c02a73f3..e9513b882d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -182,9 +182,10 @@ How to translate with transifex: Ignore battery optimization Battery optimization is not ignored. This should be changed to make sure that notifications work in the background! Please click OK and select \"All apps\" -> %1$s -> Do not optimize - Show notification warning - When notifications are not set up correctly, show a warning + Show regular notification warning + When notifications are not set up correctly, show a regular warning Notifications are not set up correctly + Not now Meta information Generation of system report