Skip to content

Commit 5e796f7

Browse files
committed
Fix user loading
1 parent eb93560 commit 5e796f7

16 files changed

Lines changed: 254 additions & 119 deletions

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,31 @@ import java.time.ZonedDateTime
1212
internal class DeliveredReceiver : BroadcastReceiver() {
1313
override fun onReceive(context: Context, intent: Intent) {
1414
when (resultCode) {
15-
Activity.RESULT_OK -> handleMessageDelivered(intent.getStringExtra(Constants.KEY_MESSAGE_ID))
16-
else -> handleMessageFailed(intent.getStringExtra(Constants.KEY_MESSAGE_ID))
15+
Activity.RESULT_OK -> handleMessageDelivered(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID))
16+
else -> handleMessageFailed(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID))
1717
}
1818
}
1919

20-
private fun handleMessageDelivered(messageId: String?) {
20+
private fun handleMessageDelivered(context: Context, messageId: String?) {
2121
val timestamp = ZonedDateTime.now(ZoneOffset.UTC)
22+
if (!Receiver.isValid(context, messageId)) {
23+
return
24+
}
2225
Thread {
2326
Timber.i("delivered message with ID [${messageId}]")
24-
if (messageId == null) {
25-
Timber.e("cannot handle event because the message ID is null")
26-
return@Thread
27-
}
28-
HttpSmsApiService().sendDeliveredEvent(messageId, timestamp)
27+
HttpSmsApiService(Settings.getApiKeyOrDefault(context)).sendDeliveredEvent(messageId!!, timestamp)
2928
}.start()
3029
}
3130

32-
private fun handleMessageFailed(messageId: String?) {
31+
private fun handleMessageFailed(context: Context, messageId: String?) {
3332
val timestamp = ZonedDateTime.now(ZoneOffset.UTC)
33+
if (!Receiver.isValid(context, messageId)) {
34+
return
35+
}
36+
3437
Thread {
3538
Timber.i("message with ID [${messageId}] not delivered")
36-
if (messageId == null) {
37-
Timber.e("cannot handle event because the message ID is null")
38-
return@Thread
39-
}
40-
HttpSmsApiService().sendFailedEvent(messageId,timestamp, "NOT_DELIVERED")
39+
HttpSmsApiService(Settings.getApiKeyOrDefault(context)).sendFailedEvent(messageId!!,timestamp, "NOT_DELIVERED")
4140
}.start()
4241
}
4342
}

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,19 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
5151
}
5252
private fun sendRegistrationToServer(token: String) {
5353
Timber.d("sendRegistrationTokenToServer($token)")
54-
Settings.setApiKeyAsync(this, token)
54+
Settings.setFcmTokenAsync(this, token)
5555

5656
if (Settings.isLoggedIn(this)) {
5757
Timber.d("updating phone with new fcm token")
58-
HttpSmsApiService().updatePhone(Settings.getPhoneOrDefault(this), token)
58+
HttpSmsApiService(Settings.getApiKeyOrDefault(this)).updatePhone(Settings.getOwnerOrDefault(this), token)
5959
}
60-
}
6160

62-
companion object {
63-
private val TAG = MyFirebaseMessagingService::class.simpleName
6461
}
6562

6663
internal class SendSmsWorker(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) {
6764
override fun doWork(): Result {
6865
val owner = Settings.getOwner(applicationContext) ?: return Result.failure()
69-
val message = getMessage(owner) ?: return Result.failure()
66+
val message = getMessage(applicationContext, owner) ?: return Result.failure()
7067

7168
registerReceivers()
7269

@@ -79,9 +76,9 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
7976
return Result.success()
8077
}
8178

82-
private fun getMessage(owner: String): Message? {
79+
private fun getMessage(context: Context, owner: String): Message? {
8380
Timber.d("fetching message")
84-
val messages = HttpSmsApiService().getOutstandingMessages(owner)
81+
val messages = HttpSmsApiService(Settings.getApiKeyOrDefault(context)).getOutstandingMessages(owner)
8582

8683
if (messages.isNotEmpty()) {
8784
Timber.d("fetched message with ID [${messages.first().id}]")

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

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.httpsms
22

3-
import android.util.Log
43
import okhttp3.MediaType.Companion.toMediaType
54
import okhttp3.OkHttpClient
65
import okhttp3.Request
@@ -10,11 +9,12 @@ import java.net.URI
109
import java.time.ZonedDateTime
1110
import java.time.format.DateTimeFormatter
1211
import java.util.logging.Level
13-
import java.util.logging.Logger.*
12+
import java.util.logging.Logger.getLogger
1413

1514

16-
class HttpSmsApiService {
17-
private val baseURL = URI("https://eooi9srbmxw09ng.m.pipedream.net")
15+
class HttpSmsApiService(private val apiKey: String) {
16+
private val apiKeyHeader = "X-API-KEY"
17+
private val baseURL = URI("https://api.httpsms.com")
1818
private val jsonMediaType = "application/json; charset=utf-8".toMediaType()
1919

2020
init {
@@ -26,6 +26,7 @@ class HttpSmsApiService {
2626

2727
val request: Request = Request.Builder()
2828
.url(baseURL.resolve("/v1/messages/outstanding?owner=${owner}").toURL())
29+
.header(apiKeyHeader, apiKey)
2930
.build()
3031

3132
val response = client.newCall(request).execute()
@@ -74,6 +75,7 @@ class HttpSmsApiService {
7475
val request: Request = Request.Builder()
7576
.url(baseURL.resolve("/v1/messages/receive").toURL())
7677
.post(body.toRequestBody(jsonMediaType))
78+
.header(apiKeyHeader, apiKey)
7779
.build()
7880

7981
val response = client.newCall(request).execute()
@@ -105,6 +107,7 @@ class HttpSmsApiService {
105107
val request: Request = Request.Builder()
106108
.url(baseURL.resolve("/v1/messages/${messageId}/events").toURL())
107109
.post(body.toRequestBody(jsonMediaType))
110+
.header(apiKeyHeader, apiKey)
108111
.build()
109112

110113
val response = client.newCall(request).execute()
@@ -131,6 +134,7 @@ class HttpSmsApiService {
131134
val request: Request = Request.Builder()
132135
.url(baseURL.resolve("/v1/phones").toURL())
133136
.put(body.toRequestBody(jsonMediaType))
137+
.header(apiKeyHeader, apiKey)
134138
.build()
135139

136140
val response = client.newCall(request).execute()
@@ -142,4 +146,25 @@ class HttpSmsApiService {
142146
response.close()
143147
Timber.i("fcm token sent successfully for phone [$phoneNumber]" )
144148
}
149+
150+
151+
fun validateApiKey(): String? {
152+
val client = OkHttpClient()
153+
154+
val request: Request = Request.Builder()
155+
.url(baseURL.resolve("/v1/users/me").toURL())
156+
.header(apiKeyHeader, apiKey)
157+
.get()
158+
.build()
159+
160+
val response = client.newCall(request).execute()
161+
if (!response.isSuccessful) {
162+
Timber.e("error response [${response.body?.string()}] with code [${response.code}] while verifying apiKey [$apiKey]")
163+
return "Cannot validate the API key. Check if it is correct and try again."
164+
}
165+
166+
response.close()
167+
Timber.i("api key [$apiKey] is valid" )
168+
return null
169+
}
145170
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,69 @@
11
package com.httpsms
22

33
import android.os.Bundle
4+
import android.view.View
45
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.lifecycle.MutableLiveData
7+
import com.google.android.material.button.MaterialButton
8+
import com.google.android.material.progressindicator.LinearProgressIndicator
9+
import com.google.android.material.textfield.TextInputEditText
10+
import com.google.android.material.textfield.TextInputLayout
11+
import timber.log.Timber
512

613
class LoginActivity : AppCompatActivity() {
714
override fun onCreate(savedInstanceState: Bundle?) {
815
super.onCreate(savedInstanceState)
916
setContentView(R.layout.activity_login)
17+
registerListeners()
18+
}
19+
20+
private fun registerListeners() {
21+
loginButton().setOnClickListener { onLoginClick() }
22+
}
23+
24+
private fun onLoginClick() {
25+
Timber.e("login button clicked")
26+
loginButton().isEnabled = false
27+
val progressBar = findViewById<LinearProgressIndicator>(R.id.loginProgressIndicator)
28+
progressBar.visibility = View.VISIBLE
29+
30+
val apiKeyLayout = findViewById<TextInputLayout>(R.id.loginApiKeyTextInputLayout)
31+
apiKeyLayout.error = null
32+
33+
val apiKey = findViewById<TextInputEditText>(R.id.loginApiKeyTextInput)
34+
apiKey.isEnabled = false
35+
36+
val liveData = MutableLiveData<String?>()
37+
liveData.observe(this) { authResult ->
38+
run {
39+
progressBar.visibility = View.INVISIBLE
40+
if (authResult != null) {
41+
apiKey.isEnabled = true
42+
loginButton().isEnabled = true
43+
apiKeyLayout.error = authResult
44+
return@run
45+
}
46+
Settings.setApiKeyAsync(this, apiKey.text.toString())
47+
redirectToMain()
48+
}
49+
}
50+
51+
Thread {
52+
val error = HttpSmsApiService(apiKey.text.toString()).validateApiKey()
53+
liveData.postValue(error)
54+
Timber.i("login successful")
55+
}.start()
56+
}
57+
58+
59+
private fun redirectToMain() {
60+
if (!Settings.isLoggedIn(this)) {
61+
return
62+
}
63+
finish()
64+
}
65+
66+
private fun loginButton(): MaterialButton {
67+
return findViewById(R.id.loginButton)
1068
}
1169
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
package com.httpsms
66

7-
import com.beust.klaxon.*
7+
import com.beust.klaxon.Json
8+
import com.beust.klaxon.Klaxon
89

910
private val klaxon = Klaxon()
1011

@@ -14,7 +15,7 @@ data class ResponseMessagesOutstanding (
1415
val status: String
1516
) {
1617
companion object {
17-
public fun fromJson(json: String) = klaxon.parse<ResponseMessagesOutstanding>(json)
18+
fun fromJson(json: String) = klaxon.parse<ResponseMessagesOutstanding>(json)
1819
}
1920
}
2021

@@ -24,7 +25,7 @@ data class ResponseMessage (
2425
val status: String
2526
) {
2627
companion object {
27-
public fun fromJson(json: String) = klaxon.parse<ResponseMessage>(json)
28+
fun fromJson(json: String) = klaxon.parse<ResponseMessage>(json)
2829
}
2930
}
3031

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,18 @@ class ReceivedReceiver: BroadcastReceiver()
2525
}
2626

2727
handleMessageReceived(
28+
context,
2829
smsSender,
29-
Settings.getOwner(context) ?: Settings.DEFAULT_PHONE_NUMBER,
30+
Settings.getOwnerOrDefault(context),
3031
smsBody
3132
)
3233
}
3334

34-
private fun handleMessageReceived(from: String, to : String, content: String) {
35+
private fun handleMessageReceived(context: Context, from: String, to : String, content: String) {
3536
val timestamp = ZonedDateTime.now(ZoneOffset.UTC)
3637
Thread {
3738
Timber.i("forwarding received message from [${from}]")
38-
HttpSmsApiService().receive(from, to, content, timestamp)
39+
HttpSmsApiService(Settings.getApiKeyOrDefault(context)).receive(from, to, content, timestamp)
3940
}.start()
4041
}
4142
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.httpsms
2+
3+
import android.content.Context
4+
import timber.log.Timber
5+
6+
object Receiver {
7+
fun isValid(context: Context, messageId: String?): Boolean {
8+
if (messageId == null) {
9+
Timber.e("cannot handle event because the message ID is null")
10+
return false
11+
}
12+
13+
if (Settings.isLoggedIn(context)) {
14+
Timber.w("cannot handle message with id [$messageId] because the user is not logged in")
15+
return false
16+
}
17+
return true
18+
}
19+
}

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,36 @@ import java.time.ZonedDateTime
1212
internal class SentReceiver : BroadcastReceiver() {
1313
override fun onReceive(context: Context, intent: Intent) {
1414
when (resultCode) {
15-
Activity.RESULT_OK -> handleMessageSent(intent.getStringExtra(Constants.KEY_MESSAGE_ID))
16-
SmsManager.RESULT_ERROR_GENERIC_FAILURE -> handleMessageFailed(intent.getStringExtra(Constants.KEY_MESSAGE_ID), "GENERIC_FAILURE")
17-
SmsManager.RESULT_ERROR_NO_SERVICE -> handleMessageFailed(intent.getStringExtra(Constants.KEY_MESSAGE_ID), "NO_SERVICE")
18-
SmsManager.RESULT_ERROR_NULL_PDU -> handleMessageFailed(intent.getStringExtra(Constants.KEY_MESSAGE_ID), "NULL_PDU")
19-
SmsManager.RESULT_ERROR_RADIO_OFF -> handleMessageFailed(intent.getStringExtra(Constants.KEY_MESSAGE_ID), "RADIO_OFF")
20-
else -> handleMessageFailed(intent.getStringExtra(Constants.KEY_MESSAGE_ID), "UNKNOWN")
15+
Activity.RESULT_OK -> handleMessageSent(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID))
16+
SmsManager.RESULT_ERROR_GENERIC_FAILURE -> handleMessageFailed(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID), "GENERIC_FAILURE")
17+
SmsManager.RESULT_ERROR_NO_SERVICE -> handleMessageFailed(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID), "NO_SERVICE")
18+
SmsManager.RESULT_ERROR_NULL_PDU -> handleMessageFailed(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID), "NULL_PDU")
19+
SmsManager.RESULT_ERROR_RADIO_OFF -> handleMessageFailed(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID), "RADIO_OFF")
20+
else -> handleMessageFailed(context, intent.getStringExtra(Constants.KEY_MESSAGE_ID), "UNKNOWN")
2121
}
2222
}
2323

24-
private fun handleMessageSent(messageId: String?) {
24+
private fun handleMessageSent(context: Context, messageId: String?) {
2525
val timestamp = ZonedDateTime.now(ZoneOffset.UTC)
26+
if (!Receiver.isValid(context, messageId)) {
27+
return
28+
}
29+
2630
Thread {
2731
Timber.d("sent message with ID [${messageId}]")
28-
if (messageId == null) {
29-
Timber.e("cannot handle event because the message ID is null")
30-
return@Thread
31-
}
32-
HttpSmsApiService().sendSentEvent(messageId,timestamp)
32+
HttpSmsApiService(Settings.getApiKeyOrDefault(context)).sendSentEvent(messageId!!,timestamp)
3333
}.start()
3434
}
3535

36-
private fun handleMessageFailed(messageId: String?, reason: String) {
36+
private fun handleMessageFailed(context: Context, messageId: String?, reason: String) {
3737
val timestamp = ZonedDateTime.now(ZoneOffset.UTC)
38+
if (!Receiver.isValid(context, messageId)) {
39+
return
40+
}
41+
3842
Thread {
3943
Timber.i("message with ID [${messageId}] not sent with reason [$reason]")
40-
if (messageId == null) {
41-
Timber.e("cannot handle event because the message ID is null")
42-
return@Thread
43-
}
44-
HttpSmsApiService().sendFailedEvent(messageId, timestamp, reason)
44+
HttpSmsApiService(Settings.getApiKeyOrDefault(context)).sendFailedEvent(messageId!!, timestamp, reason)
4545
}.start()
4646
}
4747
}

0 commit comments

Comments
 (0)