Android progress notifications in Kotlin
(Indeterminate progress indicator and Fixed-duration progress indicator)
- Small Icon – Required, can be set with setSmallIcon().
- Application Name – Provided by the system.
- Time Stamp – Provided by the system but can be overridden.
- Large Icon – Optional, can be set with setLargeIcon().
- Title – Optional, can be set with setContentTitle().
- Text – Optional, can be set with setContentText().
Note : Notification Channels
App.kt
package com.gfg.progressnotificationdemo import android.app.Application import android.app.NotificationChannel import android.app.NotificationManager import android.os.Build class App : Application(){ val channelId = "Progress Notification" as String override fun onCreate(){ super .onCreate() createNotificationChannels() } //Check if the Android version is greater than 8. (Android Oreo) private fun createNotificationChannels(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel1 = NotificationChannel( channelId, "Progress Notification" , //IMPORTANCE_HIGH = shows a notification as peek notification. //IMPORTANCE_LOW = shows the notification in the status bar. NotificationManager.IMPORTANCE_HIGH ) channel1.description = "Progress Notification Channel" val manager = getSystemService( NotificationManager:: class .java ) manager.createNotificationChannel(channel1) } } } |
MainActivity.kt
package com.gfg.progressnotificationdemo import android.app.PendingIntent import android.content.Intent import android.os.Bundle import android.os.SystemClock import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import com.gfg.progressnotificationdemo.R.drawable class MainActivity : AppCompatActivity(){ private lateinit var notificationManager: NotificationManagerCompat val channelId = "Progress Notification" as String override fun onCreate(savedInstanceState: Bundle?){ super .onCreate(savedInstanceState) setContentView(R.layout.activity_main) //Create a Notification Manager notificationManager = NotificationManagerCompat.from( this ) } //Start() is called when the buttons is pressed. public fun start(view: View){ val intent = Intent( this , MainActivity:: class .java).apply{ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity( this , 0 , intent, 0 ) //Sets the maximum progress as 100 val progressMax = 100 //Creating a notification and setting its various attributes val notification = NotificationCompat.Builder( this , channelId) .setSmallIcon(drawable.ic_file_download) .setContentTitle( "w3wiki" ) .setContentText( "Downloading" ) .setPriority(NotificationCompat.PRIORITY_LOW) .setOngoing( true ) .setOnlyAlertOnce( true ) .setProgress(progressMax, 0 , true ) .setContentIntent(pendingIntent) .setAutoCancel( true ) //Initial Alert notificationManager.notify( 1 , notification.build()) Thread(Runnable{ SystemClock.sleep( 2000 ) var progress = 0 while (progress <= progressMax) { SystemClock.sleep( 1000 ) progress += 20 //Use this to make it a Fixed-duration progress indicator notification //notification.setContentText(progress.toString()+"%") //.setProgress(progressMax, progress, false) //notificationManager.notify(1, notification.build()) } notification.setContentText( "Download complete" ) .setProgress( 0 , 0 , false ) .setOngoing( false ) notificationManager.notify( 1 , notification.build()) }).start() } } |
Activity Main.xml
<?xml version= "1.0" encoding= "utf-8" ?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width= "match_parent" android:layout_height= "match_parent" tools:context= ".MainActivity" android:orientation= "vertical" > <Button android:layout_width= "wrap_content" android:layout_height= "75dp" android:onClick= "start" android:text= "Show Notification" android:textSize= "22sp" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
Output:
- Fixed-duration progress indicator : (after adding code in comments at line 67 of MainActivity.kt)
- Indeterminate progress indicator :
- After Download :
That’s how easy and simple it is to add progress indicator to a notification in Android using Kotlin.