Skip to content

Commit 8be0931

Browse files
committed
Fix intents
1 parent 6c1b347 commit 8be0931

6 files changed

Lines changed: 158 additions & 41 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.httpsms
2+
3+
class Constants {
4+
companion object {
5+
const val KEY_MESSAGE_ID = "MESSAGE_ID"
6+
}
7+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.httpsms
2+
3+
import android.app.Activity
4+
import android.content.Context
5+
import android.content.Intent
6+
import android.content.BroadcastReceiver
7+
import android.util.Log
8+
9+
10+
internal class DeliveredReceiver : BroadcastReceiver() {
11+
override fun onReceive(context: Context, intent: Intent) {
12+
when (resultCode) {
13+
Activity.RESULT_OK -> Log.i(TAG, "delivered message with intent [${intent.extras?.getString(Constants.KEY_MESSAGE_ID)}]")
14+
Activity.RESULT_CANCELED -> Log.e(TAG, "message not delivered [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}}]")
15+
}
16+
}
17+
18+
companion object {
19+
private val TAG = DeliveredReceiver::class.simpleName
20+
}
21+
}

android/app/src/main/java/com/httpsms/FirebaseMessagingService.kt

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.httpsms
22

3+
import android.app.PendingIntent
34
import android.content.Context
5+
import android.content.Intent
6+
import android.content.IntentFilter
47
import android.util.Log
58
import androidx.work.OneTimeWorkRequest
69
import androidx.work.WorkManager
@@ -9,6 +12,7 @@ import androidx.work.WorkerParameters
912
import com.google.firebase.messaging.FirebaseMessagingService
1013
import com.google.firebase.messaging.RemoteMessage
1114

15+
1216
class MyFirebaseMessagingService : FirebaseMessagingService() {
1317

1418
// [START receive_message]
@@ -67,14 +71,63 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
6771

6872
internal class SendSmsWorker(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) {
6973
override fun doWork(): Result {
70-
Log.i(TAG, "fetching messages")
71-
val smsService = SmsManagerService()
74+
val message = getMessage() ?: return Result.failure()
75+
76+
registerReceivers()
77+
78+
sendMessage(
79+
message,
80+
createPendingIntent(message, SmsManagerService.ACTION_SMS_SENT),
81+
createPendingIntent(message, SmsManagerService.ACTION_SMS_DELIVERED)
82+
)
83+
84+
return Result.success()
85+
}
86+
87+
private fun getMessage(): Message? {
88+
Log.i(TAG, "fetching message")
7289
val messages = HttpSmsApiService().getOutstandingMessages()
73-
messages.forEach {
74-
message -> smsService.SendMessage(this.applicationContext, message, null, null)
90+
91+
if (messages.isNotEmpty()) {
92+
Log.i(TAG, "fetched message with ID [${messages.first().id}]")
93+
return messages.first()
7594
}
76-
Log.i(TAG, "received [${messages.size}] messages")
77-
return Result.success()
95+
96+
Log.e(TAG, "cannot get message from API")
97+
return null
98+
}
99+
100+
private fun sendMessage(message: Message, sentIntent: PendingIntent, deliveredIntent: PendingIntent) {
101+
Log.i(TAG, "sending SMS for message with ID [${message.id}]")
102+
SmsManagerService().sendMessage(this.applicationContext, message, sentIntent, deliveredIntent)
103+
Log.i(TAG, "sent SMS for message with ID [${message.id}]")
104+
}
105+
106+
107+
private fun registerReceivers() {
108+
this.applicationContext.registerReceiver(
109+
SentReceiver(),
110+
IntentFilter(SmsManagerService.ACTION_SMS_SENT)
111+
)
112+
113+
this.applicationContext.registerReceiver(
114+
DeliveredReceiver(),
115+
IntentFilter(SmsManagerService.ACTION_SMS_DELIVERED)
116+
)
117+
}
118+
119+
private fun createPendingIntent(message: Message, action: String): PendingIntent {
120+
val intent = Intent(action)
121+
intent.putExtra(Constants.KEY_MESSAGE_ID, message.id)
122+
123+
Log.w(TAG, "message id = [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
124+
125+
return PendingIntent.getBroadcast(
126+
this.applicationContext,
127+
0,
128+
intent,
129+
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
130+
)
78131
}
79132
}
80-
}
133+
}
Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.httpsms
22

33
import android.Manifest
4+
import android.Manifest.permission.READ_PHONE_NUMBERS
45
import android.annotation.SuppressLint
56
import android.content.Context
7+
import android.content.Intent
68
import android.content.pm.PackageManager
9+
import android.icu.lang.UCharacter.GraphemeClusterBreak.T
10+
import android.nfc.Tag
711
import android.os.Bundle
812
import android.telephony.PhoneNumberUtils
913
import android.telephony.TelephonyManager
@@ -20,20 +24,52 @@ import java.util.*
2024

2125

2226
class MainActivity : AppCompatActivity() {
23-
private val logTag = MainActivity::class.simpleName ?: "MainActivity"
27+
companion object {
28+
private val TAG = MyFirebaseMessagingService::class.simpleName
29+
}
2430

2531
override fun onCreate(savedInstanceState: Bundle?) {
2632
super.onCreate(savedInstanceState)
2733
setContentView(R.layout.activity_main)
2834

35+
val intent = Intent("testing")
36+
intent.putExtra(Constants.KEY_MESSAGE_ID, "123")
37+
38+
Log.w(TAG, "message id = [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
39+
2940
val phoneNumber = getPhoneNumber(this)
3041

3142
val titleText = findViewById<TextView>(R.id.cardPhoneNumber)
3243
titleText.text = PhoneNumberUtils.formatNumber(phoneNumber, Locale.getDefault().country)
44+
45+
requestPermission(this, Manifest.permission.SEND_SMS)
46+
requestPermission(this, Manifest.permission.RECEIVE_SMS)
47+
requestPermission(this, Manifest.permission.READ_PHONE_NUMBERS)
48+
requestPermission(this, Manifest.permission.READ_PHONE_STATE)
49+
requestPermission(this, Manifest.permission.RECEIVE_SMS)
50+
3351
}
3452

3553
@SuppressLint("HardwareIds")
3654
private fun getPhoneNumber(context: Context): String {
55+
val telephonyManager = this.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
56+
if (ActivityCompat.checkSelfPermission(
57+
this,
58+
Manifest.permission.READ_SMS
59+
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
60+
this,
61+
READ_PHONE_NUMBERS
62+
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
63+
this,
64+
Manifest.permission.READ_PHONE_STATE
65+
) != PackageManager.PERMISSION_GRANTED
66+
) {
67+
return "NO_PHONE_NUMBER";
68+
}
69+
return telephonyManager.line1Number ?: "NO_PHONE_NUMBER"
70+
}
71+
72+
private fun requestPermission(context: Context, permission: String) {
3773
// Register the permissions callback, which handles the user's response to the
3874
// system permissions dialog. Save the return value, an instance of
3975
// ActivityResultLauncher. You can use either a val, as shown in this snippet,
@@ -50,39 +86,10 @@ class MainActivity : AppCompatActivity() {
5086
toast.show()
5187
}
5288
}
53-
54-
val telephonyManager = this.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
55-
if (ActivityCompat.checkSelfPermission(
56-
this,
57-
Manifest.permission.READ_SMS
58-
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
59-
this,
60-
Manifest.permission.READ_PHONE_NUMBERS
61-
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
62-
this,
63-
Manifest.permission.READ_PHONE_STATE
64-
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
65-
this,
66-
Manifest.permission.SEND_SMS
67-
) != PackageManager.PERMISSION_GRANTED
68-
&& ActivityCompat.checkSelfPermission(
69-
this,
70-
Manifest.permission.RECEIVE_SMS
71-
) != PackageManager.PERMISSION_GRANTED
72-
) {
89+
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
7390
// You can directly ask for the permission.
7491
// The registered ActivityResultCallback gets the result of this request.
75-
requestPermissionLauncher.launch(Manifest.permission.READ_SMS)
76-
requestPermissionLauncher.launch(Manifest.permission.READ_PHONE_NUMBERS)
77-
requestPermissionLauncher.launch(Manifest.permission.READ_PHONE_STATE)
78-
requestPermissionLauncher.launch(Manifest.permission.SEND_SMS)
79-
requestPermissionLauncher.launch(Manifest.permission.RECEIVE_SMS)
80-
92+
requestPermissionLauncher.launch(permission)
8193
}
82-
83-
val phoneNumber = telephonyManager.line1Number ?: "NO_PHONE_NUMBER"
84-
Log.d(logTag, phoneNumber)
85-
return phoneNumber
8694
}
87-
8895
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.httpsms
2+
3+
import android.app.Activity
4+
import android.content.BroadcastReceiver
5+
import android.content.Context
6+
import android.content.Intent
7+
import android.util.Log
8+
import android.telephony.SmsManager
9+
10+
internal class SentReceiver : BroadcastReceiver() {
11+
companion object {
12+
private val TAG = SentReceiver::class.simpleName
13+
}
14+
15+
override fun onReceive(context: Context, intent: Intent) {
16+
when (resultCode) {
17+
Activity.RESULT_OK -> Log.i(TAG, "sending successful with intent [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
18+
SmsManager.RESULT_ERROR_GENERIC_FAILURE -> Log.i(TAG, "sending failed with RESULT_ERROR_GENERIC_FAILURE intent [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
19+
SmsManager.RESULT_ERROR_NO_SERVICE -> Log.i(TAG, "sending failed with RESULT_ERROR_NO_SERVICE intent [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
20+
SmsManager.RESULT_ERROR_NULL_PDU -> Log.i(TAG, "sending failed with RESULT_ERROR_NULL_PDU intent [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
21+
SmsManager.RESULT_ERROR_RADIO_OFF -> Log.i(TAG, "sending failed with RESULT_ERROR_RADIO_OFF intent [${intent.getStringExtra(Constants.KEY_MESSAGE_ID)}]")
22+
}
23+
}
24+
}

android/app/src/main/java/com/httpsms/SmsManagerService.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import android.content.Context
55
import android.telephony.SmsManager
66

77
class SmsManagerService {
8-
fun SendMessage(context: Context, message: Message, sentIntent:PendingIntent, deliveryIntent: PendingIntent) {
8+
companion object {
9+
const val ACTION_SMS_SENT = "SMS_SENT"
10+
const val ACTION_SMS_RECEIVED = "SMS_RECEIVED"
11+
const val ACTION_SMS_DELIVERED = "SMS_DELIVERED"
12+
}
13+
fun sendMessage(context: Context, message: Message, sentIntent:PendingIntent, deliveryIntent: PendingIntent) {
914
val smsManager: SmsManager = context.getSystemService(SmsManager::class.java)
1015
smsManager.sendTextMessage(message.contact, message.owner, message.content, sentIntent, deliveryIntent)
1116
}
12-
}
17+
}

0 commit comments

Comments
 (0)