Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41cfeb43fc | ||
|
|
72040b54ae | ||
|
|
ab2b0ce34c |
No files matched your search
+4
-2
@@ -61,12 +61,12 @@ android {
|
||||
lint {
|
||||
abortOnError false
|
||||
checkReleaseBuilds false
|
||||
}
|
||||
dependencies }
|
||||
namespace 'com.jens.automation2'
|
||||
buildToolsVersion '36.0.0'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
{
|
||||
implementation 'org.jetbrains:annotations:26.1.0'
|
||||
googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
|
||||
googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:20.0.0'
|
||||
@@ -77,6 +77,8 @@ dependencies {
|
||||
implementation 'com.linkedin.dexmaker:dexmaker:2.28.6'
|
||||
implementation 'org.apache.commons:commons-lang3:3.20.0'
|
||||
|
||||
implementation 'com.sun.mail:android-mail:1.6.4'
|
||||
|
||||
//implementation "androidx.security:security-crypto:1.0.0"
|
||||
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
|
||||
implementation 'androidx.appcompat:appcompat:1.4.2'
|
||||
|
||||
@@ -60,7 +60,9 @@
|
||||
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<!--
|
||||
Removed due to latest threat mail from Google:
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>-->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
|
||||
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
|
||||
|
||||
@@ -2675,4 +2675,32 @@ public class Actions
|
||||
android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, String.valueOf(desiredState));
|
||||
}
|
||||
|
||||
/*public static sendEmail()
|
||||
{
|
||||
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");
|
||||
|
||||
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);
|
||||
}*/
|
||||
}
|
||||
@@ -102,6 +102,12 @@ public class ActivityManageTriggerPhoneCall extends Activity
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
|
||||
{
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.featureNotInGooglePlayVersion), ActivityManageTriggerPhoneCall.this).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !ActivityPermissions.havePermission("android.permission.READ_CONTACTS", ActivityManageTriggerPhoneCall.this))
|
||||
{
|
||||
requestPermissions("android.permission.READ_CONTACTS");
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.IBinder;
|
||||
import android.os.StrictMode;
|
||||
import android.speech.tts.TextToSpeech;
|
||||
import android.speech.tts.TextToSpeech.OnInitListener;
|
||||
import android.util.Log;
|
||||
@@ -36,11 +37,20 @@ import com.jens.automation2.receivers.DateTimeListener;
|
||||
import com.jens.automation2.receivers.PackageReplacedReceiver;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.mail.Address;
|
||||
import javax.mail.Authenticator;
|
||||
import javax.mail.MessagingException;
|
||||
import javax.mail.internet.AddressException;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public class AutomationService extends Service implements OnInitListener
|
||||
{
|
||||
@@ -429,6 +439,25 @@ public class AutomationService extends Service implements OnInitListener
|
||||
Settings.writeSettings(Miscellaneous.getAnyContext());
|
||||
}
|
||||
|
||||
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
|
||||
EmailService es = new EmailService(Settings.smtpServerName, 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);
|
||||
}
|
||||
catch (AddressException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
catch (MessagingException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Settings.serviceStartDone = true;
|
||||
Settings.deviceStartDone = true;
|
||||
}
|
||||
@@ -469,7 +498,7 @@ public class AutomationService extends Service implements OnInitListener
|
||||
if(displayNotification)
|
||||
{
|
||||
Intent intent = new Intent(AutomationService.this, ActivityPermissions.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(AutomationService.this, 0, intent, 0);
|
||||
PendingIntent pi = PendingIntent.getActivity(AutomationService.this, 0, intent, FLAG_IMMUTABLE);
|
||||
|
||||
Miscellaneous.logEvent("w", "Features disabled", "Features disabled because of rule " + rule, 5);
|
||||
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
package com.jens.automation2;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.mail.Address;
|
||||
import javax.mail.Authenticator;
|
||||
import javax.mail.Message;
|
||||
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;
|
||||
import javax.mail.internet.MimeMultipart;
|
||||
|
||||
public class EmailService
|
||||
{
|
||||
private final String server;
|
||||
private final int port;
|
||||
|
||||
public static final String CLIENT_NAME = "Android StackOverflow programmatic email";
|
||||
|
||||
public EmailService(String server, int port)
|
||||
{
|
||||
this.server = server;
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public static class Email
|
||||
{
|
||||
private final Authenticator auth;
|
||||
private final List<InternetAddress> toList;
|
||||
private final Address from;
|
||||
private final String subject;
|
||||
private final String body;
|
||||
|
||||
public Email(Authenticator auth, List<InternetAddress> toList, Address from, String subject, String body)
|
||||
{
|
||||
this.auth = auth;
|
||||
this.toList = toList;
|
||||
this.from = from;
|
||||
this.subject = subject;
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
public Authenticator getAuth()
|
||||
{
|
||||
return auth;
|
||||
}
|
||||
|
||||
public List<InternetAddress> getToList()
|
||||
{
|
||||
return toList;
|
||||
}
|
||||
|
||||
public Address getFrom()
|
||||
{
|
||||
return from;
|
||||
}
|
||||
|
||||
public String getSubject()
|
||||
{
|
||||
return subject;
|
||||
}
|
||||
|
||||
public String getBody()
|
||||
{
|
||||
return body;
|
||||
}
|
||||
}
|
||||
|
||||
public static class UserPassAuthenticator extends Authenticator
|
||||
{
|
||||
private final String username;
|
||||
private final String password;
|
||||
|
||||
public UserPassAuthenticator(String username, String password)
|
||||
{
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication()
|
||||
{
|
||||
return new PasswordAuthentication(username, password);
|
||||
}
|
||||
}
|
||||
|
||||
public void send(Email email) throws MessagingException
|
||||
{
|
||||
Properties props = new Properties();
|
||||
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);
|
||||
props.put("mail.mime.charset", "UTF-8");
|
||||
|
||||
Session session = Session.getDefaultInstance(props, email.getAuth());
|
||||
MimeMessage msg = new MimeMessage(session);
|
||||
|
||||
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]));
|
||||
|
||||
msg.setReplyTo(new Address[]{email.getFrom()});
|
||||
|
||||
msg.addHeader("X-Mailer", CLIENT_NAME);
|
||||
msg.addHeader("Precedence", "bulk");
|
||||
msg.setSubject(email.getSubject());
|
||||
|
||||
MimeMultipart multipart = new MimeMultipart();
|
||||
MimeBodyPart bodyPart = new MimeBodyPart();
|
||||
bodyPart.setText(email.getBody(), "iso-8859-1");
|
||||
multipart.addBodyPart(bodyPart);
|
||||
|
||||
msg.setContent(multipart);
|
||||
Transport.send(msg);
|
||||
}
|
||||
}
|
||||
@@ -698,7 +698,7 @@
|
||||
<string name="bottom">Bottom</string>
|
||||
<string name="tabsPlacement">Position of tab bar</string>
|
||||
<string name="tabsPlacementSummary">Choose where the tabs bar should be placed.</string>
|
||||
<string name="wifiApi30">Because Google screwed up yet another part of Android, starting with API 30 only the currently visible wifis can be displayed, not all the ones your device has connected to anymore.</string>
|
||||
<string name="wifiApi30">Because Google screwed up yet another part of Android, starting with API 30 only the currently visible Wi-Fi can be displayed, not all the ones your device has connected to anymore.</string>
|
||||
<string name="silentTriggersDnd">REMARK: The silent mode often triggers Do-Not-Disturb on newer devices. If that happens on your device, I recommend using the normal mode instead and lowering all volumes to zero.</string>
|
||||
<string name="tones">Tones</string>
|
||||
<string name="miscellaneous">Miscellaneous</string>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
* Added: Triggers and actions can now be cloned
|
||||
* Added: URL checker for triggerUrl action
|
||||
* Fixed: Crash when starting to add/edit a triggerURL action while the app or the system are set to the German language
|
||||
* Fixed: Crash when starting to add/edit a triggerURL action while the app or the system are set to the German language
|
||||
* Fixed: Crash when starting service in Google Play version
|
||||
Reference in new issue
Block a user