mirror of
https://github.com/vernu/textbee.git
synced 2026-05-19 05:46:23 -04:00
feat(android): multi sim support
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.vernu.sms">
|
||||
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.SEND_SMS" />
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
|
||||
@@ -13,11 +13,15 @@ import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
@@ -33,6 +37,9 @@ import com.vernu.sms.dtos.RegisterDeviceInputDTO;
|
||||
import com.vernu.sms.dtos.RegisterDeviceResponseDTO;
|
||||
import com.vernu.sms.helpers.SharedPreferenceHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
@@ -51,6 +58,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
private ImageButton copyDeviceIdImgBtn;
|
||||
private TextView deviceBrandAndModelTxt, deviceIdTxt;
|
||||
|
||||
private RadioGroup defaultSimSlotRadioGroup;
|
||||
|
||||
private static final int SEND_SMS_PERMISSION_REQUEST_CODE = 0;
|
||||
private static final int SCAN_QR_REQUEST_CODE = 49374;
|
||||
|
||||
@@ -86,16 +95,29 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
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);
|
||||
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<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();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -35,6 +35,24 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Grant SMS Permission"
|
||||
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>
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user