Browse Source

feat(android): multi sim support

pull/4/head v2.1.0
isra el 2 years ago
parent
commit
6784546eb3
  1. 4
      android/app/build.gradle
  2. 1
      android/app/src/main/AndroidManifest.xml
  3. 53
      android/app/src/main/java/com/vernu/sms/activities/MainActivity.java
  4. 5
      android/app/src/main/java/com/vernu/sms/helpers/SMSHelper.java
  5. 20
      android/app/src/main/java/com/vernu/sms/models/SMSPayload.java
  6. 16
      android/app/src/main/java/com/vernu/sms/services/FCMService.java
  7. 18
      android/app/src/main/res/layout/activity_main.xml

4
android/app/build.gradle

@ -10,8 +10,8 @@ android {
applicationId "com.vernu.sms" applicationId "com.vernu.sms"
minSdk 24 minSdk 24
targetSdk 32 targetSdk 32
versionCode 7
versionName "2.0"
versionCode 8
versionName "2.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

1
android/app/src/main/AndroidManifest.xml

@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.vernu.sms"> package="com.vernu.sms">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
<application <application
android:allowBackup="true" android:allowBackup="true"

53
android/app/src/main/java/com/vernu/sms/activities/MainActivity.java

@ -13,11 +13,15 @@ import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Switch; import android.widget.Switch;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -33,6 +37,9 @@ import com.vernu.sms.dtos.RegisterDeviceInputDTO;
import com.vernu.sms.dtos.RegisterDeviceResponseDTO; import com.vernu.sms.dtos.RegisterDeviceResponseDTO;
import com.vernu.sms.helpers.SharedPreferenceHelper; import com.vernu.sms.helpers.SharedPreferenceHelper;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
@ -51,6 +58,8 @@ public class MainActivity extends AppCompatActivity {
private ImageButton copyDeviceIdImgBtn; private ImageButton copyDeviceIdImgBtn;
private TextView deviceBrandAndModelTxt, deviceIdTxt; private TextView deviceBrandAndModelTxt, deviceIdTxt;
private RadioGroup defaultSimSlotRadioGroup;
private static final int SEND_SMS_PERMISSION_REQUEST_CODE = 0; private static final int SEND_SMS_PERMISSION_REQUEST_CODE = 0;
private static final int SCAN_QR_REQUEST_CODE = 49374; private static final int SCAN_QR_REQUEST_CODE = 49374;
@ -86,16 +95,29 @@ public class MainActivity extends AppCompatActivity {
copyDeviceIdImgBtn = findViewById(R.id.copyDeviceIdImgBtn); copyDeviceIdImgBtn = findViewById(R.id.copyDeviceIdImgBtn);
defaultSimSlotRadioGroup = findViewById(R.id.defaultSimSlotRadioGroup);
getAvailableSimSlots().forEach(subscriptionInfo -> {
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); deviceIdTxt.setText(deviceId);
deviceBrandAndModelTxt.setText(Build.BRAND + " " + Build.MODEL); deviceBrandAndModelTxt.setText(Build.BRAND + " " + Build.MODEL);
if(deviceId == null || deviceId.isEmpty()) {
if (deviceId == null || deviceId.isEmpty()) {
registerDeviceBtn.setText("Register"); registerDeviceBtn.setText("Register");
} else { } else {
registerDeviceBtn.setText("Update"); registerDeviceBtn.setText("Update");
} }
if (isSMSPermissionGranted(mContext)) {
if (isSMSPermissionGranted(mContext) && isReadPhoneStatePermissionGranted(mContext)) {
grantSMSPermissionBtn.setEnabled(false); grantSMSPermissionBtn.setEnabled(false);
grantSMSPermissionBtn.setText("SMS Permission Granted"); grantSMSPermissionBtn.setText("SMS Permission Granted");
} else { } else {
@ -157,6 +179,7 @@ public class MainActivity extends AppCompatActivity {
intentIntegrator.initiateScan(); intentIntegrator.initiateScan();
}); });
getAvailableSimSlots();
} }
@ -236,17 +259,14 @@ public class MainActivity extends AppCompatActivity {
} }
private void handleSMSRequestPermission(View view) { private void handleSMSRequestPermission(View view) {
if (isSMSPermissionGranted(mContext)) {
if (isSMSPermissionGranted(mContext) && isReadPhoneStatePermissionGranted(mContext)) {
Snackbar.make(view, "Already got permissions", Snackbar.LENGTH_SHORT).show(); 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 { } else {
Snackbar.make(view, "Grant SMS Permissions to continue", Snackbar.LENGTH_SHORT).show(); Snackbar.make(view, "Grant SMS Permissions to continue", Snackbar.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(MainActivity.this, ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.SEND_SMS},
SEND_SMS_PERMISSION_REQUEST_CODE);
}
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) { private boolean isSMSPermissionGranted(Context context) {
return ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED; 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<SubscriptionInfo> getAvailableSimSlots() {
SubscriptionManager subscriptionManager = SubscriptionManager.from(mContext);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return new ArrayList<>();
}
return subscriptionManager.getActiveSubscriptionInfoList();
}
} }

5
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);
}
} }

20
android/app/src/main/java/com/vernu/sms/models/SMSPayload.java

@ -1,11 +1,27 @@
package com.vernu.sms.models; package com.vernu.sms.models;
public class SMSPayload { public class SMSPayload {
public String[] receivers;
public String smsBody;
private String[] receivers;
private String smsBody;
public SMSPayload(String[] receivers, String smsBody) { public SMSPayload(String[] receivers, String smsBody) {
this.receivers = receivers; this.receivers = receivers;
this.smsBody = smsBody; 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;
}
} }

16
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.R;
import com.vernu.sms.activities.MainActivity; import com.vernu.sms.activities.MainActivity;
import com.vernu.sms.helpers.SMSHelper; import com.vernu.sms.helpers.SMSHelper;
import com.vernu.sms.helpers.SharedPreferenceHelper;
import com.vernu.sms.models.SMSPayload; import com.vernu.sms.models.SMSPayload;
@ -36,16 +37,19 @@ public class FCMService extends FirebaseMessagingService {
// Check if message contains a data payload. // Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) { 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) { if (remoteMessage.getNotification() != null) {
// sendNotification("notif msg", "msg body"); // sendNotification("notif msg", "msg body");
} }

18
android/app/src/main/res/layout/activity_main.xml

@ -35,6 +35,24 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Grant SMS Permission" android:text="Grant SMS Permission"
android:visibility="visible" /> android:visibility="visible" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Default SIM"
android:textStyle="bold" />
<RadioGroup
android:id="@+id/defaultSimSlotRadioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
</RadioGroup>
</LinearLayout>
</LinearLayout> </LinearLayout>

Loading…
Cancel
Save