Created
March 1, 2019 09:22
-
-
Save IvanAbakumov/e3e2f66a74bbf1592c43037026b45ce2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SMSReceiver : BroadcastReceiver() { | |
companion object { | |
private const val VALIDATE_MASK = ".*Maliava auth code:? ([0-9]{6}).*" | |
} | |
private var listener: WeakReference<OnSMSReceiveListener>? = null | |
fun setListener(listener: OnSMSReceiveListener) { | |
this.listener = listener.weak() | |
} | |
override fun onReceive(context: Context, intent: Intent) { | |
val pudsBundle = intent.extras | |
val pdus = pudsBundle.get("pdus") as Array<Any> | |
val messages = SmsMessage.createFromPdu(pdus[0] as ByteArray) | |
Log.i("Tag ", " received" + messages.messageBody) | |
listener?.get()?.onSMSReceived(validate(messages.messageBody)) | |
Log.i("Tag ", " validate" + validate(messages.messageBody)) | |
} | |
private fun validate(body: String): String? { | |
if (!Pattern.compile(VALIDATE_MASK, Pattern.DOTALL).matcher(body).matches()) return null | |
val p = Pattern.compile("(\\d+)") | |
val m = p.matcher(body) | |
var ret = "" | |
while (m.find()) { | |
ret += m.group() | |
} | |
return ret | |
} | |
} | |
interface OnSMSReceiveListener { | |
fun onSMSReceived(sms: String?) | |
} | |
// for fragment | |
val filter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION) | |
override fun onStart() { | |
super.onStart() | |
smsReceiver = SMSReceiver().apply { setListener(this@VerifyFragment) } | |
} | |
override fun onResume() { | |
super.onResume() | |
(activity as? AppCompatActivity)?.registerReceiver(smsReceiver, filter) | |
} | |
override fun onPause() { | |
super.onPause() | |
activity?.unregisterReceiver(smsReceiver) | |
} | |
override fun onDetach() { | |
super.onDetach() | |
smsReceiver = null | |
} | |
override fun onSMSReceived(sms: String?) { | |
verifyNumberView.text?.clear() | |
sms ?: return | |
for (i in 0 until sms.length) { | |
verifyNumberView.postDelayed({ | |
verifyNumberView.append(Character.toString(sms[i])) | |
}, (i * 200).toLong()) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment