Skip to content
22 changes: 21 additions & 1 deletion app/src/main/java/org/wikipedia/activity/BaseActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ package org.wikipedia.activity

import android.content.Intent
import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Bundle
import android.view.MenuItem
import android.view.MotionEvent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.ColorInt
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.pm.ShortcutManagerCompat
Expand Down Expand Up @@ -78,8 +80,25 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba
}
}

@RequiresApi(Build.VERSION_CODES.O)
Comment thread
rajvirsingh2 marked this conversation as resolved.
Outdated
private val notificationPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
// TODO: Show message(s) to the user if they deny the permission
if(!granted){
if(ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.POST_NOTIFICATIONS)){
//User denied once->Show Snackbar
FeedbackUtil.makeSnackbar(this, getString(R.string.notification_permission_rationale))
.setAction(R.string.notification_permission_rationale_action){
DeviceUtil.openNotificationSettings(this)
}
.show()
}else{
//User denied (with "Don't Ask Again")
FeedbackUtil.makeSnackbar(this, getString(R.string.notification_permission_denied))
.setAction(R.string.app_settings){
DeviceUtil.openNotificationSettings(this)
}
.show()
}
}
}

private val yearInReviewLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
Expand Down Expand Up @@ -193,6 +212,7 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba
BreadCrumbLogEvent.logScreenShown(this)
}

@RequiresApi(Build.VERSION_CODES.O)
Comment thread
rajvirsingh2 marked this conversation as resolved.
Outdated
override fun onStart() {
super.onStart()
NotificationPresenter.maybeRequestPermission(this, notificationPermissionLauncher)
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/org/wikipedia/util/DeviceUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package org.wikipedia.util

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.content.res.Resources
import android.graphics.Color
import android.net.ConnectivityManager
import android.os.Build
import android.os.Handler
import android.provider.Settings
import android.view.KeyCharacterMap
import android.view.KeyEvent
import android.view.View
Expand All @@ -16,6 +18,7 @@ import android.view.accessibility.AccessibilityManager
import android.view.inputmethod.InputMethodManager
import androidx.activity.enableEdgeToEdge
import androidx.annotation.ColorInt
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
Expand Down Expand Up @@ -107,6 +110,14 @@ object DeviceUtil {
WindowCompat.getInsetsController(activity.window, activity.window.decorView).isAppearanceLightStatusBars = !WikipediaApp.instance.currentTheme.isDark
}

@RequiresApi(Build.VERSION_CODES.O)
fun openNotificationSettings(context: Context){
val intent= Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE,context.packageName)
}
Comment on lines +112 to +121
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Formatting: this block deviates from standard Kotlin formatting (missing spaces after fun params / before {, around = and after commas, and } else { style). Since the project runs ktlint as part of check, this is likely to fail CI; please run ktlint/auto-format on this file.

Copilot uses AI. Check for mistakes.
context.startActivity(intent)
}

val isOnWiFi: Boolean
get() {
val info = (WikipediaApp.instance.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,9 @@
<string name="notifications_all_types_text">All types</string>
<string name="notifications_menu_user_talk_page">%s\'s talk page</string>
<string name="notifications_offline_disable_message">The function is not available while offline.</string>
<string name="notification_permission_rationale">Enable Notification to stay updated</string>
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

User-facing copy: Enable Notification to stay updated is grammatically incorrect (singular/plural) and reads like a title rather than a sentence. Consider adjusting to something like “Enable notifications to stay up to date.” (and match capitalization/punctuation style used by nearby strings).

Suggested change
<string name="notification_permission_rationale">Enable Notification to stay updated</string>
<string name="notification_permission_rationale">Enable notifications to stay up to date.</string>

Copilot uses AI. Check for mistakes.
<string name="notification_permission_rationale_action">Settings</string>
<string name="notification_permission_denied">Notifications are disabled. Enable them in settings.</string>
<!-- /Notifications -->

<!-- The Feed -->
Expand Down