diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 74878b4..ee51656 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,15 +4,11 @@ package="com.samourai.txtenna"> - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/samourai/sms/SMSReceiver.java b/app/src/main/java/com/samourai/sms/SMSReceiver.java deleted file mode 100755 index 4913139..0000000 --- a/app/src/main/java/com/samourai/sms/SMSReceiver.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.samourai.sms; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.telephony.SmsMessage; -import android.util.Log; -import android.widget.Toast; - -import com.samourai.txtenna.payload.PayloadFactory; - -import com.google.gson.Gson; -import com.samourai.txtenna.utils.TransactionHandler; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -public class SMSReceiver extends BroadcastReceiver { - - /** TAG used for Debug-Logging */ - protected static final String LOG_TAG = "SMSReceiver"; - - /** The Action fired by the Android-System when a SMS was received. - * We are using the Default Package-Visibility */ - private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; - - private static HashMap>> incoming = new HashMap>>(); - - private static List seen = new ArrayList(); - - private static TransactionHandler transactionHandler = null; - - public SMSReceiver() { - ; - } - - public SMSReceiver(TransactionHandler transactionHandler) { - this.transactionHandler = transactionHandler; - } - - // @Override - public void onReceive(final Context context, Intent intent) { - - if ((intent.getAction().equals(ACTION) || intent.getAction().contains("SMS_RECEIVED"))) { - - StringBuilder sb = new StringBuilder(); - Bundle bundle = intent.getExtras(); - - Handler handler = new Handler(); - - if (bundle != null) { - - Object[] pdusObj = (Object[]) bundle.get("pdus"); - SmsMessage[] messages = new SmsMessage[pdusObj.length]; - for(int i = 0; i < pdusObj.length; i++) { - messages[i] = SmsMessage.createFromPdu((byte[])pdusObj[i]); - } - - String incomingTelNo = null; - String id = null; - for(SmsMessage currentMessage : messages) { - final String msg = currentMessage.getDisplayMessageBody().trim(); - incomingTelNo = currentMessage.getDisplayOriginatingAddress(); - - if(seen.contains(incomingTelNo + ":" + msg)) { - continue; - } - else { - seen.add(incomingTelNo + ":" + msg); - } - - Log.d("SMSReceiver", incomingTelNo + ":" + msg); - - // - // test for segment count, if present assume Segment0 - // - String i = null; - int c = -1; - PayloadFactory.Seg0 seg0 = null; - PayloadFactory.SegN segn = null; - Gson gson = new Gson(); - if(msg.contains("\"s\":")) { - seg0 = gson.fromJson(msg, PayloadFactory.Seg0.class); - c = 0; - i = seg0.i; - } - else { - segn = gson.fromJson(msg, PayloadFactory.SegN.class); - c = segn.c; - i = segn.i; - } - - if(i != null && i.length() != 0 && c != -1) { - HashMap> ids = incoming.get(incomingTelNo); - HashMap segments = null; - if(ids == null) { - ids = new HashMap>(); - } - else { - segments = ids.get(i); - } - id = i; - if(segments == null) { - segments = new HashMap(); - } - segments.put(Integer.toString(c), msg); - if(ids == null) { - ids = new HashMap>(); - } - ids.put(i, segments); - incoming.put(incomingTelNo, ids); - - handler.post(new Runnable() { - @Override - public void run() { - Toast.makeText(context, "receiving:" + msg, Toast.LENGTH_SHORT).show(); - } - }); - - } - - } - - /* - final String _incomingTelNo = incomingTelNo; - handler.post(new Runnable() { - @Override - public void run() { - Intent intent = new Intent("com.samourai.ponydirect.LOG"); - intent.putExtra("msg", "incoming from:" + _incomingTelNo); - LocalBroadcastManager.getInstance(context).sendBroadcast(intent); - } - }); - */ - - if(incomingTelNo != null && id != null && id.length() != 0) { - verifyIncoming(context, incomingTelNo, id); - } - - } - } - } - - private void verifyIncoming(final Context context, String incomingTelNo, String id) { - - Handler handler = new Handler(); - - HashMap> ids = incoming.get(incomingTelNo); - HashMap segments = ids.get(id); - - int segs = -1; - String hash = null; - String net = null; - - Gson gson = new Gson(); - PayloadFactory.Seg0 seg0 = null; - PayloadFactory.SegN segn = null; - - for(String key : segments.keySet()) { - - String msg = segments.get(key); - if(msg.contains("\"s\":")) { - seg0 = gson.fromJson(msg, PayloadFactory.Seg0.class); - segs = seg0.s; - hash = seg0.h; - net = (seg0.n != null && seg0.n.length() > 0) ? seg0.n : "m"; - } - else { - segn = gson.fromJson(msg, PayloadFactory.SegN.class); - } - - } - - if(segs != -1 && segs == segments.size()) { - - String[] s = new String[segs]; - - int c = -1; - - for(String key : segments.keySet()) { - - final String msg = segments.get(key); - - if(msg.contains("\"s\":")) { - seg0 = gson.fromJson(msg, PayloadFactory.Seg0.class); - c = 0; - } - else { - segn = gson.fromJson(msg, PayloadFactory.SegN.class); - c = segn.c; - } - - if(c != -1) { - s[c] = msg; - } - - } - - final List segmentList = Arrays.asList(s); - - handler.post(new Runnable() { - @Override - public void run() { - Toast.makeText(context, "received:" + segmentList.size(), Toast.LENGTH_SHORT).show(); - } - }); - - PayloadFactory.getInstance(context, transactionHandler).broadcastPayload(segmentList, (net != null && net.equals("t")) ? false : true, false); - - } - else { - Log.d("SMSReceiver", "verifyIncoming(): segment size not recognized"); - } - - } - -} diff --git a/app/src/main/java/com/samourai/sms/SMSSender.java b/app/src/main/java/com/samourai/sms/SMSSender.java deleted file mode 100644 index 81cf6d7..0000000 --- a/app/src/main/java/com/samourai/sms/SMSSender.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.samourai.sms; - -import android.app.Activity; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.telephony.SmsManager; -import android.widget.Toast; -//import android.widget.Toast; -//import android.util.Log; - -public class SMSSender { - - private static Context context = null; - private static PendingIntent sentPI = null; - private static PendingIntent deliveredPI = null; - - private static SMSSender instance = null; - - private SMSSender() { ; } - - public static SMSSender getInstance(Context ctx) { - context = ctx; - - if(instance == null) { - instance = new SMSSender(); - setReceivers(); - } - - return instance; - } - - public void send(String text, String dest) { - SmsManager sm = SmsManager.getDefault(); - sm.sendTextMessage(dest, null, text, null, null); - } - - public static void setReceivers() { - String SENT = "SMS_SENT"; - String DELIVERED = "SMS_DELIVERED"; - - sentPI = PendingIntent.getBroadcast(context, 0, new Intent(SENT), 0); - deliveredPI = PendingIntent.getBroadcast(context, 0, new Intent(DELIVERED), 0); - - //---when the SMS has been sent--- - context.registerReceiver(new BroadcastReceiver(){ - @Override - public void onReceive(Context arg0, Intent arg1) { - switch (getResultCode()) - { - case Activity.RESULT_OK: - Toast.makeText(((Activity)context).getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show(); - break; - case SmsManager.RESULT_ERROR_GENERIC_FAILURE: -// Toast.makeText(((Activity)context).getBaseContext(), "SMS not sent: Generic failure", Toast.LENGTH_SHORT).show(); - break; - case SmsManager.RESULT_ERROR_NO_SERVICE: -// Toast.makeText(((Activity)context).getBaseContext(), "SMS not sent: No service", Toast.LENGTH_SHORT).show(); - break; - case SmsManager.RESULT_ERROR_NULL_PDU: -// Toast.makeText(((Activity)context).getBaseContext(), "SMS not sent: Null PDU", Toast.LENGTH_SHORT).show(); - break; - case SmsManager.RESULT_ERROR_RADIO_OFF: -// Toast.makeText(((Activity)context).getBaseContext(), "SMS not sent: Radio off", Toast.LENGTH_SHORT).show(); - break; - } - } - }, new IntentFilter(SENT)); - - //---when the SMS has been delivered--- - context.registerReceiver(new BroadcastReceiver(){ - @Override - public void onReceive(Context arg0, Intent arg1) { - switch (getResultCode()) - { - case Activity.RESULT_OK: - Toast.makeText(((Activity)context).getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show(); - break; - case Activity.RESULT_CANCELED: -// Toast.makeText(((Activity)context).getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show(); - break; - } - } - }, new IntentFilter(DELIVERED)); - } -} diff --git a/app/src/main/java/com/samourai/txtenna/MainActivity.java b/app/src/main/java/com/samourai/txtenna/MainActivity.java index 3ff746a..a1d5723 100644 --- a/app/src/main/java/com/samourai/txtenna/MainActivity.java +++ b/app/src/main/java/com/samourai/txtenna/MainActivity.java @@ -37,7 +37,6 @@ import com.dm.zbar.android.scanner.ZBarScannerActivity; import com.gotenna.sdk.GoTenna; import com.gotenna.sdk.exceptions.GTInvalidAppTokenException; -import com.samourai.sms.SMSReceiver; import com.samourai.txtenna.adapters.BroadcastLogsAdapter; import com.samourai.txtenna.payload.PayloadFactory; import com.samourai.txtenna.prefs.PrefsUtil; @@ -68,7 +67,6 @@ public class MainActivity extends AppCompatActivity implements IncomingMessagesM private final static int SCAN_HEX_TX = 2011; - private static final int SMS_PERMISSION_CODE = 0; private static final int CAMERA_PERMISSION_CODE = 1; private Group emptyView; private LinearLayout BottomSheetMenu; @@ -129,17 +127,6 @@ public void onClick(View view) { } }); - smsSelection = BottomSheetMenu.findViewById(R.id.sms); - smsSelection.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - relayViaGoTenna = false; - bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - doGetHex(); - } - }); - - if (!hasCameraPermission()) { showRequestCameraPermissionInfoAlertDialog(); } @@ -148,10 +135,6 @@ public void onClick(View view) { showRequestCameraPermissionInfoAlertDialog(); } - if (!hasReadSmsPermission() || !hasSendSmsPermission()) { - showRequestSMSPermissionInfoAlertDialog(); - } - try { PayloadFactory.getInstance(MainActivity.this, transactionHandler).readBroadcastLog(); } catch (JSONException | IOException e) { @@ -217,32 +200,14 @@ protected void onPostCreate(@Nullable Bundle savedInstanceState) { protected void onResume() { super.onResume(); - if(isReceiver == null) { - isFilter = new IntentFilter(); - isFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); - isFilter.setPriority(2147483647); - isReceiver = new SMSReceiver(transactionHandler); - MainActivity.this.registerReceiver(isReceiver, isFilter); - } - refreshData(); - transactionHandler.startTransactionChecker(); - IncomingMessagesManager.getInstance(MainActivity.this.getApplicationContext()).addIncomingMessageListener(this); - } + refreshData(); + transactionHandler.startTransactionChecker(); + IncomingMessagesManager.getInstance(MainActivity.this.getApplicationContext()).addIncomingMessageListener(this); + } @Override protected void onPause() { super.onPause(); - - try { - if(isReceiver != null) { - MainActivity.this.unregisterReceiver(isReceiver); - IncomingMessagesManager.getInstance(MainActivity.this.getApplicationContext()).removeIncomingMessageListener(this); - transactionHandler.stopTransactionChecker(); - } - } - catch(IllegalArgumentException iae) { - ; - } } @Override @@ -450,54 +415,11 @@ public void onClick(DialogInterface dialog, int which) { } - private void showRequestSMSPermissionInfoAlertDialog() { - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.permission_sms_alert_dialog_title); - builder.setMessage(R.string.permission_sms_dialog_message); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - requestSmsPermission(); - } - }); - builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - - builder.show(); - - } - - private boolean hasCameraPermission() { - return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; - } - - private boolean hasReadSmsPermission() { - return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED; - } - - private boolean hasSendSmsPermission() { - return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED; - } - - private void requestSmsPermission() { - - if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.SEND_SMS) && - ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_SMS)) { - Log.d("MainActivity", "shouldShowRequestPermissionRationale(), no permission requested"); - return; - } - - ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS}, SMS_PERMISSION_CODE); - - } + private boolean hasCameraPermission() { + return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; + } - private void requestCameraPermission() { + private void requestCameraPermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA) ) { @@ -523,7 +445,6 @@ private void doSendHex(final String hexTx, final NetworkParameters params) { String msg = null; try { tx = new Transaction(PrefsUtil.getInstance(MainActivity.this).getValue(PrefsUtil.USE_MAINNET, true) == true ? MainNetParams.get() : TestNet3Params.get(), Hex.decode(hexTx)); - msg = MainActivity.this.getString(R.string.broadcast) + ":" + tx.getHashAsString() + " " + getText(R.string.to) + " " + PrefsUtil.getInstance(MainActivity.this).getValue(PrefsUtil.SMS_RELAY, MainActivity.this.getText(R.string.default_relay).toString()) + " ?"; Log.d("MainActivity", "hash:" + tx.getHashAsString()); tx.verify(); } @@ -577,27 +498,17 @@ public void onClick(DialogInterface dialog, int whichButton) { } - }); - dlg.setNeutralButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { + }); + dlg.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); relayViaGoTenna = null; - } - - }); - dlg.setNegativeButton(R.string.sms_broadcast, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - - dialog.dismiss(); + } - List payload = PayloadFactory.toJSON(hexTx, false, params); - PayloadFactory.getInstance(MainActivity.this, transactionHandler).relayPayload(payload, false); - relayViaGoTenna = null; - } - }); - } + }); + } dlg.show(); } diff --git a/app/src/main/java/com/samourai/txtenna/payload/PayloadFactory.java b/app/src/main/java/com/samourai/txtenna/payload/PayloadFactory.java index ca98155..f47b130 100644 --- a/app/src/main/java/com/samourai/txtenna/payload/PayloadFactory.java +++ b/app/src/main/java/com/samourai/txtenna/payload/PayloadFactory.java @@ -10,7 +10,6 @@ import com.google.gson.GsonBuilder; import com.gotenna.sdk.gids.GIDManager; -import com.samourai.sms.SMSSender; import com.samourai.txtenna.utils.Message; import com.samourai.txtenna.R; import com.samourai.txtenna.utils.SendMessageInteractor; @@ -365,14 +364,6 @@ public void onMessageResponseReceived() Log.d("PayloadFactory", "goTenna relayed: " + s + " gid: " + gid); } - else { - SMSSender.getInstance(context).send(s, PrefsUtil.getInstance(context).getValue(PrefsUtil.SMS_RELAY, context.getString(R.string.default_relay))); - Log.d("PayloadFactory", "sms relayed:" + s); - - // add messages that were relayed over the SMS network to the broadcast log - BroadcastLogUtil.getInstance().add(payload.get(0), true, true, false, 0); - transactionHandler.refresh(); - } handler.post(new Runnable() { @Override