28 Commits

Author SHA1 Message Date
4f971e8a1b New version 2023-11-25 23:23:58 +01:00
34fbc1d005 New version prepared 2023-11-24 23:57:26 +01:00
b72049defc Start other service bugfix attempt 2023-11-22 23:20:26 +01:00
54f3cc84c4 Start other service bugfix attempt 2023-11-19 23:44:10 +01:00
7884358564 Start other service bugfix attempt 2023-11-08 00:15:39 +01:00
f24c9f99dc startService() experiments 2023-11-05 16:20:48 +01:00
64b97c650d Small changes 2023-10-28 23:20:07 +02:00
9daf4c4747 Small changes 2023-10-27 23:59:12 +02:00
94f7936c4a ActivityDetection permission fixed 2023-10-26 23:30:45 +02:00
02f7b642cf Wifi trigger hint 2023-10-23 23:44:21 +02:00
8d10bf05af Escaped variables when triggering 2023-10-19 22:30:13 +02:00
8c0cee9589 Wifi trigger fix attempt 2023-10-15 23:54:27 +02:00
6b23bd6733 Icon restored 2023-08-31 15:21:55 +02:00
1a60c88f35 Merge remote-tracking branch 'origin/development' into development
# Conflicts:
#	fastlane/metadata/android/en-US/changelogs/134.txt
2023-08-30 23:25:13 +02:00
3312d99177 Changes icon in Play store version 2023-08-30 23:23:58 +02:00
ea01806915 Charging trigger bug fixed 2023-08-24 20:04:05 +02:00
36173f2fcb device admin permission added for start phone call action 2023-08-01 22:59:05 +02:00
4c66fe906e Merge remote-tracking branch 'origin/development-stable' 2023-07-30 22:24:40 +02:00
60cfa150b5 Missing translations added 2023-07-25 23:31:32 +02:00
bd2231b075 Changelogs translated 2023-07-24 23:52:25 +02:00
158f5f2e04 Merge remote-tracking branch 'origin/development' into development 2023-07-23 20:10:52 +02:00
f1315dc742 Chinese translation added. 2023-07-23 18:57:38 +02:00
28aa0c3e4b Imports optimized 2023-07-11 00:07:07 +02:00
6b9dbca7ab Merge remote-tracking branch 'origin/development' into development
# Conflicts:
#	fastlane/metadata/android/en-US/changelogs/133.txt
2023-07-02 00:33:59 +02:00
291e0c41af Fixed bug 2023-07-02 00:31:09 +02:00
2470321e15 Merge remote-tracking branch 'origin/development-stable' 2023-06-05 14:46:05 +02:00
5caf33b45d revert 6a74d070ebf515470c34d05ab5b3215036ac1148
revert Fixed: Crash when managing phone call action in the F-Droid version
2023-05-05 22:48:39 +02:00
6a74d070eb Fixed: Crash when managing phone call action in the F-Droid version 2023-05-05 22:38:17 +02:00
104 changed files with 526 additions and 107 deletions

View File

@ -11,8 +11,8 @@ android {
compileSdkVersion 31
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
versionCode 132
versionName "1.7.16"
versionCode 136
versionName "1.7.19"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -36,9 +36,15 @@ android {
{
dimension "version"
versionNameSuffix "-googlePlay"
targetSdkVersion 31
targetSdkVersion 33
}
/*
targetSdkVersion is kept at 28 for as long as possible.
If raised wifi cannot be switched on or off anymore without root permissions.
In the Google version I'm forced to raise the value regularly.
*/
fdroidFlavor
{
dimension "version"

View File

@ -87,7 +87,7 @@
<application
android:allowBackup="true"
android:allowClearUserData="true"
android:icon="@drawable/gears"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config">

View File

@ -85,7 +85,7 @@
<application
android:allowBackup="true"
android:allowClearUserData="true"
android:icon="@drawable/gears"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config">

View File

@ -65,12 +65,11 @@
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<application
android:allowBackup="true"
android:allowClearUserData="true"
android:icon="@drawable/gears"
android:icon="@drawable/crane"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config">

View File

@ -10,6 +10,7 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
@ -93,6 +94,7 @@ public class Actions
Miscellaneous.logEvent("w", "createNotification", "Creating notification with title " + elements[0] + " and text " + elements[1], 3);
// Create a new notification ID each time
int notificationId = Math.round(Calendar.getInstance().getTimeInMillis()/1000);
try
@ -1045,7 +1047,7 @@ public class Actions
try
{
Intent externalActivityIntent;
Intent externalApplicationIntent;
if (!startByAction)
{
@ -1058,15 +1060,15 @@ public class Actions
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by activity: " + packageName + " " + className, 3);
externalActivityIntent = new Intent(Intent.ACTION_MAIN);
externalActivityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
externalApplicationIntent = new Intent(Intent.ACTION_MAIN);
externalApplicationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// if(packageName.equals("dummyPkg"))
// externalActivityIntent.setAction(className);
// else
externalActivityIntent.setClassName(packageName, className);
if(packageName.equals("dummyPkg"))
externalApplicationIntent.setAction(className);
if (!Miscellaneous.doesActivityExist(externalActivityIntent, Miscellaneous.getAnyContext()))
externalApplicationIntent.setClassName(packageName, className);
if (!Miscellaneous.doesActivityExist(externalApplicationIntent, Miscellaneous.getAnyContext()))
Miscellaneous.logEvent("w", "StartOtherApp", "Activity not found: " + className, 2);
}
else
@ -1074,25 +1076,32 @@ public class Actions
// selected by action
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by action: " + param, 3);
externalActivityIntent = new Intent();
externalApplicationIntent = new Intent();
if (!params[0].equals(dummyPackageString))
externalActivityIntent.setPackage(params[0]);
externalApplicationIntent.setPackage(params[0]);
externalActivityIntent.setAction(params[1]);
externalApplicationIntent.setAction(params[1]);
if (params[2].equals(ActivityManageActionStartActivity.startByServiceString) || params[2].equals(ActivityManageActionStartActivity.startByForegroundServiceString))
{
externalApplicationIntent.setComponent(new ComponentName(params[0], params[2]));
}
}
externalActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
externalApplicationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Pack intents
externalActivityIntent = packParametersIntoIntent(externalActivityIntent, params, 3);
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 3);
if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
automationServerRef.startActivity(externalActivityIntent);
if (params[2].equals(ActivityManageActionStartActivity.startByServiceString))
automationServerRef.startService(externalActivityIntent);
automationServerRef.startActivity(externalApplicationIntent);
else if (params[2].equals(ActivityManageActionStartActivity.startByServiceString))
automationServerRef.startService(externalApplicationIntent);
else if (params[2].equals(ActivityManageActionStartActivity.startByForegroundServiceString) && Build.VERSION.SDK_INT >= 26)
automationServerRef.startForegroundService(externalApplicationIntent);
else
automationServerRef.sendBroadcast(externalActivityIntent);
automationServerRef.sendBroadcast(externalApplicationIntent);
}
catch (Exception e)
{
@ -2272,7 +2281,7 @@ public class Actions
public static void startPhoneCall(Context context, String phoneNumber)
{
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber));
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(phoneNumber)));
// intent.setClassName("com.android.phone","com.android.phone.OutgoingCallBroadcaster");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_FROM_BACKGROUND);

View File

@ -39,8 +39,10 @@ public class ActivityControlCenter extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_control_center);
bVolumeTest = (Button) findViewById(R.id.bVolumeTest);
bVolumeTest.setOnClickListener(new View.OnClickListener()
{
@ -384,6 +386,7 @@ public class ActivityControlCenter extends Activity
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
String folder = Miscellaneous.getWriteableFolder();
if (folder != null && folder.length() > 0)

View File

@ -21,6 +21,7 @@ public class ActivityDisplayLongMessage extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_display_long_message);
tvMessageTitle = (TextView)findViewById(R.id.tvMessageTitle);

View File

@ -13,6 +13,7 @@ public class ActivityHelp extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(layout.activity_help_text);
TextView tvHelpTextEnergySaving = (TextView) findViewById(R.id.tvHelpTextEnergySaving);

View File

@ -44,7 +44,7 @@ public class ActivityMainPoi extends ActivityGeneric
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(ActivityMainPoi.this);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_poi_layout);
instance = this;
@ -108,6 +108,13 @@ public class ActivityMainPoi extends ActivityGeneric
this.storeServiceReferenceInVariable();
}
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
private void buttonAddPoi()
{
poiToEdit = null;

View File

@ -40,7 +40,7 @@ public class ActivityMainProfiles extends ActivityGeneric
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(ActivityMainProfiles.this);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_profile_layout);
instance = this;
@ -155,6 +155,13 @@ public class ActivityMainProfiles extends ActivityGeneric
}
}
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
private AlertDialog getProfileDialog(final Profile profile)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

View File

@ -48,7 +48,7 @@ public class ActivityMainRules extends ActivityGeneric
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(ActivityMainRules.this);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_rule_layout);
instance = this;
@ -154,6 +154,13 @@ public class ActivityMainRules extends ActivityGeneric
return v;
}
}
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)

View File

@ -55,7 +55,7 @@ public class ActivityMainScreen extends ActivityGeneric
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(ActivityMainScreen.this);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_overview_layout);
activityMainScreenInstance = this;
@ -434,7 +434,7 @@ public class ActivityMainScreen extends ActivityGeneric
else
activityMainScreenInstance.checkForNews();
if(BuildConfig.FLAVOR.equals("apkFlavor") && Settings.automaticUpdateCheck)
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk) && Settings.automaticUpdateCheck)
{
Calendar now = Calendar.getInstance();
if (Settings.lastUpdateCheck == Settings.default_lastUpdateCheck || now.getTimeInMillis() >= Settings.lastUpdateCheck + (long)(Settings.updateCheckFrequencyDays * 24 * 60 * 60 * 1000))
@ -571,6 +571,7 @@ public class ActivityMainScreen extends ActivityGeneric
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
toggleService.setChecked(AutomationService.isMyServiceRunning(this));
ActivityMainScreen.updateMainScreen();

View File

@ -23,7 +23,7 @@ public class ActivityMainTabLayout extends TabActivity
{
super.onCreate(savedInstanceState);
Settings.readFromPersistentStorage(ActivityMainTabLayout.this);
Miscellaneous.setDisplayLanguage(ActivityMainTabLayout.this);
Miscellaneous.setDisplayLanguage(this);
if(Settings.tabsPlacement == 1)
setContentView(R.layout.main_tab_layout_tabs_at_bottom);
@ -65,6 +65,7 @@ public class ActivityMainTabLayout extends TabActivity
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5);
NfcReceiver.checkIntentForNFC(this, getIntent());
// NfcReceiver.checkIntentForNFC(this, new Intent(this.getApplicationContext(), this.getClass()));

View File

@ -26,6 +26,7 @@ public class ActivityManageActionBrightnessSetting extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
setContentView(R.layout.activity_manage_action_brightness_settings);
Miscellaneous.setDisplayLanguage(this);
super.onCreate(savedInstanceState);
chkAutoBrightness = (CheckBox)findViewById(R.id.chkAutoBrightness);

View File

@ -259,6 +259,7 @@ public class ActivityManageActionCloseNotification extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_close_notification);
etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle);

View File

@ -19,6 +19,7 @@ public class ActivityManageActionControlMedia extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_control_media);
rbMediaPlayPause = (RadioButton)findViewById(R.id.rbMediaPlayPause);

View File

@ -19,6 +19,7 @@ public class ActivityManageActionCopyToClipboard extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_copy_to_clipboard);
bSaveCopyToClipboard = (Button) findViewById(R.id.bSaveCopyToClipboard);

View File

@ -24,6 +24,7 @@ public class ActivityManageActionCreateNotification extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_create_notification);
etNotificationTitle = (EditText) findViewById(R.id.etNotificationTitle);

View File

@ -21,6 +21,7 @@ public class ActivityManageActionMakePhoneCall extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_make_phone_call);
etTargetPhoneNumber = (EditText)findViewById(R.id.etTargetPhoneNumber);

View File

@ -26,6 +26,7 @@ public class ActivityManageActionPlaySound extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_play_sound);
chkPlaySoundAlwaysPlay = (CheckBox)findViewById(R.id.chkPlaySoundAlwaysPlay);

View File

@ -28,6 +28,7 @@ public class ActivityManageActionRunExecutable extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_run_executable);
chkRunExecAsRoot = (CheckBox)findViewById(R.id.chkRunExecAsRoot);

View File

@ -37,6 +37,7 @@ public class ActivityManageActionSendBroadcast extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_send_broadcast);
etBroadcastToSend = (EditText)findViewById(R.id.etBroadcastToSend);

View File

@ -48,6 +48,7 @@ public class ActivityManageActionSendTextMessage extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_send_textmessage);
etSendTextMessage = (EditText)findViewById(R.id.etSendTextMessage);

View File

@ -24,6 +24,7 @@ public class ActivityManageActionSetVariable extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_set_variable);
etVariableSetKey = (EditText)findViewById(R.id.etVariableSetKey);

View File

@ -22,6 +22,7 @@ public class ActivityManageActionSpeakText extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_speak_text);
etSpeakText = (EditText)findViewById(R.id.etTextToSpeak);

View File

@ -29,6 +29,7 @@ import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
@ -48,17 +49,19 @@ public class ActivityManageActionStartActivity extends Activity
*/
ListView lvIntentPairs;
EditText etParameterName, etParameterValue, etPackageName, etActivityOrActionPath;
EditText etParameterName, etParameterValue, etPackageName, etActivityOrActionPath, etClassName;
Button bSelectApp, bAddIntentPair, bSaveActionStartOtherActivity, showStartProgramExamples;
Spinner spinnerParameterType;
RadioGroup rgAppStartupType;
boolean edit = false;
ProgressDialog progressDialog = null;
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast, rbStartAppByService;
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast, rbStartAppByService, rbStartAppByForegroundService;
final String urlShowExamples = "https://server47.de/automation/examples_startProgram.html";
final static String startByActivityString = "0";
final static String startByBroadcastString = "1";
final static String startByServiceString = "2";
final static String startByForegroundServiceString = "3";
final static int requestCodeForRequestQueryAllPackagesPermission = 4711;
@ -66,11 +69,13 @@ public class ActivityManageActionStartActivity extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_start_activity);
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
etParameterName = (EditText)findViewById(R.id.etParameterName);
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
etClassName = (EditText)findViewById(R.id.etClassName);
bSelectApp = (Button)findViewById(R.id.bSelectApp);
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
bSaveActionStartOtherActivity = (Button)findViewById(R.id.bSaveActionStartOtherActivity);
@ -83,13 +88,16 @@ public class ActivityManageActionStartActivity extends Activity
rbStartAppByActivity = (RadioButton)findViewById(R.id.rbStartAppByActivity);
rbStartAppByBroadcast = (RadioButton)findViewById(R.id.rbStartAppByBroadcast);
rbStartAppByService = (RadioButton)findViewById(R.id.rbStartAppByService);
rbStartAppByForegroundService = (RadioButton)findViewById(R.id.rbStartAppByForegroundService);
rgAppStartupType = (RadioGroup)findViewById(R.id.rgAppStartupType);
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionStartActivity.supportedIntentTypes);
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
intentTypeSpinnerAdapter.notifyDataSetChanged();
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
etClassName.setEnabled(false);
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
bSelectApp.setOnClickListener(new OnClickListener()
{
@Override
@ -227,17 +235,23 @@ public class ActivityManageActionStartActivity extends Activity
if (rbStartAppSelectByActivity.isChecked())
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
else {
else
{
if (etPackageName.getText().toString() != null && etPackageName.getText().toString().length() > 0)
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
else
parameter2 += Actions.dummyPackageString + ";" + etActivityOrActionPath.getText().toString();
// if(etClassName.getText().toString().length() > 0)
parameter2 += ";" + etClassName.getText().toString();
}
if (rbStartAppByActivity.isChecked())
parameter2 += ";" + startByActivityString;
else if(rbStartAppByService.isChecked())
parameter2 += ";" + startByServiceString;
else if(rbStartAppByForegroundService.isChecked())
parameter2 += ";" + startByForegroundServiceString;
else
parameter2 += ";" + startByBroadcastString;
@ -289,7 +303,9 @@ public class ActivityManageActionStartActivity extends Activity
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
{
bSelectApp.setEnabled(isChecked);
}
}
});
@ -303,6 +319,23 @@ public class ActivityManageActionStartActivity extends Activity
}
});
rgAppStartupType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
{
if(rbStartAppByActivity.isChecked())
etClassName.setEnabled(false);
else if (rbStartAppByBroadcast.isChecked())
etClassName.setEnabled(false);
else if(rbStartAppByService.isChecked())
etClassName.setEnabled(true);
else if(rbStartAppByForegroundService.isChecked())
etClassName.setEnabled(true);
}
});
Intent i = getIntent();
if(i.hasExtra(ActivityManageRule.intentNameActionParameter1))
loadValuesIntoGui(i);
@ -597,9 +630,19 @@ public class ActivityManageActionStartActivity extends Activity
String[] params = input.getStringExtra(ActivityManageRule.intentNameActionParameter2).split(";");
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[2].equals(startByServiceString));
if(Miscellaneous.isNumeric(params[2])) // old configuration file
{
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[2].equals(startByServiceString));
}
else
{
rbStartAppByActivity.setChecked(params[3].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[3].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[3].equals(startByServiceString));
rbStartAppByForegroundService.setChecked(params[3].equals(startByForegroundServiceString));
}
int startIndex = -1;
@ -614,10 +657,11 @@ public class ActivityManageActionStartActivity extends Activity
etPackageName.setText(params[0]);
etActivityOrActionPath.setText(params[1]);
etClassName.setText(params[2]);
}
if (params.length >= 3)
startIndex = 3;
if (params.length >= 4)
startIndex = 4;
if(startIndex > -1 && params.length > startIndex)
{

View File

@ -39,6 +39,7 @@ public class ActivityManageActionTriggerUrl extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_trigger_url);
etTriggerUrl = (EditText)findViewById(R.id.etTriggerUrl);

View File

@ -27,6 +27,7 @@ public class ActivityManageActionVibrate extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_vibrate);
etVibratePattern = (EditText)findViewById(R.id.etVibratePattern);

View File

@ -27,6 +27,7 @@ public class ActivityManageActionWakeLock extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_wakelock);
rbWakeLockActivate = (RadioButton)findViewById(R.id.rbWakeLockActivate);

View File

@ -23,6 +23,7 @@ public class ActivityManageActionWifi extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_wifi);
chkWifiRunAsRoot = (CheckBox)findViewById(R.id.chkWifiRunAsRoot);

View File

@ -59,6 +59,7 @@ public class ActivityManagePoi extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_specific_poi);
myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

View File

@ -86,6 +86,7 @@ public class ActivityManageProfile extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_specific_profile);
checkBoxChangeSoundMode = (CheckBox)findViewById(R.id.checkBoxChangeSoundMode);

View File

@ -154,6 +154,7 @@ public class ActivityManageRule extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_specific_rule);
context = this;

View File

@ -32,6 +32,7 @@ public class ActivityManageTriggerBluetooth extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_bluetooth);
radioAnyBluetoothDevice = (RadioButton)findViewById(R.id.radioAnyBluetoothDevice);

View File

@ -28,6 +28,7 @@ public class ActivityManageTriggerBroadcast extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_broadcasts);
bBroadcastShowSuggestions = findViewById(R.id.bBroadcastShowSuggestions);

View File

@ -20,6 +20,7 @@ public class ActivityManageTriggerCheckVariable extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_check_variable);
etVariableKeyTrigger = (EditText) findViewById(R.id.etVariableKeyTrigger);

View File

@ -104,6 +104,7 @@ public class ActivityManageTriggerDeviceOrientation extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_device_orientation);
currentAzimuth = (TextView) findViewById(R.id.tvCurrentAzimuth);

View File

@ -39,6 +39,7 @@ public class ActivityManageTriggerNfc extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_nfc);
etNewNfcIdValue = (EditText)findViewById(R.id.etNewNfcIdValue);

View File

@ -258,6 +258,7 @@ public class ActivityManageTriggerNotification extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_notification);
etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle);

View File

@ -35,6 +35,7 @@ public class ActivityManageTriggerPhoneCall extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_phone_call);
etTriggerPhoneCallPhoneNumber = (EditText)findViewById(R.id.etTriggerPhoneCallPhoneNumber);

View File

@ -31,6 +31,7 @@ public class ActivityManageTriggerProfile extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_profile);
bSaveTriggerProfile = (Button)findViewById(R.id.bSaveTriggerProfile);

View File

@ -21,6 +21,7 @@ public class ActivityManageTriggerSubSystemState extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_subsystemstate);
rbSubSystemStateWifi = (RadioButton)findViewById(R.id.rbSubSystemStateWifi);

View File

@ -26,6 +26,7 @@ public class ActivityManageTriggerTethering extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_tethering);
rbTetheringOn = (RadioButton) findViewById(R.id.rbTetheringOn);

View File

@ -35,6 +35,7 @@ public class ActivityManageTriggerTimeFrame extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_timeframe);
startPicker = (TimePicker)findViewById(R.id.tpTimeFrameStart);

View File

@ -12,11 +12,15 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Spinner;
@ -43,12 +47,13 @@ public class ActivityManageTriggerWifi extends Activity
List<String> wifiList = new ArrayList<>();
ArrayAdapter<String> wifiSpinnerAdapter;
private final static int requestCodeLocationPermission = 124;
TextView tvWifiTriggerNameLocationNotice;
TextView tvWifiTriggerNameLocationNotice, tvWifiTriggerDisconnectionHint;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_wifi);
rbTriggerWifiConnected = (RadioButton) findViewById(R.id.rbTriggerWifiConnected);
@ -58,6 +63,9 @@ public class ActivityManageTriggerWifi extends Activity
bTriggerWifiSave = (Button) findViewById(R.id.bTriggerWifiSave);
bLoadWifiList = (Button) findViewById(R.id.bLoadWifiList);
tvWifiTriggerNameLocationNotice = (TextView)findViewById(R.id.tvWifiTriggerNameLocationNotice);
tvWifiTriggerDisconnectionHint = (TextView)findViewById(R.id.tvWifiTriggerDisconnectionHint);
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
wifiSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, wifiList);
spinnerWifiList.setAdapter(wifiSpinnerAdapter);
@ -100,6 +108,11 @@ public class ActivityManageTriggerWifi extends Activity
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
etTriggerWifiName.setText(wifiList.get(position));
if(etTriggerWifiName.getText().toString().length() > 0 && rbTriggerWifiDisconnected.isChecked())
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
@Override
@ -117,6 +130,41 @@ public class ActivityManageTriggerWifi extends Activity
loadWifis();
}
});
rbTriggerWifiDisconnected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
{
if(etTriggerWifiName.getText().toString().length() > 0 && b)
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
});
etTriggerWifiName.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
if(etTriggerWifiName.getText().toString().length() > 0 && rbTriggerWifiDisconnected.isChecked())
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
@Override
public void afterTextChanged(Editable editable)
{
}
});
}
public void loadWifis()

View File

@ -79,6 +79,7 @@ public class ActivityPermissions extends Activity
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.permissions_activity);
bCancelPermissions = (Button)findViewById(R.id.bCancelPermissions);
@ -455,7 +456,8 @@ public class ActivityPermissions extends Activity
{
case activityDetection:
addToArrayListUnique(permissionNameGoogleActivityDetection, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACTIVITY_RECOGNITION, requiredPermissions);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
addToArrayListUnique(Manifest.permission.ACTIVITY_RECOGNITION, requiredPermissions);
break;
case airplaneMode:
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
@ -704,7 +706,7 @@ public class ActivityPermissions extends Activity
break;
case startPhoneCall:
addToArrayListUnique(Manifest.permission.CALL_PHONE, requiredPermissions);
// addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
break;
case stopPhoneCall:
addToArrayListUnique(Manifest.permission.ANSWER_PHONE_CALLS, requiredPermissions);
@ -908,6 +910,8 @@ public class ActivityPermissions extends Activity
case Manifest.permission.SYSTEM_ALERT_WINDOW:
for(String ruleName : getRulesUsing(Action.Action_Enum.startOtherActivity))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ANSWER_PHONE_CALLS:
for(String ruleName : getRulesUsing(Action.Action_Enum.stopPhoneCall))

View File

@ -16,6 +16,7 @@ public class ActivitySettings extends PreferenceActivity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
addPreferencesFromResource(layout.activity_settings);
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
@ -24,4 +25,11 @@ public class ActivitySettings extends PreferenceActivity
chkPrefUpdateCheck.setEnabled(true);
}
}
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
}

View File

@ -30,6 +30,7 @@ public class ActivityVolumeTest extends Activity
instance = this;
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_volume_calibration);
tvCurrentVolume = (TextView)findViewById(R.id.tvCurrentVolume);

View File

@ -4,7 +4,6 @@ import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import java.util.ArrayList;
import java.util.Calendar;
public class AsyncTasks

View File

@ -12,8 +12,6 @@ import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.media.AudioManager;
import android.os.Binder;
import android.os.Build;
@ -22,7 +20,6 @@ import android.os.Environment;
import android.os.IBinder;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.widget.Toast;
@ -39,7 +36,6 @@ import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@SuppressLint("NewApi")
public class AutomationService extends Service implements OnInitListener
@ -522,7 +518,12 @@ public class AutomationService extends Service implements OnInitListener
builder.setContentTitle("Automation");
if(Settings.showIconWhenServiceIsRunning)
builder.setSmallIcon(R.drawable.ic_launcher);
{
if(BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher);
}
builder.setCategory(Notification.CATEGORY_SERVICE);
builder.setWhen(System.currentTimeMillis());
@ -530,7 +531,7 @@ public class AutomationService extends Service implements OnInitListener
Notification defaultNotification = builder.build();
defaultNotification.icon = R.drawable.ic_launcher;
defaultNotification.icon = R.drawable.crane;
defaultNotification.when = System.currentTimeMillis();
// defaultNotification.defaults |= Notification.DEFAULT_VIBRATE;
@ -577,7 +578,12 @@ public class AutomationService extends Service implements OnInitListener
builder.setOnlyAlertOnce(true);
if(Settings.showIconWhenServiceIsRunning)
builder.setSmallIcon(R.drawable.ic_launcher);
{
if (BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher);
}
// builder.setContentText(textToDisplay);
// builder.setSmallIcon(icon);

View File

@ -70,6 +70,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -77,6 +78,8 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.DigestInputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
@ -708,7 +711,7 @@ public class Miscellaneous extends Service
String notificationTitle = NotificationListener.getLastNotification().getTitle();
if (notificationTitle != null && notificationTitle.length() > 0)
source = source.replace("[notificationTitle]", notificationTitle);
source = source.replace("[notificationTitle]", escapeStringForUrl(notificationTitle));
else
{
source = source.replace("[notificationTitle]", "notificationTitle unknown");
@ -729,7 +732,7 @@ public class Miscellaneous extends Service
String notificationText = NotificationListener.getLastNotification().getText();
if (notificationText != null && notificationText.length() > 0)
source = source.replace("[notificationText]", notificationText);
source = source.replace("[notificationText]", escapeStringForUrl(notificationText));
else
{
source = source.replace("[notificationText]", "notificationText unknown");
@ -760,7 +763,7 @@ public class Miscellaneous extends Service
else
replacement = "unknownVariable";
source = source.substring(0, pos1) + replacement + source.substring(pos2);
source = source.substring(0, pos1) + escapeStringForUrl(replacement) + source.substring(pos2 +1);
}
// Miscellaneous.logEvent("i", "URL after replace", source);
@ -1164,7 +1167,12 @@ public class Miscellaneous extends Service
builder.setOnlyAlertOnce(true);
if(Settings.showIconWhenServiceIsRunning && notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE))
builder.setSmallIcon(R.drawable.ic_launcher);
{
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher);
}
else if(!notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE))
builder.setSmallIcon(R.drawable.info);
@ -2034,4 +2042,28 @@ public class Miscellaneous extends Service
//startActivity(refresh);
}
}
public static String escapeStringForUrl(String input)
{
String output;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
try
{
output = URLEncoder.encode(input, String.valueOf(StandardCharsets.UTF_8));
}
catch (UnsupportedEncodingException e)
{
Miscellaneous.logEvent("e", "URLEncoder", "Error encoding string for URL. Leaving as it is. Error details: " + Log.getStackTraceString(e), 3);
output = input;
}
}
else
{
output = Uri.encode(input);
}
return output;
}
}

View File

@ -391,11 +391,11 @@ public class ReceiverCoordinator
}
}
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.headsetPlugged))
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.headsetPlugged))
{
if(!HeadphoneJackListener.isHeadphoneJackListenerActive())
{
Miscellaneous.logEvent("i", "LocationProvider", "Starting HeadphoneJackListener because used in a new/changed rule.", 4);
Miscellaneous.logEvent("i", "HeadphoneJackListener", "Starting HeadphoneJackListener because used in a new/changed rule.", 4);
if(HeadphoneJackListener.getInstance().haveAllPermission())
HeadphoneJackListener.getInstance().startListener(AutomationService.getInstance());
}
@ -404,7 +404,7 @@ public class ReceiverCoordinator
{
if(HeadphoneJackListener.isHeadphoneJackListenerActive())
{
Miscellaneous.logEvent("i", "LocationProvider", "Shutting down HeadphoneJackListener because not used in any rule.", 4);
Miscellaneous.logEvent("i", "HeadphoneJackListener", "Shutting down HeadphoneJackListener because not used in any rule.", 4);
HeadphoneJackListener.getInstance().stopListener(AutomationService.getInstance());
}
}

View File

@ -803,13 +803,29 @@ public class Trigger
{
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Wifi name specified, checking that.", this.getParentRule().getName()), 4);
if(!WifiBroadcastReceiver.getLastWifiSsid().equals(this.getTriggerParameter2()) && !(Miscellaneous.isRegularExpression(this.getTriggerParameter2()) && WifiBroadcastReceiver.getLastWifiSsid().matches(this.getTriggerParameter2())))
if(WifiBroadcastReceiver.lastConnectedState) //when connected
{
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyNotTheCorrectSsid), getParentRule().getName(), this.getTriggerParameter2(), WifiBroadcastReceiver.getLastWifiSsid()),this.getParentRule().getName()), 3);
return false;
if (!WifiBroadcastReceiver.getLastWifiSsid().equals(this.getTriggerParameter2()) && !(Miscellaneous.isRegularExpression(this.getTriggerParameter2()) && WifiBroadcastReceiver.getLastWifiSsid().matches(this.getTriggerParameter2())))
{
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyNotTheCorrectSsid), getParentRule().getName(), this.getTriggerParameter2(), WifiBroadcastReceiver.getLastWifiSsid()), this.getParentRule().getName()), 3);
return false;
}
else
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Wifi name matches. Rule will apply.", this.getParentRule().getName()), 4);
}
else
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Wifi name matches. Rule will apply.", this.getParentRule().getName()), 4);
{
if (
!Settings.serviceStartDone
||
(!WifiBroadcastReceiver.getLastWifiSsidReal().equals(this.getTriggerParameter2()) && !(Miscellaneous.isRegularExpression(this.getTriggerParameter2()) && WifiBroadcastReceiver.getLastWifiSsidReal().matches(this.getTriggerParameter2()))))
{
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyNotTheCorrectSsid), getParentRule().getName(), this.getTriggerParameter2(), WifiBroadcastReceiver.getLastWifiSsidReal()), this.getParentRule().getName()), 3);
return false;
}
else
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Wifi name matches. Rule will apply.", this.getParentRule().getName()), 4);
}
}
else
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("No wifi name specified, any will do.", this.getParentRule().getName()), 4);

View File

@ -400,12 +400,12 @@ public class LocationProvider
Miscellaneous.logEvent("i", "LocationProvider", this.getParentService().getResources().getString(R.string.applyingSettingsAndRules), 3);
// *********** SETTING CHANGES ***********
if(Settings.useWifiForPositioning && !WifiBroadcastReceiver.isWifiListenerActive())
if(Settings.useWifiForPositioning && !WifiBroadcastReceiver.isWifiListenerActive() || Rule.isAnyRuleUsing(Trigger_Enum.wifiConnection))
{
Miscellaneous.logEvent("i", "LocationProvider", "Starting WifiReceiver because settings now allow to.", 4);
WifiBroadcastReceiver.startWifiReceiver(this);
}
else if(!Settings.useWifiForPositioning && WifiBroadcastReceiver.isWifiListenerActive())
else if(!Settings.useWifiForPositioning && WifiBroadcastReceiver.isWifiListenerActive() && !Rule.isAnyRuleUsing(Trigger_Enum.wifiConnection))
{
Miscellaneous.logEvent("i", "LocationProvider", "Shutting down WifiReceiver because settings forbid to.", 4);
WifiBroadcastReceiver.stopWifiReceiver();

View File

@ -25,12 +25,20 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
public static LocationProvider parentLocationProvider;
public static Boolean wasConnected = false;
protected static String lastWifiSsid = "";
protected static String lastWifiSsidReal = "";
public static boolean lastConnectedState = false;
protected static boolean mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = true;
protected static WifiBroadcastReceiver wifiBrInstance;
protected static IntentFilter wifiListenerIntentFilter;
protected static boolean wifiListenerActive=false;
final static String unknownSsidName = "<unknown ssid>";
public static String getLastWifiSsidReal()
{
return lastWifiSsidReal;
}
public static String getLastWifiSsid()
{
return lastWifiSsid;
@ -42,7 +50,11 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
newWifiSsid = newWifiSsid.substring(1, newWifiSsid.length()-1);
if(newWifiSsid.length() > 0)
{
if(newWifiSsid.equals(unknownSsidName))
WifiBroadcastReceiver.lastWifiSsidReal = lastWifiSsid;
WifiBroadcastReceiver.lastWifiSsid = newWifiSsid;
}
}
public static boolean isWifiListenerActive()

View File

@ -32,21 +32,21 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
if(!batteryReceiverActive)
{
BatteryReceiver.automationServiceRef = automationServiceRef;
if(batteryInfoReceiverInstance == null)
batteryInfoReceiverInstance = new BatteryReceiver();
if(batteryIntentFilter == null)
{
batteryIntentFilter = new IntentFilter();
batteryIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
batteryIntentFilter.addAction(Intent.ACTION_BATTERY_LOW);
// batteryIntentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
// batteryIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
// batteryIntentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
// batteryIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
}
batteryStatus = automationServiceRef.registerReceiver(batteryInfoReceiverInstance, batteryIntentFilter);
batteryReceiverActive = true;
}
}
@ -59,16 +59,16 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
automationServiceRef.unregisterReceiver(batteryInfoReceiverInstance);
batteryInfoReceiverInstance = null;
}
batteryReceiverActive = false;
}
}
public static boolean isBatteryReceiverActive()
{
return batteryReceiverActive;
}
public static boolean isUsbHostConnected()
{
return usbHostConnected;
@ -80,7 +80,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
}
private static int currentChargingState = 0; //0=unknown, 1=no, 2=yes
public static int getCurrentChargingState()
{
return currentChargingState;
@ -90,11 +90,11 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
public void onReceive(Context context, Intent intent)
{
Miscellaneous.logEvent("i", "BatteryReceiver", "Received event " + intent.getAction(), 5);
if (intent == null)
return;
if (context == null)
return;
return;
if(intent.getAction().equals(Intent.ACTION_BATTERY_LOW))
{
@ -105,12 +105,12 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
try
{
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
// int scale = -1;
// int voltage = -1;
// int temp = -1;
// scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
// temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
// voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
// int scale = -1;
// int voltage = -1;
// int temp = -1;
// scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
// temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
// voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
Log.i("Battery", "Level: " + String.valueOf(batteryLevel));
this.actionBatteryLevel(context);
@ -121,7 +121,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
switch(statusPlugged)
{
case BatteryManager.BATTERY_PLUGGED_AC:
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "BatteryReceiver", "Regular charging.", 5);
this.actionCharging(context);
break;
@ -138,6 +138,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
this.actionCharging(context);
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
this.actionDischarging(context);
break;
}
@ -148,7 +149,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
}
}
}
public static int isDeviceCharging(Context context)
{
switch(currentChargingState)
@ -163,10 +164,10 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
Miscellaneous.logEvent("i", "ChargingInfo", "Status of device charging was requested. Device is charging.", 3);
break;
}
return currentChargingState;
}
private void actionCharging(Context context)
{
if(currentChargingState != BatteryManager.BATTERY_STATUS_CHARGING) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
@ -183,7 +184,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
}
}
}
private void actionBatteryLevel(Context context)
{
Miscellaneous.logEvent("i", "BatteryReceiver", "Battery level has changed.", 3);
@ -195,7 +196,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
ruleCandidates.get(i).activate(automationServiceRef, false);
}
}
private void actionDischarging(Context context)
{
if(currentChargingState != BatteryManager.BATTERY_STATUS_UNKNOWN) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
@ -210,17 +211,17 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
if(ruleCandidates.get(i).getsGreenLight(context))
ruleCandidates.get(i).activate(automationServiceRef, false);
}
this.actionUsbDisconnected(context);
}
}
private void actionUsbConnected(Context context)
{
// Event usbConnected
// Miscellaneous.logEvent("i", "BatteryReceiver", "BATTERY_PLUGGED_USB");
if(!usbHostConnected)
{
usbHostConnected = true;
@ -234,15 +235,15 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
if(oneRule.getsGreenLight(context))
oneRule.activate(automationServiceRef, false);
}
this.actionCharging(context);
}
}
private void actionUsbDisconnected(Context context)
{
// Event usbDisConnected
if(usbHostConnected)
{
usbHostConnected = false;

View File

@ -94,20 +94,21 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
@Override
public void onReceive(Context context, Intent intent)
{
// Miscellaneous.logEvent("i", "BluetoothReceiver", "Bluetooth event.", 4);
String action = intent.getAction();
Miscellaneous.logEvent("i", "BluetoothReceiver", "Bluetooth event: " + action, 5);
BluetoothDevice bluetoothDevice = null;
if(action.equals(BluetoothDevice.ACTION_ACL_CONNECTED) | action.equals("android.bluetooth.device.action.ACL_CONNECTED"))
{
if(action.equals(BluetoothDevice.ACTION_ACL_CONNECTED) || action.equals("android.bluetooth.device.action.ACL_CONNECTED"))
{
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
lastAffectedDevice = bluetoothDevice;
lastAction = action;
connectedDevices.add(bluetoothDevice);
Miscellaneous.logEvent("i", "BluetoothReceiver", String.format(context.getResources().getString(R.string.bluetoothConnectionTo), bluetoothDevice.getName()), 3);
}
else if(action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED) | action.equals(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED) | action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECTED") | action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECT_REQUESTED"))
else if(action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED) || action.equals(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED) || action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECTED") || action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECT_REQUESTED"))
{
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
lastAffectedDevice = bluetoothDevice;
@ -115,7 +116,7 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
connectedDevices.remove(bluetoothDevice);
Miscellaneous.logEvent("i", "BluetoothReceiver", String.format(context.getResources().getString(R.string.bluetoothDisconnectFrom), bluetoothDevice.getName()), 3);
}
else if(action.equals(BluetoothDevice.ACTION_FOUND) | action.equals("android.bluetooth.device.ACTION_FOUND"))
else if(action.equals(BluetoothDevice.ACTION_FOUND) || action.equals("android.bluetooth.device.ACTION_FOUND"))
{
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
lastAffectedDevice = bluetoothDevice;

View File

@ -20,7 +20,7 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
private static boolean headsetConnected = false;
private static int headphoneType = -1;
protected static boolean headphoneJackListenerActive=false;
protected static boolean headphoneJackListenerActive = false;
protected static IntentFilter headphoneJackListenerIntentFilter = null;
protected static HeadphoneJackListener instance;
@ -108,7 +108,7 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
}
catch(Exception ex)
{
Miscellaneous.logEvent("e", "ActivityDetectionReceiver", "Error starting HeadsetJackListener: " + Log.getStackTraceString(ex), 3);
Miscellaneous.logEvent("e", "HeadsetJackListener", "Error starting HeadsetJackListener: " + Log.getStackTraceString(ex), 3);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -113,6 +113,7 @@
android:text="@string/startAppStartType" />
<RadioGroup
android:id="@+id/rgAppStartupType"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@ -135,6 +136,12 @@
android:layout_height="wrap_content"
android:text="@string/startAppByStartService" />
<RadioButton
android:id="@+id/rbStartAppByForegroundService"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/startAppByStartForegroundService" />
</RadioGroup>
</TableRow>
@ -187,6 +194,25 @@
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/className" />
<EditText
android:id="@+id/etClassName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">

View File

@ -103,6 +103,14 @@
</TableLayout>
<TextView
android:id="@+id/tvWifiTriggerDisconnectionHint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/default_margin"
android:textColor="@color/red"
android:text="@string/wifiTriggerDisconnectionHint" />
<Button
android:id="@+id/bTriggerWifiSave"
android:layout_marginTop="@dimen/default_margin"

View File

@ -798,4 +798,8 @@
<string name="variablesOnlyForTypes">Variablen sind nur für die Parametertypen String und URI verfügbar</string>
<string name="intentParametersHint">Wenn Sie einen Parameter angeben möchten, müssen Sie auch auf \"Intent-Paar hinzufügen\" klicken. Andernfalls werden Ihre Änderungen nicht gespeichert.</string>
<string name="languagePolish">Polnisch</string>
<string name="languageChineseChina">Chinesisch (China)</string>
<string name="wifiTriggerDisconnectionHint">Dieser Auslöser ist gültig, wenn Sie gerade die Verbindung zu dem oben angegebenen WLAN getrennt haben ODER während der Dienst noch gestartet wird und wenn Sie mit keinem WLAN verbunden sind. Wenn Sie möchten, dass der Auslöser nur ausgelöst wird, wenn Sie die Verbindung zu einem bestimmten WLAN explizit trennen, fügen Sie einen weiteren Auslöser hinzu: \"Der Dienst wird nicht gestartet\".</string>
<string name="className">Klassenname</string>
<string name="startAppByStartForegroundService">per startForegroundService()</string>
</resources>

View File

@ -797,4 +797,8 @@
<string name="variablesOnlyForTypes">Las variables solo están disponibles para los tipos de parámetro String y URI</string>
<string name="intentParametersHint">Si desea especificar un parámetro, también debe hacer clic en \"Agregar par de intención\". De lo contrario, los cambios no se guardarán.</string>
<string name="languagePolish">Polaco</string>
<string name="languageChineseChina">Chino (China)</string>
<string name="wifiTriggerDisconnectionHint">Este activador será válido si acabas de desconectarte del wifi especificado anteriormente O mientras el servicio aún se está iniciando y si no estás conectado a ningún wifi. Si desea que el activador se active solo cuando se desconecte explícitamente de una determinada red WiFi, agregue otro activador \"el servicio no se está iniciando\".</string>
<string name="className">Nombre de la clase</string>
<string name="startAppByStartForegroundService">a través de startForegroundService((</string>
</resources>

View File

@ -797,4 +797,8 @@
<string name="variablesOnlyForTypes">Les variables ne sont disponibles que pour les types de paramètres String et URI</string>
<string name="intentParametersHint">Si vous souhaitez spécifier un paramètre, vous devez également cliquer sur « Ajouter une paire d\'intentions ». Sinon, vos modifications ne seront pas enregistrées.</string>
<string name="languagePolish">Polonais</string>
<string name="languageChineseChina">Chinois (Chine)</string>
<string name="wifiTriggerDisconnectionHint">Ce déclencheur sera valide si vous venez de vous déconnecter du wifi spécifié ci-dessus OU alors que le service est encore en cours de démarrage et si vous n\'êtes connecté à aucun wifi. Si vous souhaitez que le déclencheur ne se déclenche que lorsque vous vous déconnectez explicitement d\'un certain wifi, ajoutez un autre déclencheur « le service ne démarre pas ».</string>
<string name="className">Nom de la classe</string>
<string name="startAppByStartForegroundService">par startForegroundService()</string>
</resources>

View File

@ -798,4 +798,8 @@
<string name="variablesOnlyForTypes">Le variabili sono disponibili solo per i tipi di parametro String e URI</string>
<string name="intentParametersHint">Se si desidera specificare un parametro è necessario fare clic anche su \"Aggiungi coppia intento\". In caso contrario, le modifiche non verranno salvate.</string>
<string name="languagePolish">Polacco</string>
<string name="languageChineseChina">Cinese (Cina)</string>
<string name="wifiTriggerDisconnectionHint">Questo trigger sarà valido se ti sei appena disconnesso dal Wi-Fi specificato sopra OPPURE mentre il servizio è ancora in fase di avvio e se non sei connesso a nessuna rete Wi-Fi. Se vuoi che il trigger si attivi solo quando ti stai disconnettendo esplicitamente da una determinata rete Wi-Fi, aggiungi un altro trigger \"il servizio non si avvia\".</string>
<string name="className">Nome della classe</string>
<string name="startAppByStartForegroundService">di startForegroundService()</string>
</resources>

View File

@ -796,5 +796,9 @@
<string name="variablesOnlyForTypes">Variabelen zijn alleen beschikbaar voor parametertypen Tekenreeks en URI</string>
<string name="intentParametersHint">Als u een parameter wilt opgeven, moet u ook op \"Intentiepaar toevoegen\" klikken. Anders worden uw wijzigingen niet opgeslagen.</string>
<string name="languagePolish">Pools</string>
<string name="languageChineseChina">Chinees (China)</string>
<string name="wifiTriggerDisconnectionHint">Deze trigger is geldig als je net de verbinding met de hierboven gespecificeerde wifi hebt verbroken OF terwijl de service nog aan het starten is en als je niet verbonden bent met wifi. Als je wilt dat de trigger alleen wordt geactiveerd wanneer je expliciet de verbinding met een bepaalde wifi verbreekt, voeg dan nog een trigger toe \"service start niet\".</string>
<string name="className">Naam van de klasse</string>
<string name="startAppByStartForegroundService">door startForegroundService()</string>
</resources>

View File

@ -895,4 +895,8 @@
<string name="languageRussian">Rosyjski</string>
<string name="languageFrench">Francuski</string>
<string name="languagePolish">Polski</string>
<string name="languageChineseChina">Chiński (Chiny)</string>
<string name="wifiTriggerDisconnectionHint">Ten wyzwalacz będzie prawidłowy, jeśli właśnie rozłączyłeś się z Wi-Fi określonym powyżej LUB gdy usługa jest nadal uruchomiona i jeśli nie masz połączenia z żadną siecią Wi-Fi. Jeśli chcesz, aby wyzwalacz uruchamiał się tylko wtedy, gdy jawnie rozłączasz się z określoną siecią Wi-Fi, dodaj kolejny wyzwalacz \"usługa nie uruchamia się\".</string>
<string name="className">nazwa klasy</string>
<string name="startAppByStartForegroundService">przez startForegroundService()</string>
</resources>

View File

@ -855,4 +855,8 @@
<string name="variablesOnlyForTypes">Переменные доступны только для типов параметров: String и URI</string>
<string name="intentParametersHint">Если вы хотите указать параметр, вам также нужно нажать «Добавить пару намерений». В противном случае ваши изменения не будут сохранены.</string>
<string name="languagePolish">Польский</string>
<string name="languageChineseChina">Китайский (Китай)</string>
<string name="wifiTriggerDisconnectionHint">Этот триггер будет действителен, если вы только что отключились от Wi-Fi, указанного выше, ИЛИ во время запуска службы и если вы не подключены ни к одному Wi-Fi. Если вы хотите, чтобы триггер срабатывал только тогда, когда вы явно отключаетесь от определенного Wi-Fi, добавьте еще один триггер «сервис не запускается».</string>
<string name="className">Имя класса</string>
<string name="startAppByStartForegroundService">no startForegroundService()</string>
</resources>

View File

@ -797,4 +797,7 @@
<string name="languagePolish">波兰语</string>
<string name="languageChineseChina">中文(中国)</string>
<string name="intentParametersHint">若要指定一个参数,还必须点击“添加 Intent 对”,否则更改不会保存。</string>
<string name="wifiTriggerDisconnectionHint">如果您刚刚断开了与上面指定的 wifi 的连接,或者在服务仍在启动并且您没有连接到任何 wifi则此触发器将有效。 如果您希望触发器仅在您明确断开与某个 wifi 的连接时触发,请添加另一个触发器\"服务未启动\"。</string>
<string name="className">类名</string>
<string name="startAppByStartForegroundService">来自 startForegroundService()</string>
</resources>

View File

@ -45,7 +45,7 @@
<item name="6">ru</item>
<item name="7">fr</item>
<item name="8">pl</item>
<item name="9">zh_rCN</item>
<item name="9">zh_CN</item>
</string-array>
<string-array name="tabsPlacementOptions">

View File

@ -422,7 +422,7 @@
<string name="noDataChangedReadingAnyway">It appears no data change has been saved. However there may have been changes in memory that need to be rolled back. Rereading file.</string>
<string name="bluetoothConnection">Bluetooth connection</string>
<string name="bluetoothConnectionTo">Bluetooth connection to %1$s</string>
<string name="bluetoothDisconnectFrom">Bluetooth connection to %1$s torn</string>
<string name="bluetoothDisconnectFrom">Bluetooth connection from %1$s torn</string>
<string name="bluetoothDeviceInRange">Bluetooth device %1$s in range.</string>
<string name="bluetoothDeviceOutOfRange">Bluetooth device %1$s out of range.</string>
<string name="anyDevice">any device</string>
@ -882,8 +882,11 @@
<string name="wifiMonitoringAlsoRequiresThis">This permission is also required if the trigger is using the current wifi connection.</string>
<string name="copyTextToClipboard">Copy text to clipboard</string>
<string name="textToCopy">Text to copy</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Draw over other apps</string>
<string name="overlayPermissionHint">After clicking OK you\'ll be sent to a system dialog. Please select Automation there and allow "draw over other apps".</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Display over other apps</string>
<string name="overlayPermissionHint">After clicking OK you\'ll be sent to a system dialog. Please select Automation there and allow "Display over other apps".</string>
<string name="variablesOnlyForTypes">Variables are only available for parameter types String and URI</string>
<string name="intentParametersHint">If you want to specify a parameter you also have to click \"Add intent pair\". Otherwise your changes will not be saved.</string>
<string name="wifiTriggerDisconnectionHint">This trigger will be valid if you just disconnected from the wifi specified above OR while the service is still starting and if you\'re not connected to any wifi. If you want the trigger to fire only when you\'re explicitly disconnecting from a certain wifi, add another trigger \"service is not starting\".</string>
<string name="className">Class full name</string>
<string name="startAppByStartForegroundService">by startForegroundService()</string>
</resources>

View File

@ -0,0 +1,4 @@
* Behoben: [Variablenname] wurde am Ende fälschlicherweise durch ein ] ersetzt
* Behoben: Benutzerdefinierte Sprache einstellen
* Behoben: Sonderzeichen beim Ausführen von Telefonanrufen wurden nicht kodiert
* Hinzugefügt: Chinesische Übersetzung (vereinfacht)

View File

@ -0,0 +1,2 @@
* Geändert: Symbol in Play store Version
* Geändert: targetSdk mußte in Google Play Version auf 32 erhöht werden. Falls das Fehler verursacht, denken Sie darüber nach zur F-Droid oder APK version zu wechseln.

View File

@ -0,0 +1,6 @@
* Behoben: Overlay-Berechtigung für Start-Telefonanruf-Aktion hinzugefügt
* Behoben: Der Auslöser "Akku wird geladen" wurde nur einmal ausgelöst und nicht nach dem Trennen und Anschließen des Ladegeräts
* Behoben: WLAN-Auslöser wurde beim Trennen der Verbindung nicht zuverlässig ausgelöst
* Behoben: Auf Api-Level <=28 wurde eine Berechtigung für ActivityDetection angefordert, die nicht erteilt werden konnte
* Behoben: Die Aktion "Andere Anwendung starten" startete einen Dienst nicht immer korrekt
* Geändert: targetSdk mußte in Google Play Version auf 33 erhöht werden. Falls das Fehler verursacht, denken Sie darüber nach zur F-Droid oder APK version zu wechseln.

View File

@ -1 +1,4 @@
* Fixed: [variable-name] was incorrectly replaced with an ] at the end
* Fixed: Set custom language
* Fixed: Special characters in making phone call action were not encoded
* Added: Chinese translation (simplified)

View File

@ -0,0 +1,2 @@
* Change: Icon changed in Play store version
* Change: Was forced to raise targetSdk to 32 for Google Play version. If that should break something, consider switching to the F-Droid or APK version.

View File

@ -0,0 +1,6 @@
* Fixed: Added overlay permission for start-phone-call action
* Fixed: Trigger "battery is charging" would only fire once and not after disconnecting and connecting charger
* Fixed: Wifi trigger would not reliably fire upon disconnection
* Fixed: On Api level <=28 a permission was requested for ActivityDetection that could not be granted
* Fixed: Start other application action did not always start a service correctly
* Change: Was forced to raise targetSdk to 33 for Google Play version. If that should break something, consider switching to the F-Droid or APK version.

View File

@ -0,0 +1,4 @@
* Corregido: [variable-name] fue reemplazado incorrectamente por un ] al final
* Corregido: Establecer idioma personalizado
* Corregido: Los caracteres especiales al realizar la acción de llamada telefónica no estaban codificados
* Añadido: traducción al chino (simplificada)

View File

@ -0,0 +1,2 @@
* Cambio: Icono cambiado en la versión de Play Store
* Cambio: Se ha forzado a subir targetSdk a 32 para la versión de Google Play. Si eso rompe algo, considere cambiar a la versión F-Droid o APK.

View File

@ -0,0 +1,6 @@
* Corregido: Se agregó permiso de superposición para la acción de inicio de llamada telefónica
* Corregido: El disparador "la batería se está cargando" solo se disparaba una vez y no después de desconectar y conectar el cargador
* Corregido: el disparador de Wifi no se disparaba de forma fiable tras la desconexión
* Corregido: En el nivel de API <=28 se solicitaba un permiso para ActivityDetection que no se podía conceder
* Corregido: Iniciar otra acción de aplicación no siempre iniciaba un servicio correctamente
* Cambio: Se ha forzado a subir targetSdk a 33 para la versión de Google Play. Si eso rompe algo, considere cambiar a la versión F-Droid o APK.

View File

@ -0,0 +1,4 @@
* Correction : [nom_variable] a été remplacé à tort par un ] à la fin
* Corrigé: Définir la langue personnalisée
* Correction : les caractères spéciaux dans l'action d'appel téléphonique n'étaient pas codés
* Ajouté: Traduction chinoise (simplifiée)

View File

@ -0,0 +1,2 @@
* Changement : Icône modifiée dans la version Play Store
* Changement : Été forcé d'augmenter targetSdk à 32 pour la version Google Play. Si cela devait casser quelque chose, envisagez de passer à la version F-Droid ou APK.

View File

@ -0,0 +1,6 @@
* Corrigé : Ajout d'une autorisation de superposition pour l'action de démarrage d'un appel téléphonique
* Résolu : La gâchette « la batterie est en charge » ne se déclenchait qu'une seule fois et non après avoir débranché et connecté le chargeur
* Résolu : Le déclencheur Wifi ne se déclenchait pas de manière fiable lors de la déconnexion
* Résolu : Au niveau d'API <=28, une autorisation était demandée pour ActivityDetection qui ne pouvait pas être accordée
* Résolu : L'action Démarrer une autre application ne démarrait pas toujours correctement un service
* Changement : Été forcé d'augmenter targetSdk à 33 pour la version Google Play. Si cela devait casser quelque chose, envisagez de passer à la version F-Droid ou APK.

View File

@ -0,0 +1,4 @@
* Risolto: [nome-variabile] è stato erroneamente sostituito con un ] alla fine
* Risolto: imposta la lingua personalizzata
* Risolto: i caratteri speciali nell'effettuare un'azione di chiamata telefonica non sono stati codificati
* Aggiunto: traduzione cinese (semplificata)

View File

@ -0,0 +1,2 @@
* Modifica: l'icona è cambiata nella versione del Play Store
* Modifica: è stato forzato aumentare targetSdk a 32 per la versione di Google Play. Se questo dovesse rompere qualcosa, prendi in considerazione l'idea di passare alla versione F-Droid o APK.

View File

@ -0,0 +1,6 @@
* Risolto: aggiunta l'autorizzazione di sovrapposizione per l'azione di avvio della chiamata telefonica
* Risolto: il trigger "la batteria è in carica" si attivava solo una volta e non dopo aver scollegato e collegato il caricabatterie
* Risolto: il trigger Wi-Fi non si attivava in modo affidabile alla disconnessione
* Risolto: al livello Api <=28 è stata richiesta un'autorizzazione per ActivityDetection che non poteva essere concessa
* Risolto: l'avvio di un'altra azione dell'applicazione non sempre avviava correttamente un servizio
* Modifica: è stato forzato aumentare targetSdk a 33 per la versione di Google Play. Se questo dovesse rompere qualcosa, prendi in considerazione l'idea di passare alla versione F-Droid o APK.

View File

@ -0,0 +1,4 @@
* Opgelost: [variabele-naam] is ten onrechte vervangen door een ] aan het einde
* Opgelost: Stel aangepaste taal in
* Opgelost: Speciale tekens bij het maken van telefoongesprek actie waren niet gecodeerd
* Toegevoegd: Chinese vertaling (vereenvoudigd)

View File

@ -0,0 +1,2 @@
* Wijziging: pictogram gewijzigd in Play Store-versie
* Wijziging: Werd gedwongen om targetSdk te verhogen naar 32 voor de Google Play-versie. Als dat iets kapot zou maken, overweeg dan om over te schakelen naar de F-Droid- of APK-versie.

View File

@ -0,0 +1,6 @@
* Opgelost: overlay-toestemming toegevoegd voor start-telefoongesprek-actie
* Opgelost: trigger "batterij wordt opgeladen" ging maar één keer af en niet na het loskoppelen en aansluiten van de oplader
* Opgelost: wifi-trigger ging niet betrouwbaar af bij het verbreken van de verbinding
* Opgelost: op API-niveau <=28 werd een toestemming gevraagd voor ActivityDetection die niet kon worden verleend
* Opgelost: andere applicatieactie starten startte een service niet altijd correct
* Wijziging: Werd gedwongen om targetSdk te verhogen naar 33 voor de Google Play-versie. Als dat iets kapot zou maken, overweeg dan om over te schakelen naar de F-Droid- of APK-versie.

View File

@ -0,0 +1,4 @@
* Naprawiono: [zmienna-nazwa] została niepoprawnie zastąpiona ] na końcu
* Naprawiono: Ustaw niestandardowy język
* Naprawiono: Znaki specjalne w wykonywaniu czynności połączenia telefonicznego nie były kodowane
* Dodano: Chińskie tłumaczenie (uproszczone)

View File

@ -0,0 +1,2 @@
* Zmiana: Ikona zmieniona w wersji sklepu Play
* Zmiana: Został zmuszony do podniesienia targetSdk do 32 dla wersji Google Play. Jeśli to powinno coś zepsuć, rozważ przejście na wersję F-Droid lub APK.

View File

@ -0,0 +1,6 @@
* Naprawiono: Dodano uprawnienie nakładki do akcji start-phone-call
* Naprawiono: Wyzwalacz "bateria się ładuje" uruchamiał się tylko raz, a nie po odłączeniu i podłączeniu ładowarki
* Naprawiono: Wyzwalacz Wi-Fi nie uruchamiał się niezawodnie po rozłączeniu
* Naprawiono: Na poziomie interfejsu API <=28 zażądano uprawnienia do wykrywania aktywności, którego nie można było udzielić
* Naprawiono: Akcja Uruchom inną aplikację nie zawsze poprawnie uruchamiała usługę
* Zmiana: Został zmuszony do podniesienia targetSdk do 33 dla wersji Google Play. Jeśli to powinno coś zepsuć, rozważ przejście na wersję F-Droid lub APK.

View File

@ -0,0 +1,4 @@
* Исправлено: [имя-переменной] было неправильно заменено на ] в конце
* Исправлено: Установить пользовательский язык
* Исправлено: Специальные символы при совершении действия телефонного звонка не кодировались
* Добавлено: Китайский перевод (упрощенный)

View File

@ -0,0 +1,2 @@
* Изменение: Иконка изменена в версии Play Store
* Изменение: Было вынуждено поднять targetSdk до 32 для версии для Google Play. Если это что-то сломает, подумайте о переходе на версию F-Droid или APK.

Some files were not shown because too many files have changed in this diff Show More