Skip to content
Snippets Groups Projects
Verified Commit 928bc0ff authored by Torsten Grote's avatar Torsten Grote
Browse files

Add Hilt and inject new MailboxNotificationManager

parent b8fa6504
No related branches found
No related tags found
1 merge request!2Add Hilt and inject new MailboxNotificationManager
buildscript { buildscript {
ext.kotlin_version = "1.5.21" ext.kotlin_version = "1.5.21"
ext.hilt_version = "2.37"
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
...@@ -7,6 +8,7 @@ buildscript { ...@@ -7,6 +8,7 @@ buildscript {
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.2.2' classpath 'com.android.tools.build:gradle:4.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
} }
} }
......
...@@ -2,6 +2,7 @@ plugins { ...@@ -2,6 +2,7 @@ plugins {
id 'com.android.application' id 'com.android.application'
id 'kotlin-android' id 'kotlin-android'
id 'kotlin-kapt' id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
} }
android { android {
...@@ -35,11 +36,22 @@ android { ...@@ -35,11 +36,22 @@ android {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'com.google.dagger:dagger:2.37' implementation 'androidx.appcompat:appcompat:1.3.0'
kapt 'com.google.dagger:dagger-compiler:2.37' implementation "androidx.activity:activity-ktx:1.2.3"
implementation 'androidx.appcompat:appcompat:1.0.0' implementation "androidx.fragment:fragment-ktx:1.3.5"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.13.1' def lifecycle_version = "2.3.1"
androidTestImplementation 'androidx.test.ext:junit:1.1.1' implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
} }
package org.briarproject.mailbox package org.briarproject.mailbox
import android.app.Application import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class MailboxApplication : Application() { class MailboxApplication : Application() {
val appComponent = DaggerApplicationComponent.create()
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
MailboxService.startService(this, "Waiting for messages") MailboxService.startService(this)
} }
} }
package org.briarproject.mailbox
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.NotificationManager.IMPORTANCE_LOW
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationCompat.PRIORITY_MIN
import androidx.core.content.ContextCompat.getSystemService
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
class MailboxNotificationManager @Inject constructor(
@ApplicationContext private val ctx: Context,
) {
companion object {
private const val CHANNEL_ID = "Briar Mailbox Service"
const val NOTIFICATION_MAIN_ID = 1
}
private val nm = getSystemService(ctx, NotificationManager::class.java)!!
init {
if (Build.VERSION.SDK_INT >= 26) createNotificationChannels()
}
@RequiresApi(26)
private fun createNotificationChannels() {
val channels = listOf(
NotificationChannel(
CHANNEL_ID,
ctx.getString(R.string.notification_channel_name),
IMPORTANCE_LOW,
)
)
nm.createNotificationChannels(channels)
}
val serviceNotification: Notification
get() {
val notificationIntent = Intent(ctx, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
ctx, 0, notificationIntent, 0
)
return NotificationCompat.Builder(ctx, CHANNEL_ID)
.setContentTitle(ctx.getString(R.string.notification_mailbox_running))
.setContentText("Waiting for messages...")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentIntent(pendingIntent)
.setPriority(PRIORITY_MIN)
.build()
}
}
package org.briarproject.mailbox package org.briarproject.mailbox
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service import android.app.Service
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build.VERSION
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION_CODES
import android.os.IBinder import android.os.IBinder
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import dagger.hilt.android.AndroidEntryPoint
import org.briarproject.mailbox.MailboxNotificationManager.Companion.NOTIFICATION_MAIN_ID
import javax.inject.Inject
@AndroidEntryPoint
class MailboxService : Service() { class MailboxService : Service() {
companion object { companion object {
fun startService(context: Context) {
private const val CHANNEL_ID = "Briar Mailbox Service"
private const val ARG_MESSAGE = "message"
private const val NOTIFICATION_MAIN_ID = 1
fun startService(context: Context, message: String) {
val startIntent = Intent(context, MailboxService::class.java) val startIntent = Intent(context, MailboxService::class.java)
startIntent.putExtra(ARG_MESSAGE, message)
ContextCompat.startForegroundService(context, startIntent) ContextCompat.startForegroundService(context, startIntent)
} }
...@@ -35,22 +24,11 @@ class MailboxService : Service() { ...@@ -35,22 +24,11 @@ class MailboxService : Service() {
} }
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @Inject
val input = intent?.getStringExtra(ARG_MESSAGE) lateinit var notificationManager: MailboxNotificationManager
createNotificationChannel()
val notificationIntent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
this, 0, notificationIntent, 0
)
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle(getString(R.string.notification_mailbox_running))
.setContentText(input)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentIntent(pendingIntent)
.build()
startForeground(NOTIFICATION_MAIN_ID, notification) override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
startForeground(NOTIFICATION_MAIN_ID, notificationManager.serviceNotification)
return START_NOT_STICKY return START_NOT_STICKY
} }
...@@ -58,15 +36,4 @@ class MailboxService : Service() { ...@@ -58,15 +36,4 @@ class MailboxService : Service() {
return null return null
} }
private fun createNotificationChannel() {
if (SDK_INT >= 26) {
val serviceChannel = NotificationChannel(
CHANNEL_ID, getString(R.string.notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT
)
val manager = getSystemService(NotificationManager::class.java)
manager!!.createNotificationChannel(serviceChannel)
}
}
} }
package org.briarproject.mailbox package org.briarproject.mailbox
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.SavedStateHandle
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject import javax.inject.Inject
class MailboxViewModel @Inject constructor() { @HiltViewModel
class MailboxViewModel @Inject constructor(
app: Application,
handle: SavedStateHandle,
) : AndroidViewModel(app) {
val text = "Hello Mailbox" private val _text = handle.getLiveData("text", "Hello Mailbox")
val text: LiveData<String> = _text
fun updateText(str: String) {
_text.value = str
}
} }
package org.briarproject.mailbox package org.briarproject.mailbox
import android.os.Bundle import android.os.Bundle
import android.widget.Button
import android.widget.TextView import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import javax.inject.Inject import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
lateinit var applicationComponent: ApplicationComponent private val viewModel: MailboxViewModel by viewModels()
@Inject
lateinit var mailboxViewModel: MailboxViewModel
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
(applicationContext as MailboxApplication).appComponent.inject(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
val textView = findViewById<TextView>(R.id.text) val textView = findViewById<TextView>(R.id.text)
textView.text = mailboxViewModel.text val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
viewModel.updateText("Tested")
}
viewModel.text.observe(this, { text ->
textView.text = text
})
} }
} }
...@@ -16,4 +16,14 @@ ...@@ -16,4 +16,14 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Test"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment