Skip to content

Commit 6784546

Browse files
committed
feat(android): multi sim support
1 parent ff63cdc commit 6784546

File tree

7 files changed

+100
-21
lines changed

7 files changed

+100
-21
lines changed

android/app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ android {
1010
applicationId "com.vernu.sms"
1111
minSdk 24
1212
targetSdk 32
13-
versionCode 7
14-
versionName "2.0"
13+
versionCode 8
14+
versionName "2.1"
1515

1616
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1717
}

android/app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
xmlns:tools="http://schemas.android.com/tools"
44
package="com.vernu.sms">
55

6+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
67
<uses-permission android:name="android.permission.SEND_SMS" />
78
<application
89
android:allowBackup="true"

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

+46-11
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@
1313
import android.content.pm.PackageManager;
1414
import android.os.Build;
1515
import android.os.Bundle;
16+
import android.telephony.SubscriptionInfo;
17+
import android.telephony.SubscriptionManager;
1618
import android.util.Log;
1719
import android.view.View;
1820
import android.widget.Button;
1921
import android.widget.EditText;
2022
import android.widget.ImageButton;
23+
import android.widget.RadioButton;
24+
import android.widget.RadioGroup;
2125
import android.widget.Switch;
2226
import android.widget.TextView;
2327
import android.widget.Toast;
@@ -33,6 +37,9 @@
3337
import com.vernu.sms.dtos.RegisterDeviceResponseDTO;
3438
import com.vernu.sms.helpers.SharedPreferenceHelper;
3539

40+
import java.util.ArrayList;
41+
import java.util.List;
42+
3643
import retrofit2.Call;
3744
import retrofit2.Callback;
3845
import retrofit2.Response;
@@ -51,6 +58,8 @@ public class MainActivity extends AppCompatActivity {
5158
private ImageButton copyDeviceIdImgBtn;
5259
private TextView deviceBrandAndModelTxt, deviceIdTxt;
5360

61+
private RadioGroup defaultSimSlotRadioGroup;
62+
5463
private static final int SEND_SMS_PERMISSION_REQUEST_CODE = 0;
5564
private static final int SCAN_QR_REQUEST_CODE = 49374;
5665

@@ -86,16 +95,29 @@ protected void onCreate(Bundle savedInstanceState) {
8695

8796
copyDeviceIdImgBtn = findViewById(R.id.copyDeviceIdImgBtn);
8897

98+
defaultSimSlotRadioGroup = findViewById(R.id.defaultSimSlotRadioGroup);
99+
100+
getAvailableSimSlots().forEach(subscriptionInfo -> {
101+
RadioButton radioButton = new RadioButton(mContext);
102+
radioButton.setText(subscriptionInfo.getDisplayName().toString());
103+
radioButton.setId(subscriptionInfo.getSubscriptionId());
104+
radioButton.setOnClickListener(view -> {
105+
SharedPreferenceHelper.setSharedPreferenceInt(mContext, "PREFERED_SIM", subscriptionInfo.getSubscriptionId());
106+
});
107+
radioButton.setChecked(subscriptionInfo.getSubscriptionId() == SharedPreferenceHelper.getSharedPreferenceInt(mContext, "PREFERED_SIM", 0));
108+
defaultSimSlotRadioGroup.addView(radioButton);
109+
});
110+
89111
deviceIdTxt.setText(deviceId);
90112
deviceBrandAndModelTxt.setText(Build.BRAND + " " + Build.MODEL);
91113

92-
if(deviceId == null || deviceId.isEmpty()) {
114+
if (deviceId == null || deviceId.isEmpty()) {
93115
registerDeviceBtn.setText("Register");
94116
} else {
95117
registerDeviceBtn.setText("Update");
96118
}
97119

98-
if (isSMSPermissionGranted(mContext)) {
120+
if (isSMSPermissionGranted(mContext) && isReadPhoneStatePermissionGranted(mContext)) {
99121
grantSMSPermissionBtn.setEnabled(false);
100122
grantSMSPermissionBtn.setText("SMS Permission Granted");
101123
} else {
@@ -157,6 +179,7 @@ public void onFailure(Call<RegisterDeviceResponseDTO> call, Throwable t) {
157179
intentIntegrator.initiateScan();
158180
});
159181

182+
getAvailableSimSlots();
160183

161184
}
162185

@@ -236,17 +259,14 @@ public void onFailure(Call<RegisterDeviceResponseDTO> call, Throwable t) {
236259
}
237260

238261
private void handleSMSRequestPermission(View view) {
239-
if (isSMSPermissionGranted(mContext)) {
262+
if (isSMSPermissionGranted(mContext) && isReadPhoneStatePermissionGranted(mContext)) {
240263
Snackbar.make(view, "Already got permissions", Snackbar.LENGTH_SHORT).show();
241264
} else {
242-
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.SEND_SMS)) {
243-
Snackbar.make(view, "PERMISSION DENIED, Pls grant SMS Permission in app settings", Snackbar.LENGTH_SHORT).show();
244-
} else {
245-
Snackbar.make(view, "Grant SMS Permissions to continue", Snackbar.LENGTH_SHORT).show();
246-
ActivityCompat.requestPermissions(MainActivity.this,
247-
new String[]{Manifest.permission.SEND_SMS},
248-
SEND_SMS_PERMISSION_REQUEST_CODE);
249-
}
265+
Snackbar.make(view, "Grant SMS Permissions to continue", Snackbar.LENGTH_SHORT).show();
266+
ActivityCompat.requestPermissions(MainActivity.this,
267+
new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_PHONE_STATE
268+
}, SEND_SMS_PERMISSION_REQUEST_CODE);
269+
250270
}
251271
}
252272

@@ -272,4 +292,19 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
272292
private boolean isSMSPermissionGranted(Context context) {
273293
return ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED;
274294
}
295+
296+
private boolean isReadPhoneStatePermissionGranted(Context context) {
297+
return ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
298+
}
299+
300+
private List<SubscriptionInfo> getAvailableSimSlots() {
301+
302+
SubscriptionManager subscriptionManager = SubscriptionManager.from(mContext);
303+
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
304+
return new ArrayList<>();
305+
}
306+
307+
return subscriptionManager.getActiveSubscriptionInfoList();
308+
309+
}
275310
}

android/app/src/main/java/com/vernu/sms/helpers/SMSHelper.java

+5
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ public static void sendSMS(String phoneNo, String message) {
1717
}
1818

1919
}
20+
21+
public static void sendSMSFromSpecificSim(String phoneNo, String message, int simSlot) {
22+
SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(simSlot);
23+
smsManager.sendMultipartTextMessage(phoneNo, null, smsManager.divideMessage(message), null, null);
24+
}
2025
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,27 @@
11
package com.vernu.sms.models;
22

33
public class SMSPayload {
4-
public String[] receivers;
5-
public String smsBody;
4+
private String[] receivers;
5+
private String smsBody;
66

77
public SMSPayload(String[] receivers, String smsBody) {
88
this.receivers = receivers;
99
this.smsBody = smsBody;
1010
}
11+
12+
public String[] getReceivers() {
13+
return receivers;
14+
}
15+
16+
public void setReceivers(String[] receivers) {
17+
this.receivers = receivers;
18+
}
19+
20+
public String getSmsBody() {
21+
return smsBody;
22+
}
23+
24+
public void setSmsBody(String smsBody) {
25+
this.smsBody = smsBody;
26+
}
1127
}

android/app/src/main/java/com/vernu/sms/services/FCMService.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.vernu.sms.R;
1919
import com.vernu.sms.activities.MainActivity;
2020
import com.vernu.sms.helpers.SMSHelper;
21+
import com.vernu.sms.helpers.SharedPreferenceHelper;
2122
import com.vernu.sms.models.SMSPayload;
2223

2324

@@ -36,16 +37,19 @@ public void onMessageReceived(RemoteMessage remoteMessage) {
3637

3738
// Check if message contains a data payload.
3839
if (remoteMessage.getData().size() > 0) {
39-
// sendNotification("data msg received ", remoteMessage.getData().toString());
40-
int len = smsPayload.receivers.length;
41-
if (len > 0) {
42-
for (int i = 0; i < len; i++) {
43-
SMSHelper.sendSMS(smsPayload.receivers[i], smsPayload.smsBody);
40+
41+
for (String receiver : smsPayload.getReceivers()) {
42+
int preferedSim = SharedPreferenceHelper.getSharedPreferenceInt(this, "PREFERED_SIM", 0);
43+
try {
44+
SMSHelper.sendSMSFromSpecificSim(receiver, smsPayload.getSmsBody(), preferedSim);
45+
} catch(Exception e) {
46+
Log.d("SMS_SEND_ERROR", e.getMessage());
47+
SMSHelper.sendSMS(receiver, smsPayload.getSmsBody());
4448
}
4549
}
4650
}
4751

48-
// Check if message contains a notification payload.
52+
// TODO: Handle FCM Notification Messages
4953
if (remoteMessage.getNotification() != null) {
5054
// sendNotification("notif msg", "msg body");
5155
}

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

+18
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,24 @@
3535
android:layout_height="wrap_content"
3636
android:text="Grant SMS Permission"
3737
android:visibility="visible" />
38+
39+
<LinearLayout
40+
android:layout_width="match_parent"
41+
android:layout_height="wrap_content"
42+
android:gravity="center"
43+
android:orientation="vertical">
44+
<TextView
45+
android:layout_width="wrap_content"
46+
android:layout_height="wrap_content"
47+
android:text="Default SIM"
48+
android:textStyle="bold" />
49+
<RadioGroup
50+
android:id="@+id/defaultSimSlotRadioGroup"
51+
android:layout_width="wrap_content"
52+
android:layout_height="wrap_content"
53+
android:orientation="horizontal">
54+
</RadioGroup>
55+
</LinearLayout>
3856
</LinearLayout>
3957

4058

0 commit comments

Comments
 (0)