Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Build Android APK

on:
push:
branches: [ "develop", "main", "master" ]
workflow_dispatch: # Tombol ajaib agar kamu bisa merakit APK secara manual kapan saja

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Mengambil kode dari repository
uses: actions/checkout@v4

- name: Menyiapkan Java (JDK 11)
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'

- name: Memberikan izin akses untuk Gradle
run: chmod +x gradlew

- name: Merakit (Build) Aplikasi menjadi APK
run: ./gradlew assembleDebug

- name: Menyimpan hasil APK agar bisa di-download
uses: actions/upload-artifact@v4
with:
name: Aplikasi-Notifikasi-Ku
path: app/build/outputs/apk/debug/*.apk
4 changes: 2 additions & 2 deletions app/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ ext {

googlePlay = [
maps : "com.google.android.gms:play-services-maps:16.0.0",
crash : "com.google.firebase:firebase-crash:16.2.1",
// crash : "com.google.firebase:firebase-crash:16.2.1",
firebaseCore : "com.google.firebase:firebase-core:$versions.firebase",
firebaseMessaging: "com.google.firebase:firebase-messaging:17.3.4"
]
Expand Down Expand Up @@ -148,4 +148,4 @@ ext {

unitTestLibs = unitTest.values() + leakCannary
androidTestsLibs = androidTests.values() + supportLibs
}
}
8 changes: 8 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@
<activity
android:name="io.mvpstarter.sample.features.detail.MapsSampleActivity"
android:label="@string/title_activity_maps_sample" />
<service android:name="io.mvpstarter.sample.com.NotificationReaderService"
android:label="Pembaca Notifikasi Pribadi"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
</application>

</manifest>
16 changes: 16 additions & 0 deletions app/src/main/java/io/mvpstarter/sample/com/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.mvpstarter.sample.com

import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// Perintah untuk langsung membuka halaman pengaturan izin notifikasi di HP
val intent = Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)
startActivity(intent)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.mvpstarter.sample.com

import android.speech.tts.TextToSpeech
import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import java.util.*

class NotificationReaderService : NotificationListenerService(), TextToSpeech.OnInitListener {

private var tts: TextToSpeech? = null

override fun onCreate() {
super.onCreate()
tts = TextToSpeech(this, this)
}

override fun onInit(status: Int) {
if (status == TextToSpeech.SUCCESS) {
tts?.language = Locale("id", "ID")
}
}

override fun onNotificationPosted(sbn: StatusBarNotification) {
val packageName = sbn.packageName.lowercase()
val extras = sbn.notification.extras

// Mengambil judul dan teks notifikasi dengan aman
val title = extras.getString("android.title") ?: ""
val text = extras.getCharSequence("android.text")?.toString() ?: ""

// Mengecek apakah notifikasi berasal dari GoBiz, GoPay, atau mengandung kata Gopay
val isGoPayMerchant = packageName.contains("gojek.merchant") ||
packageName.contains("gobiz") ||
packageName.contains("gopay") ||
title.lowercase().contains("gopay")

if (isGoPayMerchant && text.isNotEmpty()) {
// Format suara yang dibacakan
val pesanSuara = "Ada pembayaran masuk. $text"
tts?.speak(pesanSuara, TextToSpeech.QUEUE_ADD, null, null)
}
}

override fun onDestroy() {
tts?.shutdown()
super.onDestroy()
}
}
12 changes: 6 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@ buildscript {
ext.kotlin_version = '1.3.41'
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
gradlePluginPortal() // 👉 Ini yang baru ditambahin buat ben-manes plugin

// jcenter() dan maven fabric udah dihapus dari sini karena servernya mati
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
//noinspection GradleDynamicVersion
classpath 'io.fabric.tools:gradle:1.+'
//classpath 'io.fabric.tools:gradle:1.+'
classpath 'com.google.gms:google-services:4.3.0'
classpath 'com.github.ben-manes:gradle-versions-plugin:0.22.0'
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
Expand All @@ -25,14 +26,13 @@ allprojects {
}

repositories {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
maven { url "https://jitpack.io" }
maven { url 'https://maven.fabric.io/public' }
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}
}