Skip to content

Commit

Permalink
daily local notification added
Browse files Browse the repository at this point in the history
  • Loading branch information
whoishusni committed May 20, 2020
1 parent 7803b21 commit c964315
Show file tree
Hide file tree
Showing 22 changed files with 448 additions and 39 deletions.
12 changes: 7 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ android {
applicationId "id.husni.sultengcovid"
minSdkVersion 22
targetSdkVersion 29
versionCode 3
versionName "1.5"
versionCode 4
versionName "1.7"
//TODO : INSERT YOUR API FROM NEWSAPI.ORG HERE
buildConfigField("String", "KEY_NEWS_API", '"{API_KEY_HERE}"')
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand All @@ -37,7 +37,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.firebase:firebase-messaging:20.1.6'
implementation 'com.google.firebase:firebase-messaging:20.1.7'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
Expand All @@ -50,9 +50,9 @@ dependencies {
//Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.8.1'
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
//Facebook Shimmer
implementation 'com.facebook.shimmer:shimmer:0.5.0'
Expand All @@ -65,4 +65,6 @@ dependencies {
implementation 'io.reactivex.rxjava3:rxjava:3.0.3'
//Rx Java 3 Adapter
implementation 'com.github.akarnokd:rxjava3-retrofit-adapter:3.0.0'
//preference
implementation 'androidx.preference:preference-ktx:1.1.1'
}
19 changes: 13 additions & 6 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,29 @@
package="id.husni.sultengcovid">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />

<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:icon="@drawable/ic_icon"
android:label="@string/app_name"
android:roundIcon="@drawable/icon"
android:roundIcon="@drawable/ic_icon"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".receiver.DailyNotificationReceiver"
android:enabled="true"
android:exported="true"/>

<activity android:name=".activity.SettingActivity" />

<service
android:name=".serviceapi.FcmCloudMessageService"
android:enabled="true"
android:exported="true">
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

Expand Down
19 changes: 14 additions & 5 deletions app/src/main/java/id/husni/sultengcovid/activity/AboutActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AboutActivity : AppCompatActivity(), View.OnClickListener {
tvAppVersion.text = BuildConfig.VERSION_NAME

tvAboutGithub.setOnClickListener(this)
tvAboutShare.setOnClickListener(this)

}

Expand All @@ -37,11 +38,19 @@ class AboutActivity : AppCompatActivity(), View.OnClickListener {
}

override fun onClick(v: View?) {
if(v?.id == R.id.tvAboutGithub){
val url = "https://www.github.com/whoishusni"
val uri : Uri = Uri.parse(url)
val intentToGithub = Intent(Intent.ACTION_VIEW,uri)
startActivity(intentToGithub)
when(v?.id){
R.id.tvAboutGithub->{
val url = "https://www.github.com/whoishusni"
val uri : Uri = Uri.parse(url)
val intentToGithub = Intent(Intent.ACTION_VIEW,uri)
startActivity(intentToGithub)
}
R.id.tvAboutShare->{
val intentToShare = Intent(Intent.ACTION_SEND)
intentToShare.type = "text/plain"
intentToShare.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text))
startActivity(Intent.createChooser(intentToShare,"Share"))
}
}
}
}
11 changes: 4 additions & 7 deletions app/src/main/java/id/husni/sultengcovid/activity/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

package id.husni.sultengcovid.activity

import android.content.DialogInterface
import android.content.Intent
import android.os.Bundle
import android.util.Log
Expand Down Expand Up @@ -68,12 +67,6 @@ class MainActivity : AppCompatActivity() {
val intentToAbout = Intent(this, AboutActivity::class.java)
startActivity(intentToAbout)
}
R.id.menuShare->{
val intentToShare = Intent(Intent.ACTION_SEND)
intentToShare.type = "text/plain"
intentToShare.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text))
startActivity(Intent.createChooser(intentToShare,"Share"))
}
R.id.menuPrevention->{
val intentToPrevention = Intent(this, PreventionActivity::class.java)
startActivity(intentToPrevention)
Expand All @@ -82,6 +75,10 @@ class MainActivity : AppCompatActivity() {
val intentToNews = Intent(this, NewsActivity::class.java)
startActivity(intentToNews)
}
R.id.menuSetting->{
val settingIntent = Intent(this, SettingActivity::class.java)
startActivity(settingIntent)
}
}
return super.onOptionsItemSelected(item)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2020.
* Made with ❤ by Moh Husni Mubaraq
* Not For Commercial Purpose
*/

package id.husni.sultengcovid.activity

import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import id.husni.sultengcovid.R
import id.husni.sultengcovid.preference.MainSettingPreference
import kotlinx.android.synthetic.main.activity_setting_activity.*

class SettingActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_setting_activity)
setSupportActionBar(settingToolbar)
supportActionBar?.title = getString(R.string.setting)
supportActionBar?.setHomeButtonEnabled(true)
supportActionBar?.setDisplayHomeAsUpEnabled(true)

supportFragmentManager.beginTransaction().add(R.id.setting_main_frame, MainSettingPreference()).commit()
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home)
onBackPressed()
return super.onOptionsItemSelected(item)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class DistrictFragment : Fragment() {
val viewModel : DistrictViewModel = ViewModelProvider(this,ViewModelProvider.NewInstanceFactory()).get(DistrictViewModel::class.java)
viewModel.setDistrictData()
showShimmer(true)
viewModel.getDistrictData().observe(this, Observer<ArrayList<District>> {
viewModel.getDistrictData().observe(viewLifecycleOwner, Observer<ArrayList<District>> {
adapter.setData(it)
showShimmer(false)
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class HospitalFragment : Fragment() {
val viewModel : HospitalViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(HospitalViewModel::class.java)
viewModel.setHospitalData()
showShimmer(true)
viewModel.getHospitalData().observe(this,Observer<ArrayList<Hospital>>{
viewModel.getHospitalData().observe(viewLifecycleOwner,Observer<ArrayList<Hospital>>{
adapter.setHospitals(it)
showShimmer(false)
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Copyright (c) 2020.
* Made with ❤ by Moh Husni Mubaraq
* Not For Commercial Purpose
*/

package id.husni.sultengcovid.preference

import android.content.SharedPreferences
import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import id.husni.sultengcovid.R
import id.husni.sultengcovid.receiver.DailyNotificationReceiver


class MainSettingPreference : PreferenceFragmentCompat(),
SharedPreferences.OnSharedPreferenceChangeListener {

private lateinit var DAILY_KEY : String
private lateinit var dailySwitch : SwitchPreference
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.setting_preference)
initiate()
summary()
}

private fun initiate(){
DAILY_KEY = resources.getString(R.string.daily_notif_key)
dailySwitch = findPreference<SwitchPreference>(DAILY_KEY) as SwitchPreference
}

private fun summary(){
val sharedPreference : SharedPreferences = preferenceManager.sharedPreferences
dailySwitch.isChecked = sharedPreference.getBoolean(DAILY_KEY, false)
}

override fun onResume() {
super.onResume()
preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}

override fun onPause() {
super.onPause()
preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
}

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
val dailyNotificationReceiver = DailyNotificationReceiver()
if (key == DAILY_KEY){
if (dailySwitch.isChecked){
dailyNotificationReceiver.setDailyNotification(context)
}
else{
dailyNotificationReceiver.setCancelDailyNotification(context)
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* Copyright (c) 2020.
* Made with ❤ by Moh Husni Mubaraq
* Not For Commercial Purpose
*/

package id.husni.sultengcovid.receiver

import android.app.AlarmManager
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.widget.Toast
import androidx.core.app.NotificationCompat
import id.husni.sultengcovid.R
import id.husni.sultengcovid.activity.MainActivity
import id.husni.sultengcovid.model.Province
import id.husni.sultengcovid.serviceapi.ApiEndpoint
import id.husni.sultengcovid.serviceapi.RetrofitServiceApi
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import java.text.SimpleDateFormat
import java.util.*


class DailyNotificationReceiver : BroadcastReceiver() {

companion object{
const val DAILY_NOTIF_REQUEST_CODE = 100
const val DAILY_NOTIF_REQUEST_CODE_TO_INTENT = 200
const val NOTIFID = 1
const val CHANNEL_ID_DAILY = "channel_id_daily"
const val CHANNEL_ID_NAME = "channel_id_daily_name"
const val EXTRA_MESSAGE_DATA = "Extra_message_data"
}
override fun onReceive(context: Context, intent: Intent) {
val message = intent.getStringExtra(EXTRA_MESSAGE_DATA)
showNotification(context,message)
}

fun setDailyNotification(context: Context?){
val retrofit = RetrofitServiceApi.retrofit
val endPoint = retrofit.create(ApiEndpoint::class.java)
endPoint.getProvinceData()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { setAlarm(context, it) }
}

private fun setAlarm(context: Context?, it: Province) {
val localeID = Locale("id", "ID")
var notifTitle = ""

notifTitle = if (Locale.getDefault() == localeID){
"Positif : ${it.dataProvince.provincePositive}, Sembuh : ${it.dataProvince.provinceRecovered}, Meninggal : ${it.dataProvince.provinceDeath}"
}
else{
"Positive : ${it.dataProvince.provincePositive}, Recovered : ${it.dataProvince.provinceRecovered}, Deaths : ${it.dataProvince.provinceDeath}"
}
val alarmManager = context?.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val calendar = Calendar.getInstance()
calendar.set(Calendar.HOUR_OF_DAY,8)
calendar.set(Calendar.MINUTE,0)
calendar.set(Calendar.SECOND,0)

val intent = Intent(context, DailyNotificationReceiver::class.java)
intent.putExtra(EXTRA_MESSAGE_DATA,notifTitle)
val pendingIntent = PendingIntent.getBroadcast(context,DAILY_NOTIF_REQUEST_CODE,intent,0)
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calendar.timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent)
Toast.makeText(context,context.getString(R.string.daily_notif_setup),Toast.LENGTH_SHORT).show()
}

fun setCancelDailyNotification(context: Context?){
val alarmManager = context?.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context, DailyNotificationReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, DAILY_NOTIF_REQUEST_CODE, intent,0)
pendingIntent.cancel()
alarmManager.cancel(pendingIntent)
Toast.makeText(context, context.getString(R.string.daily_notif_cancel), Toast.LENGTH_SHORT).show()
}

private fun showNotification(context: Context, message: String?) {

val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//date
val date = Date()
val simpleDateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
val formattedDate = simpleDateFormat.format(date.time)

val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, DAILY_NOTIF_REQUEST_CODE_TO_INTENT,intent,PendingIntent.FLAG_ONE_SHOT)
val sound : Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val notificationCompat = NotificationCompat.Builder(context,CHANNEL_ID_DAILY)
.setContentTitle("Update Covid-19 : $formattedDate")
.setContentText(message)
.setSound(sound)
.setSmallIcon(R.drawable.ic_icon)
.setVibrate(longArrayOf(1000,1000,1000,1000,1000))
.setContentIntent(pendingIntent)
.setAutoCancel(true)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ){
val channel = NotificationChannel(CHANNEL_ID_DAILY, CHANNEL_ID_NAME, NotificationManager.IMPORTANCE_DEFAULT)
channel.enableVibration(true)
channel.vibrationPattern = longArrayOf(1000,1000,1000,1000,1000)
notificationCompat.setChannelId(CHANNEL_ID_DAILY)
notificationManager.createNotificationChannel(channel)
}

val notification = notificationCompat.build()
notificationManager.notify(NOTIFID, notification)

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@ class FcmCloudMessageService : FirebaseMessagingService() {
val notificationBuilder : NotificationCompat.Builder

if (notifId < limitNotif){
val largeIcon = BitmapFactory.decodeResource(resources,R.drawable.icon)
val largeIcon = BitmapFactory.decodeResource(resources,R.drawable.ic_icon)
notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentText(body)
.setSmallIcon(R.drawable.icon)
.setSmallIcon(R.drawable.ic_icon)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setVibrate(longArrayOf(1000,1000,1000,1000,1000))
Expand All @@ -71,7 +71,7 @@ class FcmCloudMessageService : FirebaseMessagingService() {

notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentText(body)
.setSmallIcon(R.drawable.icon)
.setSmallIcon(R.drawable.ic_icon)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setVibrate(longArrayOf(1000,1000,1000,1000,1000))
Expand Down
Loading

0 comments on commit c964315

Please sign in to comment.