diff --git a/android/app/build.gradle b/android/app/build.gradle index a9fa6c1..31e978b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.vernu.sms" minSdk 24 targetSdk 32 - versionCode 7 - versionName "2.0" + versionCode 8 + versionName "2.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c9cfaa5..a84989d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" package="com.vernu.sms"> + { + RadioButton radioButton = new RadioButton(mContext); + radioButton.setText(subscriptionInfo.getDisplayName().toString()); + radioButton.setId(subscriptionInfo.getSubscriptionId()); + radioButton.setOnClickListener(view -> { + SharedPreferenceHelper.setSharedPreferenceInt(mContext, "PREFERED_SIM", subscriptionInfo.getSubscriptionId()); + }); + radioButton.setChecked(subscriptionInfo.getSubscriptionId() == SharedPreferenceHelper.getSharedPreferenceInt(mContext, "PREFERED_SIM", 0)); + defaultSimSlotRadioGroup.addView(radioButton); + }); + deviceIdTxt.setText(deviceId); deviceBrandAndModelTxt.setText(Build.BRAND + " " + Build.MODEL); - if(deviceId == null || deviceId.isEmpty()) { + if (deviceId == null || deviceId.isEmpty()) { registerDeviceBtn.setText("Register"); } else { registerDeviceBtn.setText("Update"); } - if (isSMSPermissionGranted(mContext)) { + if (isSMSPermissionGranted(mContext) && isReadPhoneStatePermissionGranted(mContext)) { grantSMSPermissionBtn.setEnabled(false); grantSMSPermissionBtn.setText("SMS Permission Granted"); } else { @@ -157,6 +179,7 @@ public class MainActivity extends AppCompatActivity { intentIntegrator.initiateScan(); }); + getAvailableSimSlots(); } @@ -236,17 +259,14 @@ public class MainActivity extends AppCompatActivity { } private void handleSMSRequestPermission(View view) { - if (isSMSPermissionGranted(mContext)) { + if (isSMSPermissionGranted(mContext) && isReadPhoneStatePermissionGranted(mContext)) { Snackbar.make(view, "Already got permissions", Snackbar.LENGTH_SHORT).show(); } else { - if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.SEND_SMS)) { - Snackbar.make(view, "PERMISSION DENIED, Pls grant SMS Permission in app settings", Snackbar.LENGTH_SHORT).show(); - } else { - Snackbar.make(view, "Grant SMS Permissions to continue", Snackbar.LENGTH_SHORT).show(); - ActivityCompat.requestPermissions(MainActivity.this, - new String[]{Manifest.permission.SEND_SMS}, - SEND_SMS_PERMISSION_REQUEST_CODE); - } + Snackbar.make(view, "Grant SMS Permissions to continue", Snackbar.LENGTH_SHORT).show(); + ActivityCompat.requestPermissions(MainActivity.this, + new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_PHONE_STATE + }, SEND_SMS_PERMISSION_REQUEST_CODE); + } } @@ -272,4 +292,19 @@ public class MainActivity extends AppCompatActivity { private boolean isSMSPermissionGranted(Context context) { return ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED; } + + private boolean isReadPhoneStatePermissionGranted(Context context) { + return ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; + } + + private List getAvailableSimSlots() { + + SubscriptionManager subscriptionManager = SubscriptionManager.from(mContext); + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + return new ArrayList<>(); + } + + return subscriptionManager.getActiveSubscriptionInfoList(); + + } } \ No newline at end of file diff --git a/android/app/src/main/java/com/vernu/sms/helpers/SMSHelper.java b/android/app/src/main/java/com/vernu/sms/helpers/SMSHelper.java index 0cfa2f3..88c4c26 100644 --- a/android/app/src/main/java/com/vernu/sms/helpers/SMSHelper.java +++ b/android/app/src/main/java/com/vernu/sms/helpers/SMSHelper.java @@ -17,4 +17,9 @@ public class SMSHelper { } } + + public static void sendSMSFromSpecificSim(String phoneNo, String message, int simSlot) { + SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(simSlot); + smsManager.sendMultipartTextMessage(phoneNo, null, smsManager.divideMessage(message), null, null); + } } diff --git a/android/app/src/main/java/com/vernu/sms/models/SMSPayload.java b/android/app/src/main/java/com/vernu/sms/models/SMSPayload.java index b1af10a..4e5417a 100644 --- a/android/app/src/main/java/com/vernu/sms/models/SMSPayload.java +++ b/android/app/src/main/java/com/vernu/sms/models/SMSPayload.java @@ -1,11 +1,27 @@ package com.vernu.sms.models; public class SMSPayload { - public String[] receivers; - public String smsBody; + private String[] receivers; + private String smsBody; public SMSPayload(String[] receivers, String smsBody) { this.receivers = receivers; this.smsBody = smsBody; } + + public String[] getReceivers() { + return receivers; + } + + public void setReceivers(String[] receivers) { + this.receivers = receivers; + } + + public String getSmsBody() { + return smsBody; + } + + public void setSmsBody(String smsBody) { + this.smsBody = smsBody; + } } diff --git a/android/app/src/main/java/com/vernu/sms/services/FCMService.java b/android/app/src/main/java/com/vernu/sms/services/FCMService.java index 00c24ea..1cbae80 100644 --- a/android/app/src/main/java/com/vernu/sms/services/FCMService.java +++ b/android/app/src/main/java/com/vernu/sms/services/FCMService.java @@ -18,6 +18,7 @@ import com.google.gson.Gson; import com.vernu.sms.R; import com.vernu.sms.activities.MainActivity; import com.vernu.sms.helpers.SMSHelper; +import com.vernu.sms.helpers.SharedPreferenceHelper; import com.vernu.sms.models.SMSPayload; @@ -36,16 +37,19 @@ public class FCMService extends FirebaseMessagingService { // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { - // sendNotification("data msg received ", remoteMessage.getData().toString()); - int len = smsPayload.receivers.length; - if (len > 0) { - for (int i = 0; i < len; i++) { - SMSHelper.sendSMS(smsPayload.receivers[i], smsPayload.smsBody); + + for (String receiver : smsPayload.getReceivers()) { + int preferedSim = SharedPreferenceHelper.getSharedPreferenceInt(this, "PREFERED_SIM", 0); + try { + SMSHelper.sendSMSFromSpecificSim(receiver, smsPayload.getSmsBody(), preferedSim); + } catch(Exception e) { + Log.d("SMS_SEND_ERROR", e.getMessage()); + SMSHelper.sendSMS(receiver, smsPayload.getSmsBody()); } } } - // Check if message contains a notification payload. + // TODO: Handle FCM Notification Messages if (remoteMessage.getNotification() != null) { // sendNotification("notif msg", "msg body"); } diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 11c26d1..a65d865 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -35,6 +35,24 @@ android:layout_height="wrap_content" android:text="Grant SMS Permission" android:visibility="visible" /> + + + + + +