diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml index 3fe42be..d0aa074 100644 --- a/app/src/apkFlavor/AndroidManifest.xml +++ b/app/src/apkFlavor/AndroidManifest.xml @@ -240,6 +240,7 @@ + + + = Build.VERSION_CODES.JELLY_BEAN_MR1) Actions.setSystemSetting(this.getParameter2(), AutomationService.getInstance()); break; + case sendEmail: + Actions.sendEmailFromAction(this); + break; default: Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3); break; diff --git a/app/src/main/java/com/jens/automation2/Actions.java b/app/src/main/java/com/jens/automation2/Actions.java index 1736a58..5d974c9 100644 --- a/app/src/main/java/com/jens/automation2/Actions.java +++ b/app/src/main/java/com/jens/automation2/Actions.java @@ -65,6 +65,7 @@ import java.lang.reflect.Method; import java.net.InetAddress; import java.net.NetworkInterface; import java.security.KeyStore; +import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Enumeration; @@ -75,6 +76,7 @@ import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; +import javax.mail.internet.InternetAddress; import javax.net.ssl.SSLContext; import eu.chainfire.libsuperuser.Shell; @@ -2675,32 +2677,24 @@ public class Actions android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, String.valueOf(desiredState)); } - /*public static sendEmail() + public static boolean sendEmailFromAction(Action action) { - Properties props = new Properties(); - props.put("mail.smtp.host", smtpHost); - props.put("mail.smtp.port", "587"); - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.smtp.connectiontimeout", "10000"); - props.put("mail.smtp.timeout", "10000"); + try + { + String[] components = action.getParameter2().split(Action.actionParameter2Split, -1); + EmailService es = new EmailService(Settings.smtpServerHostname, Integer.parseInt(Settings.smtpServerPort), Settings.smtpServerUseTls); + List toAddressList = new ArrayList<>(); + toAddressList.add(new InternetAddress(components[0])); - Session session = Session.getInstance(props, new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - - Message message = new MimeMessage(session); - message.setFrom(new InternetAddress(fromAddress)); - message.setRecipients( - Message.RecipientType.TO, - InternetAddress.parse(recipientAddress) - ); - message.setSubject(subject); - message.setText(body); - - Transport.send(message); - }*/ + EmailService.Email em = new EmailService.Email(new EmailService.UserPassAuthenticator(Settings.smtpUsername, Settings.smtpPassword), new InternetAddress(Settings.smtpFromAddress), toAddressList, components[1], components[2]); + es.send(em); + Miscellaneous.logEvent("i", "sendEmail()", "Email sent.", 1); + return true; + } + catch (Exception e) + { + Miscellaneous.logEvent("e", "sendEmail()", "Email could not be sent: " + Log.getStackTraceString(e), 1); + return false; + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionSendEmail.java b/app/src/main/java/com/jens/automation2/ActivityManageActionSendEmail.java new file mode 100644 index 0000000..3ab373b --- /dev/null +++ b/app/src/main/java/com/jens/automation2/ActivityManageActionSendEmail.java @@ -0,0 +1,89 @@ +package com.jens.automation2; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; + +import com.google.android.material.textfield.TextInputEditText; +import com.jens.automation2.Action.Action_Enum; + +import org.apache.commons.lang3.StringUtils; + + +public class ActivityManageActionSendEmail extends Activity +{ + Button bSaveSendEmail; + TextView tvEmailServerConfigurationNotice; + EditText etEmailRecipient, etEmailSubject, etEmailText; + + public static boolean edit = false; + public static Action resultingAction = null; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Miscellaneous.setDisplayLanguage(this); + Miscellaneous.setUiTheme(this); + this.setContentView(R.layout.activity_manage_action_send_email); + + tvEmailServerConfigurationNotice = (TextView)findViewById(R.id.tvEmailServerConfigurationNotice); + etEmailRecipient = (EditText)findViewById(R.id.etEmailRecipient); + etEmailSubject = (EditText)findViewById(R.id.etEmailSubject); + etEmailText = (EditText)findViewById(R.id.etEmailText); + bSaveSendEmail = (Button)findViewById(R.id.bSaveSendEmail); + + if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2)) + { + String[] components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split, -1); + etEmailRecipient.setText(components[0]); + etEmailSubject.setText(components[1]); + etEmailText.setText(components[2]); + } + + if(Settings.smtpServerHostname.isEmpty()) + tvEmailServerConfigurationNotice.setVisibility(View.VISIBLE); + else + tvEmailServerConfigurationNotice.setVisibility(View.GONE); + + bSaveSendEmail.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View v) + { + if(etEmailRecipient.getText().toString().length() > 0 && etEmailSubject.getText().toString().length() > 0 && etEmailText.getText().toString().length() > 0) + { + if (resultingAction == null) + resultingAction = new Action(); + + String responseString = etEmailRecipient.getText().toString() + Action.actionParameter2Split + etEmailSubject.getText().toString() + Action.actionParameter2Split + etEmailText.getText().toString(); + + Intent answer = new Intent(); + + answer.putExtra(ActivityManageRule.intentNameActionParameter2, responseString); + + setResult(RESULT_OK, answer); + ActivityManageActionSendEmail.this.finish(); + } + else + Toast.makeText(getBaseContext(), getResources().getString(R.string.enterAllValues), Toast.LENGTH_LONG).show(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 3c1f307..fa19852 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -151,6 +151,8 @@ public class ActivityManageRule extends Activity final static int requestCodeTriggerProximityEdit = 838; final static int requestCodeActionSetSystemSettingAdd = 839; final static int requestCodeActionSetSystemSettingEdit = 840; + final static int requestCodeActionSendEmailAdd = 841; + final static int requestCodeActionSendEmailEdit = 842; public static ActivityManageRule getInstance() { @@ -2263,6 +2265,32 @@ public class ActivityManageRule extends Activity this.refreshActionList(); } } + else if(requestCode == requestCodeActionSendEmailAdd) + { + if(resultCode == RESULT_OK) + { + newAction.setParentRule(ruleToEdit); +// newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false)); + newAction.setParameter2(data.getStringExtra(intentNameActionParameter2)); + ruleToEdit.getActionSet().add(newAction); + this.refreshActionList(); + } + } + else if(requestCode == requestCodeActionSendEmailEdit) + { + if(resultCode == RESULT_OK) + { + ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit); +// ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false)); + + if(data.hasExtra(intentNameActionParameter2)) + { + ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2)); + } + + this.refreshActionList(); + } + } } protected AlertDialog getActionTypeDialog() @@ -2343,14 +2371,15 @@ public class ActivityManageRule extends Activity items.add(new Item(typesLong[i].toString(), R.drawable.variable)); else if(types[i].toString().equals(Action_Enum.setLocationService.toString())) items.add(new Item(typesLong[i].toString(), R.drawable.compass_small)); + else if(types[i].toString().equals(Action_Enum.sendEmail.toString())) + items.add(new Item(typesLong[i].toString(), R.drawable.email)); else if(types[i].toString().equals(Action_Enum.takeScreenshot.toString())) { if(ActivityPermissions.isServiceAvailable(Miscellaneous.getAnyContext(), "MyAccessibilityService")) items.add(new Item(typesLong[i].toString(), R.drawable.copier)); } else if(types[i].toString().equals(Action_Enum.setSystemSetting.toString())) - { items.add(new Item(typesLong[i].toString(), R.drawable.gears_small)); - } + items.add(new Item(typesLong[i].toString(), R.drawable.gears_small)); else items.add(new Item(typesLong[i].toString(), R.drawable.placeholder)); } @@ -2595,6 +2624,12 @@ public class ActivityManageRule extends Activity Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSetSystemSetting.class); startActivityForResult(intent, requestCodeActionSetSystemSettingAdd); } + else if(actionTypes[which].toString().equals(Action_Enum.sendEmail.toString())) + { + newAction.setAction(Action_Enum.sendEmail); + Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSendEmail.class); + startActivityForResult(intent, requestCodeActionSendEmailAdd); + } } }); diff --git a/app/src/main/java/com/jens/automation2/AutomationService.java b/app/src/main/java/com/jens/automation2/AutomationService.java index 160c82a..c84a7b4 100644 --- a/app/src/main/java/com/jens/automation2/AutomationService.java +++ b/app/src/main/java/com/jens/automation2/AutomationService.java @@ -434,33 +434,6 @@ public class AutomationService extends Service implements OnInitListener Settings.writeSettings(Miscellaneous.getAnyContext()); } -// try -// { - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); - EmailService es = new EmailService(Settings.smtpServerHostname, Integer.parseInt(Settings.smtpServerPort)); - - List addresses = new ArrayList(); - addresses.add(Settings.smtpFromAddress); - try - { - EmailService.Email em = new EmailService.Email(new EmailService.UserPassAuthenticator(Settings.smtpUsername, Settings.smtpPassword), addresses, new InternetAddress(String.valueOf(addresses.get(0))), "test", "testbody"); - es.send(em); - Miscellaneous.logEvent("i", "sendEmail()", "Email sent.", 1); - } - catch (AddressException e) - { - throw new RuntimeException(e); - } - catch (MessagingException e) - { - throw new RuntimeException(e); - } -// } -// catch(Exception e) -// { -// Miscellaneous.logEvent("e", "sendMail()", Log.getStackTraceString(e), 1); -// } - Settings.serviceStartDone = true; Settings.deviceStartDone = true; } diff --git a/app/src/main/java/com/jens/automation2/EmailService.java b/app/src/main/java/com/jens/automation2/EmailService.java index cd59b57..b519c90 100644 --- a/app/src/main/java/com/jens/automation2/EmailService.java +++ b/app/src/main/java/com/jens/automation2/EmailService.java @@ -10,7 +10,6 @@ import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; -import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; @@ -20,28 +19,30 @@ public class EmailService { private final String server; private final int port; + private final boolean useTls; public static final String CLIENT_NAME = "Android StackOverflow programmatic email"; - public EmailService(String server, int port) + public EmailService(String server, int port, boolean useTls) { this.server = server; this.port = port; + this.useTls = useTls; } public static class Email { - private final Authenticator auth; + private Authenticator auth; private final List toList; private final Address from; private final String subject; private final String body; - public Email(Authenticator auth, List toList, Address from, String subject, String body) + public Email(Authenticator auth, Address from, List toList, String subject, String body) { this.auth = auth; - this.toList = toList; this.from = from; + this.toList = toList; this.subject = subject; this.body = body; } @@ -93,12 +94,26 @@ public class EmailService public void send(Email email) throws MessagingException { Properties props = new Properties(); - props.put("mail.smtp.auth", "true"); + if(((UserPassAuthenticator)email.getAuth()).getPasswordAuthentication().getUserName().isEmpty()) + { + props.put("mail.smtp.auth", "false"); + email.auth = null; + } + else + props.put("mail.smtp.auth", "true"); + props.put("mail.user", email.getFrom().toString()); props.put("mail.smtp.host", server); props.put("mail.smtp.port", String.valueOf(port)); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.smtp.ssl.trust", server); + + if(useTls) + { + props.put("mail.smtp.starttls.enable", "true"); + props.put("mail.smtp.ssl.trust", server); + } + else + props.put("mail.smtp.starttls.enable", "false"); + props.put("mail.mime.charset", "UTF-8"); Session session = Session.getDefaultInstance(props, email.getAuth()); @@ -106,9 +121,8 @@ public class EmailService msg.setFrom(email.getFrom()); msg.setSentDate(Calendar.getInstance().getTime()); - Address[] toarray = new Address[]{email.getFrom()}; - msg.setRecipients(Message.RecipientType.TO, toarray); -// msg.setRecipients(Message.RecipientType.TO, email.getToList().toArray(new InternetAddress[0])); + Address[] toArray = new Address[]{email.getFrom()}; + msg.setRecipients(Message.RecipientType.TO, toArray); msg.setReplyTo(new Address[]{email.getFrom()}); diff --git a/app/src/main/java/com/jens/automation2/Miscellaneous.java b/app/src/main/java/com/jens/automation2/Miscellaneous.java index d1d98ce..3a32330 100644 --- a/app/src/main/java/com/jens/automation2/Miscellaneous.java +++ b/app/src/main/java/com/jens/automation2/Miscellaneous.java @@ -111,6 +111,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import javax.mail.internet.InternetAddress; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; diff --git a/app/src/main/res/drawable-hdpi/email.png b/app/src/main/res/drawable-hdpi/email.png new file mode 100644 index 0000000..8dc1410 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/email.png differ diff --git a/app/src/main/res/layout/activity_manage_action_send_email.xml b/app/src/main/res/layout/activity_manage_action_send_email.xml new file mode 100644 index 0000000..cd111c5 --- /dev/null +++ b/app/src/main/res/layout/activity_manage_action_send_email.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +