Skip to content

Commit

Permalink
new notification warner
Browse files Browse the repository at this point in the history
Signed-off-by: Marcel Hibbe <[email protected]>
  • Loading branch information
mahibi committed Dec 2, 2024
1 parent 2340272 commit 22517c8
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ class ConversationsListActivity :
adapter!!.addListener(this)
prepareViews()

updateNotificationWarning()
showNotificationWarning()

showShareToScreen = hasActivityActionSendIntent()

Expand All @@ -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()
Expand All @@ -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 ->
Expand Down Expand Up @@ -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()
Expand All @@ -1529,10 +1555,8 @@ class ConversationsListActivity :
callsChannelNotEnabled ||
!serverNotificationAppInstalled

val userWantsToBeNotifiedAboutWrongSettings = appPreferences.getShowNotificationWarning()

return settingsOfUserAreWrong &&
userWantsToBeNotifiedAboutWrongSettings &&
shouldShowNotificationWarningByUserChoice() &&
ClosedInterfaceImpl().isGooglePlayServicesAvailable
}

Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Unit> {
async {
writeBoolean(SHOW_REGULAR_NOTIFICATION_WARNING, value)
}
}

override fun setPhoneBookIntegrationLastRun(currentTimeMillis: Long) =
runBlocking<Unit> {
async {
Expand Down Expand Up @@ -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<Unit> {
async {
writeBoolean(SHOW_NOTIFICATION_WARNING, showNotificationWarning)
writeLong(LAST_NOTIFICATION_WARNING, showNotificationWarning)
}
}

Expand Down Expand Up @@ -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<Float> {
var varString = this
val floatList = mutableListOf<Float>()
Expand Down
16 changes: 4 additions & 12 deletions app/src/main/res/layout/activity_conversations.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,6 @@
android:visibility="gone"
tools:visibility="visible" />

<com.google.android.material.textview.MaterialTextView
android:id="@+id/chat_list_notification_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/nc_warning"
android:gravity="center"
android:minHeight="40dp"
android:text="@string/nc_notification_warning"
android:textColor="@color/white"
android:visibility="gone"
tools:visibility="visible" />

<com.google.android.material.card.MaterialCardView
android:id="@+id/search_toolbar"
android:layout_width="match_parent"
Expand Down Expand Up @@ -238,6 +226,10 @@
android:id="@+id/conversation_list_hint_include"
layout="@layout/federated_invitation_hint" />

<include
android:id="@+id/conversation_list_notification_warning"
layout="@layout/notifications_warning" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
Expand Down
66 changes: 66 additions & 0 deletions app/src/main/res/layout/notifications_warning.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Nextcloud Talk - Android Client
~
~ SPDX-FileCopyrightText: 2024 Marcel Hibbe <[email protected]>
~ SPDX-License-Identifier: GPL-3.0-or-later
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/conversation_list_hint_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">

<com.google.android.material.card.MaterialCardView
android:id="@+id/hint_layout_cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/standard_margin"
android:layout_marginTop="@dimen/standard_half_margin"
android:layout_marginEnd="@dimen/standard_margin"
app:cardCornerRadius="8dp"
app:cardElevation="2dp"
app:strokeWidth="0dp">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/margin_between_elements">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/nc_notification_warning"
android:textAlignment="center" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:orientation="horizontal">

<com.google.android.material.button.MaterialButton
android:id="@+id/not_now_button"
style="@style/Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nc_not_now"/>

<com.google.android.material.button.MaterialButton
android:id="@+id/show_settings_button"
style="@style/Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nc_settings"/>
</LinearLayout>

</LinearLayout>
</com.google.android.material.card.MaterialCardView>

</LinearLayout>
5 changes: 3 additions & 2 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,10 @@ How to translate with transifex:

<string name="nc_ignore_battery_optimization_dialog_title">Ignore battery optimization</string>
<string name="nc_ignore_battery_optimization_dialog_text">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</string>
<string name="nc_show_notification_warning_title">Show notification warning</string>
<string name="nc_show_notification_warning_description">When notifications are not set up correctly, show a warning</string>
<string name="nc_show_notification_warning_title">Show regular notification warning</string>
<string name="nc_show_notification_warning_description">When notifications are not set up correctly, show a regular warning</string>
<string name="nc_notification_warning">Notifications are not set up correctly</string>
<string name="nc_not_now">Not now</string>

<string name="nc_diagnose_meta_category_title">Meta information</string>
<string name="nc_diagnose_meta_system_report_date">Generation of system report</string>
Expand Down

0 comments on commit 22517c8

Please sign in to comment.