Skip to content

Commit

Permalink
feat: Added modular notification handling according to FSD structure
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielGreenEngineer committed Nov 6, 2024
1 parent 94b8513 commit 05283ad
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 27 deletions.
2 changes: 1 addition & 1 deletion personalization-sdk/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
</intent-filter>
</service>
<receiver
android:name=".notification.NotificationBroadcastReceiver"
android:name=".notification.domain.NotificationBroadcastReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import com.personalization.api.managers.RecommendationManager
import com.personalization.api.managers.SearchManager
import com.personalization.api.managers.TrackEventManager
import com.personalization.di.DaggerSdkComponent
import com.personalization.notification.NotificationHandler
import com.personalization.notification.NotificationHelper
import com.personalization.notification.core.NotificationHandler
import com.personalization.notification.core.NotificationHelper
import com.personalization.sdk.domain.usecases.network.AddTaskToQueueUseCase
import com.personalization.sdk.domain.usecases.network.InitNetworkUseCase
import com.personalization.sdk.domain.usecases.network.SendNetworkMethodUseCase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.personalization.notification
package com.personalization.notification.core

import android.app.NotificationChannel
import android.app.NotificationManager
Expand All @@ -9,9 +9,9 @@ import android.util.Log
import com.google.firebase.messaging.RemoteMessage
import com.personalization.R
import com.personalization.sdk.domain.usecases.notification.UpdateNotificationSourceUseCase
import javax.inject.Inject
import org.json.JSONException
import org.json.JSONObject
import javax.inject.Inject

class NotificationHandler @Inject constructor(
private val updateSourceUseCase: UpdateNotificationSourceUseCase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package com.personalization.notification
@file:Suppress("PackageDirectoryMismatch")

package com.personalization.notification.core

import android.app.NotificationManager
import android.app.PendingIntent
Expand All @@ -11,6 +13,7 @@ import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import com.personalization.R
import com.personalization.SDK
import com.personalization.notification.domain.NotificationBroadcastReceiver
import java.io.IOException
import java.io.InputStream
import java.net.URL
Expand All @@ -34,6 +37,29 @@ object NotificationHelper {

private val requestCodeGenerator = RequestCodeGenerator

/**
* Creates a notification using `RemoteViews` for custom design.
*
* Only a limited set of standard components
* (`TextView`, `ImageView`, `LinearLayout`, etc.) are allowed in `RemoteViews`, since notifications may
* appear in system areas such as the notification panel, lock screen,
* and widgets, where custom `View` is not supported.
*
* The restriction on using custom components is due to security
* and optimization requirements, since notifications are rendered outside the context of the application and must
* be compatible with Android system mechanisms. Custom `View`, such as custom components derived from `TextView` or `ImageView`, cannot
* be used in `RemoteViews`. *
* In this method, instead of custom `View`, it is recommended to:
* - Use standard `TextView` and `ImageView`, and configure them programmatically via the `RemoteViews` API.
* - If necessary, create a `Bitmap` with a custom design (for example, with text)
* and display it via `ImageView`.
*
* @param context Application context for accessing resources and system services.
* @param data Data for filling the notification title and text.
* @param images List of images to display in the notification (if available).
* @param currentIndex Index of the current image in the `images` list, if multiple images are used.
*/

fun createNotification(
context: Context,
data: Map<String, String?>,
Expand Down Expand Up @@ -123,7 +149,7 @@ object NotificationHelper {
}
return PendingIntent.getBroadcast(
context,
requestCodeGenerator.generateRequestCode(action, newIndex),
RequestCodeGenerator.generateRequestCode(action, newIndex),
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.personalization.notification
package com.personalization.notification.core

import kotlin.math.abs

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.personalization.notification
package com.personalization.notification.domain

import android.content.BroadcastReceiver
import android.content.Context
Expand All @@ -7,12 +7,12 @@ import androidx.work.Data
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
import com.personalization.SDK
import com.personalization.notification.NotificationHelper.ACTION_NEXT_IMAGE
import com.personalization.notification.NotificationHelper.ACTION_PREVIOUS_IMAGE
import com.personalization.notification.NotificationHelper.CURRENT_IMAGE_INDEX
import com.personalization.notification.NotificationHelper.NOTIFICATION_BODY
import com.personalization.notification.NotificationHelper.NOTIFICATION_IMAGES
import com.personalization.notification.NotificationHelper.NOTIFICATION_TITLE
import com.personalization.notification.core.NotificationHelper.ACTION_NEXT_IMAGE
import com.personalization.notification.core.NotificationHelper.ACTION_PREVIOUS_IMAGE
import com.personalization.notification.core.NotificationHelper.CURRENT_IMAGE_INDEX
import com.personalization.notification.core.NotificationHelper.NOTIFICATION_BODY
import com.personalization.notification.core.NotificationHelper.NOTIFICATION_IMAGES
import com.personalization.notification.core.NotificationHelper.NOTIFICATION_TITLE

class NotificationBroadcastReceiver : BroadcastReceiver() {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.personalization.notification
package com.personalization.notification.domain

import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.personalization.SDK
import com.personalization.notification.core.NotificationHelper
import java.io.IOException

class UpdateNotificationWorker(
Expand Down
12 changes: 12 additions & 0 deletions personalization-sdk/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<resources>
<declare-styleable name="NotificationTextViewStyle">
<attr name="customText" format="string" />
<attr name="customTextSize" format="dimension" />
<attr name="customTextStyle" format="integer" />
</declare-styleable>

<declare-styleable name="NotificationImageViewStyle">
<attr name="imageSrc" format="reference" />
<attr name="imageVisibility" format="boolean" />
</declare-styleable>
</resources>
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.rees46.sdk

import android.content.Context
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import com.personalization.BuildConfig
import com.personalization.SDK
import com.personalization.notification.NotificationHelper
import com.personalization.notification.core.NotificationHelper
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ import androidx.core.content.ContextCompat
import com.personalization.OnClickListener
import com.personalization.Product
import com.personalization.SDK
import com.personalization.notification.NotificationHelper
import com.personalization.notification.NotificationHelper.NOTIFICATION_BODY
import com.personalization.notification.NotificationHelper.NOTIFICATION_IMAGES
import com.personalization.notification.NotificationHelper.NOTIFICATION_TITLE
import com.personalization.notification.NotificationHelper.loadBitmaps
import com.personalization.notification.core.NotificationHelper
import com.personalization.notification.core.NotificationHelper.NOTIFICATION_BODY
import com.personalization.notification.core.NotificationHelper.NOTIFICATION_IMAGES
import com.personalization.notification.core.NotificationHelper.NOTIFICATION_TITLE
import com.personalization.notification.core.NotificationHelper.loadBitmaps
import com.personalization.stories.views.StoriesView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package com.personalization.sample
import android.app.Application
import android.util.Log
import com.personalization.SDK
import com.personalization.notification.NotificationHelper
import com.personalization.notification.NotificationHelper.createNotification
import com.personalization.notification.NotificationHelper.loadBitmaps
import com.personalization.notification.core.NotificationHelper
import com.personalization.notification.core.NotificationHelper.createNotification
import com.personalization.notification.core.NotificationHelper.loadBitmaps
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
Expand Down

0 comments on commit 05283ad

Please sign in to comment.