Compare commits

..

No commits in common. "dce68d79bd5ecb13515ef30747ffaeb2ba5ec1d6" and "a845ea7c63b896b6658afaf52172b084b4a93a34" have entirely different histories.

31 changed files with 247 additions and 498 deletions

View File

@ -11,8 +11,8 @@ android {
compileSdkVersion 29
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
versionCode 107
versionName "1.6.36"
versionCode 106
versionName "1.6.35"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -60,18 +60,17 @@ android {
}
dependencies {
googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0'
googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:19.2.0'
googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:17.1.0'
apkFlavorImplementation 'com.google.firebase:firebase-appindexing:19.2.0'
apkFlavorImplementation 'com.google.android.gms:play-services-location:17.1.0'
apkFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
apkFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0'
implementation 'com.linkedin.dexmaker:dexmaker:2.25.0'
implementation 'org.apache.commons:commons-lang3:3.0'
//implementation "androidx.security:security-crypto:1.0.0"
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'

View File

@ -146,7 +146,6 @@
<activity android:name=".ActivityManageTriggerPhoneCall" />
<activity android:name=".ActivityManageActionBrightnessSetting" />
<activity android:name=".ActivityHelp" />
<activity android:name=".ActivityManageActionVibrate" />
<activity
android:name=".ActivityMainTabLayout"
android:launchMode="singleTask">
@ -186,6 +185,7 @@
<activity android:name=".ActivityManageActionStartActivity" />
<activity android:name=".ActivityManageTriggerNfc" />
<activity android:name=".ActivityManageActionSpeakText" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerBluetooth" />
<activity android:name=".ActivityMainProfiles" />
<activity android:name=".ActivityManageProfile" />
@ -204,6 +204,8 @@
</service>
<activity android:name=".ActivityPermissions" />
<!-- https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p-->
<uses-library android:name="org.apache.http.legacy" android:required="false"/>

View File

@ -143,7 +143,6 @@
<activity android:name=".ActivityManageTriggerPhoneCall" />
<activity android:name=".ActivityManageActionBrightnessSetting" />
<activity android:name=".ActivityHelp" />
<activity android:name=".ActivityManageActionVibrate" />
<activity
android:name=".ActivityMainTabLayout"
android:launchMode="singleTask">

View File

@ -137,7 +137,6 @@
<activity android:name=".ActivityManageTriggerPhoneCall" />
<activity android:name=".ActivityManageActionBrightnessSetting" />
<activity android:name=".ActivityHelp" />
<activity android:name=".ActivityManageActionVibrate" />
<activity
android:name=".ActivityMainTabLayout"
android:launchMode="singleTask">

View File

@ -15,7 +15,6 @@ public class Action
{
public static final String actionParameter2Split = "ap2split";
public static final String intentPairSeperator = "intPairSplit";
public static final String vibrateSeparator = ",";
public enum Action_Enum {
setWifi,
@ -39,7 +38,6 @@ public class Action
playMusic,
setScreenBrightness,
playSound,
vibrate,
sendTextMessage;
public String getFullName(Context context)
@ -86,8 +84,6 @@ public class Action
return context.getResources().getString(R.string.waitBeforeNextAction);
case wakeupDevice:
return context.getResources().getString(R.string.wakeupDevice);
case vibrate:
return context.getResources().getString(R.string.vibrate);
case setAirplaneMode:
return context.getResources().getString(R.string.airplaneMode);
case setDataConnection:
@ -409,9 +405,6 @@ public class Action
case setScreenBrightness:
Actions.setScreenBrightness(getParameter1(), Integer.parseInt(getParameter2()));
break;
case vibrate:
Actions.vibrate(getParameter1(), getParameter2());
break;
case playSound:
Actions.playSound(getParameter1(), getParameter2());
break;

View File

@ -16,8 +16,6 @@ import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.MediaStore;
import android.telephony.SmsManager;
import android.telephony.SubscriptionManager;
@ -546,37 +544,6 @@ public class Actions
Miscellaneous.logEvent("i", "Play sound file", "Not playing sound file because phone is on some kind of mute state.", 2);
}
public static void vibrate(boolean parameter1, String parameter2)
{
String vibrateDurations[] = parameter2.split(Action.vibrateSeparator);
int counter = 1;
for(String vibrate : vibrateDurations)
{
if(counter % 2 != 0)
{
Vibrator vibrator = (Vibrator) Miscellaneous.getAnyContext().getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
vibrator.vibrate(VibrationEffect.createOneShot(Long.parseLong(vibrate), VibrationEffect.DEFAULT_AMPLITUDE));
else
vibrator.vibrate(Long.parseLong(vibrate));
}
else
{
try
{
Thread.sleep(Long.parseLong(vibrate));
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "VibrateSleep", Log.getStackTraceString(e), 5);
}
}
counter++;
}
}
public void useDownloadedWebpage(String result)
{
// Toast.makeText(context, "Result: " + result, Toast.LENGTH_LONG).show();

View File

@ -13,17 +13,12 @@ import com.jens.automation2.receivers.NfcReceiver;
@SuppressLint("NewApi")
public class ActivityMainTabLayout extends TabActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Settings.readFromPersistentStorage(ActivityMainTabLayout.this);
if(Settings.tabsPlacement == 1)
setContentView(R.layout.main_tab_layout_tabs_at_bottom);
else
setContentView(R.layout.main_tab_layout_tabs_at_top);
setContentView(R.layout.main_tab_layout);
TabHost tabHost = getTabHost();

View File

@ -84,10 +84,20 @@ public class ActivityManageActionSendTextMessage extends Activity
etPhoneNumber.setText(parameters[0]);
etSendTextMessage.setText(parameters[1]);
}
// String url = getIntent().getStringExtra("urlToTrigger");
// if(url != null)
// existingUrl = url;
}
private void backToRuleManager()
{
// Intent returnIntent = new Intent();
// returnIntent.putExtra("urlToTrigger", existingUrl);
// setResult(RESULT_OK, returnIntent);
if(edit && resultingAction != null)
{
ActivityManageActionSendTextMessage.resultingAction.setParameter2(etPhoneNumber.getText().toString() + Actions.smsSeparator + etSendTextMessage.getText().toString());

View File

@ -1,85 +0,0 @@
package com.jens.automation2;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageActionVibrate extends Activity
{
TextView etVibratePattern;
Button bTestVibratePattern, bSaveVibratePattern;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_action_vibrate);
etVibratePattern = (EditText)findViewById(R.id.etVibratePattern);
bTestVibratePattern = (Button)findViewById(R.id.bTestVibratePattern);
bSaveVibratePattern = (Button)findViewById(R.id.bSaveVibratePattern);
bSaveVibratePattern.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if(checkInput())
{
Intent answer = new Intent();
answer.putExtra("vibratePattern", etVibratePattern.getText().toString());
setResult(RESULT_OK, answer);
finish();
}
}
});
bTestVibratePattern.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(checkInput())
{
if (ActivityPermissions.havePermission(Manifest.permission.VIBRATE, ActivityManageActionVibrate.this))
{
String pattern = etVibratePattern.getText().toString();
Actions.vibrate(false, pattern);
}
}
}
});
Intent input = getIntent();
if(input.hasExtra("vibratePattern"))
etVibratePattern.setText(input.getStringExtra("vibratePattern"));
}
boolean checkInput()
{
String vibratePattern = etVibratePattern.getText().toString();
String regex = "^[0-9,]+$";
if(StringUtils.isEmpty(vibratePattern) || !vibratePattern.matches(regex) || vibratePattern.substring(0, 1).equals(",") || vibratePattern.substring(vibratePattern.length()-1).equals(","))
{
Toast.makeText(ActivityManageActionVibrate.this, getResources().getString(R.string.pleaseEnterValidVibrationPattern), Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
}

View File

@ -103,9 +103,6 @@ public class ActivityManageRule extends Activity
final static int requestCodeTriggerPhoneCallEdit = 602;
final static int requestCodeTriggerWifiAdd = 723;
final static int requestCodeTriggerWifiEdit = 724;
final static int requestCodeActionSendTextMessageAdd = 5001;
final static int requestCodeActionVibrateAdd = 801;
final static int requestCodeActionVibrateEdit = 802;
public static ActivityManageRule getInstance()
{
@ -231,11 +228,27 @@ public class ActivityManageRule extends Activity
Trigger selectedTrigger = (Trigger)triggerListView.getItemAtPosition(arg2);
switch(selectedTrigger.getTriggerType())
{
// case batteryLevel:
// break;
// case charging:
// break;
// case noiseLevel:
// break;
// case pointOfInterest:
// break;
// case process_started_stopped:
// break;
// case speed:
// break;
case timeFrame:
ActivityManageTriggerTimeFrame.editedTimeFrameTrigger = selectedTrigger;
Intent timeFrameEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerTimeFrame.class);
startActivityForResult(timeFrameEditor, requestCodeTriggerTimeframeEdit);
break;
// case usb_host_connection:
// break;
// case wifiConnection:
// break;
case bluetoothConnection:
ActivityManageTriggerBluetooth.editedBluetoothTrigger = selectedTrigger;
Intent bluetoothEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerBluetooth.class);
@ -293,6 +306,14 @@ public class ActivityManageRule extends Activity
Action a = (Action)actionListView.getItemAtPosition(arg2);
switch(a.getAction())
{
// case changeSoundProfile:
// break;
// case disableScreenRotation:
// break;
// case enableScreenRotation:
// break;
// case setAirplaneMode:
// break;
case startOtherActivity:
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionStartActivity.class);
ActivityManageActionStartActivity.resultingAction = a;
@ -319,15 +340,11 @@ public class ActivityManageRule extends Activity
break;
case setScreenBrightness:
Intent activityEditScreenBrightnessIntent = new Intent(ActivityManageRule.this, ActivityManageActionBrightnessSetting.class);
// ActivityEditTriggerUrl.resultingAction = a;
activityEditScreenBrightnessIntent.putExtra("autoBrightness", a.getParameter1());
activityEditScreenBrightnessIntent.putExtra("brightnessValue", Integer.parseInt(a.getParameter2()));
startActivityForResult(activityEditScreenBrightnessIntent, requestCodeActionScreenBrightnessEdit);
break;
case vibrate:
Intent activityEditVibrateIntent = new Intent(ActivityManageRule.this, ActivityManageActionVibrate.class);
activityEditVibrateIntent.putExtra("vibratePattern", a.getParameter2());
startActivityForResult(activityEditVibrateIntent, requestCodeActionVibrateEdit);
break;
case playSound:
Intent actionPlaySoundIntent = new Intent(context, ActivityManageActionPlaySound.class);
actionPlaySoundIntent.putExtra("edit", true);
@ -669,6 +686,13 @@ public class ActivityManageRule extends Activity
String[] choices = (String[]) choicesList.toArray(new String[choicesList.size()]);
getTriggerNoiseDialog(myContext, choices).show();
}
// else if(triggerType.equals(Trigger.Event_Enum.timeFrame))
// {
// newTrigger.setTriggerType(Trigger.Event_Enum.timeFrame);
// ActivityManageTimeFrame.editedTimeFrameTrigger = null;
// Intent timeFrameEditor = new Intent(myContext, ActivityManageTimeFrame.class);
// startActivityForResult(timeFrameEditor, 2000);
// }
else if(triggerType.equals(Trigger_Enum.wifiConnection))
{
newTrigger.setTriggerType(Trigger_Enum.wifiConnection);
@ -679,6 +703,7 @@ public class ActivityManageRule extends Activity
progressDialog = ProgressDialog.show(myContext, null, getResources().getString(R.string.gettingListOfInstalledApplications), true, false);
newTrigger.setTriggerType(Trigger_Enum.process_started_stopped);
new GenerateApplicationSelectionsDialogTask().execute(ActivityManageRule.this);
// getTriggerRunningProcessDialog1(myContext).show();
}
else if(triggerType.equals(Trigger_Enum.phoneCall))
{
@ -1273,25 +1298,6 @@ public class ActivityManageRule extends Activity
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionVibrateAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParameter2(data.getStringExtra("vibratePattern"));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionVibrateEdit)
{
if(resultCode == RESULT_OK)
{
if(data.hasExtra("vibratePattern"))
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra("vibratePattern"));
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionPlaySoundAdd)
{
if(resultCode == RESULT_OK)
@ -1369,8 +1375,6 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.brightness));
else if(types[i].toString().equals(Action_Enum.playSound.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.sound));
else if(types[i].toString().equals(Action_Enum.vibrate.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.vibrate));
else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString()))
{
// if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageSpecificRule.this, "android.permission.SEND_SMS") && !Miscellaneous.isGooglePlayInstalled(ActivityManageSpecificRule.this))
@ -1500,13 +1504,14 @@ public class ActivityManageRule extends Activity
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.sendTextMessage.toString()))
{
// if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageSpecificRule.this, "android.permission.SEND_SMS") && !Miscellaneous.isGooglePlayInstalled(ActivityManageSpecificRule.this))
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, "android.permission.SEND_SMS"))
{
//launch other activity to enter parameters;
newAction.setAction(Action_Enum.sendTextMessage);
ActivityManageActionSendTextMessage.resultingAction = null;
Intent editTriggerIntent = new Intent(context, ActivityManageActionSendTextMessage.class);
startActivityForResult(editTriggerIntent, requestCodeActionSendTextMessageAdd);
startActivityForResult(editTriggerIntent, 5001);
}
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.playMusic.toString()))
@ -1515,12 +1520,6 @@ public class ActivityManageRule extends Activity
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.vibrate.toString()))
{
newAction.setAction(Action_Enum.vibrate);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionVibrate.class);
startActivityForResult(intent, requestCodeActionVibrateAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setScreenBrightness.toString()))
{
newAction.setAction(Action_Enum.setScreenBrightness);
@ -1638,6 +1637,63 @@ public class ActivityManageRule extends Activity
return alertDialog;
}
/*private AlertDialog getActionStartActivityDialog1(final Context myContext)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(myContext.getResources().getString(R.string.selectApplication));
final String[] applicationArray = ActivityManageStartActivity.getApplicationNameListString(ActivityManageSpecificRule.this);
alertDialogBuilder.setItems(applicationArray, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
getActionStartActivityDialog2(myContext, applicationArray[which]).show();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
private AlertDialog getActionStartActivityDialog2(final Context myContext, String applicationName)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(myContext.getResources().getString(R.string.selectPackageOfApplication));
final String[] packageArray = ActivityManageStartActivity.getPackageListString(ActivityManageSpecificRule.this, applicationName);
alertDialogBuilder.setItems(packageArray, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
getActionStartActivityDialog3(ActivityManageSpecificRule.this, packageArray[which]).show();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
private AlertDialog getActionStartActivityDialog3(final Context myContext, final String packageName)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(myContext.getResources().getString(R.string.selectActivityToBeStarted));
final String activityArray[] = ActivityManageStartActivity.getActivityListForPackageName(packageName);
alertDialogBuilder.setItems(activityArray, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
ActivityInfo ai = ActivityManageStartActivity.getActivityInfoForPackageNameAndActivityName(packageName, activityArray[which]);
// Log.i("Selected", ai.packageName + " / " + ai.name);
newAction.setParameter2(ai.packageName + ";" + ai.name);
newAction.toString();
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}*/
private AlertDialog getActionWaitBeforeNextActionDialog(final Context myContext)
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

View File

@ -852,7 +852,9 @@ public class ActivityPermissions extends Activity
{
if (requestCode == requestCodeForPermissionsBackgroundLocation)
{
if (havePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION, ActivityPermissions.this))
NotificationManager mNotificationManager = (NotificationManager) ActivityPermissions.this.getSystemService(Context.NOTIFICATION_SERVICE);
if (mNotificationManager.isNotificationPolicyAccessGranted())
requestPermissions(cachedPermissionsToRequest, true);
}
}

View File

@ -211,7 +211,7 @@ public class AutomationService extends Service implements OnInitListener
ActivityMainScreen.updateMainScreen();
this.isRunning = true;
Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " VERSION_CODE: " + BuildConfig.VERSION_CODE + ", VERSION_NAME: " + BuildConfig.VERSION_NAME + ", flavor: " + BuildConfig.FLAVOR, 1);
Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " " + String.format(this.getResources().getString(R.string.version), BuildConfig.VERSION_NAME + "(Build " + BuildConfig.VERSION_CODE + ")"), 1);
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
// ********** Test area **********
// Miscellaneous.logEvent("i", "setNetworkType", "bin hier.", 3);

View File

@ -60,7 +60,6 @@ public class Settings implements SharedPreferences
public static int activityDetectionRequiredProbability;
public static boolean privacyLocationing;
public static int startScreen;
public static int tabsPlacement;
public static boolean executeRulesAndProfilesWithSingleClick;
public static boolean displayNewsOnMainScreen;
public static boolean automaticUpdateCheck;
@ -117,7 +116,6 @@ public class Settings implements SharedPreferences
protected static final int default_activityDetectionRequiredProbability = 75;
protected static final boolean default_privacyLocationing = false;
protected static final int default_startScreen = 0;
protected static final int default_tabsPlacement = 0;
protected static final boolean default_executeRulesAndProfilesWithSingleClick = false;
protected static final boolean default_displayNewsOnMainScreen = false;
protected static final boolean default_automaticUpdateCheck = false;
@ -255,7 +253,6 @@ public class Settings implements SharedPreferences
privacyLocationing = prefs.getBoolean("privacyLocationing", default_privacyLocationing);
startScreen = Integer.parseInt(prefs.getString("startScreen", String.valueOf(default_startScreen)));
tabsPlacement = Integer.parseInt(prefs.getString("tabsPlacement", String.valueOf(default_tabsPlacement)));
executeRulesAndProfilesWithSingleClick = prefs.getBoolean("executeRulesAndProfilesWithSingleClick", default_executeRulesAndProfilesWithSingleClick);
automaticUpdateCheck = prefs.getBoolean("automaticUpdateCheck", default_automaticUpdateCheck);
@ -443,9 +440,6 @@ public class Settings implements SharedPreferences
if(!prefs.contains("startScreen") | force)
editor.putString("startScreen", String.valueOf(default_startScreen));
if(!prefs.contains("tabsPlacement") | force)
editor.putString("tabsPlacement", String.valueOf(default_tabsPlacement));
if(!prefs.contains("executeRulesAndProfilesWithSingleClick") | force)
editor.putBoolean("executeRulesAndProfilesWithSingleClick", default_executeRulesAndProfilesWithSingleClick);
@ -530,7 +524,6 @@ public class Settings implements SharedPreferences
editor.putString("activityDetectionRequiredProbability", String.valueOf(activityDetectionRequiredProbability));
editor.putBoolean("privacyLocationing", privacyLocationing);
editor.putString("startScreen", String.valueOf(startScreen));
editor.putString("tabsPlacement", String.valueOf(tabsPlacement));
editor.putBoolean("executeRulesAndProfilesWithSingleClick", executeRulesAndProfilesWithSingleClick);
editor.putBoolean("automaticUpdateCheck", automaticUpdateCheck);
editor.putBoolean("displayNewsOnMainScreen", displayNewsOnMainScreen);

View File

@ -1212,14 +1212,6 @@ public class XmlFileInterface
{
newAction.setParameter2(tag);
}
/*
androidx.security.crypto.MasterKey.Builder
MasterKey mainKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
*/
}
}
else if(newAction.getAction().equals(Action_Enum.startOtherActivity)) // separator has been changed, convert in old files

View File

@ -144,33 +144,8 @@ public class LocationProvider
}
else
{
speedCalculation:
if (locationList.size() >= 2)
{
while (locationList.size() > 2)
{
// Remove all entries except for the last 2
Miscellaneous.logEvent("i", "Speed", "About to delete oldest position record until only 2 left. Currently have " + String.valueOf(locationList.size()) + " records.", 4);
locationList.remove(0);
}
/*
The two most recent locations in the list must have a usable accuracy.
*/
for(int i = 0; i < 2; i++)
{
if
(
(locationList.get(i).getProvider().equals(LocationManager.GPS_PROVIDER) && locationList.get(i).getAccuracy() > Settings.satisfactoryAccuracyGps)
||
(locationList.get(i).getProvider().equals(LocationManager.NETWORK_PROVIDER) && locationList.get(i).getAccuracy() > Settings.satisfactoryAccuracyNetwork)
)
{
Miscellaneous.logEvent("i", "Speed", "Not using 2 most recent locations for speed calculation because at least one does not have a satisfactory accuracy: " + locationList.get(i).toString(), 4);
break speedCalculation;
}
}
Miscellaneous.logEvent("i", "Speed", "Trying to calculate speed based on the last locations.", 4);
double currentSpeed;
@ -209,6 +184,14 @@ public class LocationProvider
}
else
Miscellaneous.logEvent("i", "Speed", "Last two locations are too far apart in terms of time. Cannot use them for speed calculation.", 4);
while (locationList.size() > 2)
{
// Remove all entries except for the last 2
Miscellaneous.logEvent("i", "Speed", "About to delete oldest position record until only 2 left. Currently have " + String.valueOf(locationList.size()) + " records.", 4);
locationList.remove(0);
}
}
else
{
@ -506,10 +489,18 @@ public class LocationProvider
{
// time is up, no cell location updates since x minutes, start accelerometer
String text = "Timer triggered. Based on the last location and speed we may be at a POI. Forcing location update in case CellLocationChangedReceiver didn\'t fire.";
// Miscellaneous.logEvent("i", "AccelerometerHandler", text, 5);
// CellLocationChangedReceiver.stopCellLocationChangedReceiver();
// startAccelerometerReceiver();
Location currentLocation = CellLocationChangedReceiver.getInstance().getLocation("coarse");
AutomationService.getInstance().getLocationProvider().setCurrentLocation(currentLocation, false);
}
/*else if(msg.what == 0)
{
String text = "Abort command received, deactivating SpeedReceiver";
Miscellaneous.logEvent("i", "SpeedHandler", text, 4);
stopAccelerometerReceiver();
}*/
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:textSize="25dp"
android:textStyle="bold"
android:layout_marginBottom="@dimen/default_margin"
android:text="@string/vibrate" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/VibrateExplanation" />
<EditText
android:id="@+id/etVibratePattern"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/default_margin"/>
<Button
android:id="@+id/bTestVibratePattern"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/default_margin"
android:text="@string/test" />
<Button
android:id="@+id/bSaveVibratePattern"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save" />
</LinearLayout>
</ScrollView>

View File

@ -4,15 +4,6 @@
android:layout_height="match_parent"
android:layout_margin="@dimen/default_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:textSize="25dp"
android:textStyle="bold"
android:layout_marginBottom="@dimen/default_margin"
android:text="@string/setScreenBrightness" />
<CheckBox
android:id="@+id/chkAutoBrightness"
android:layout_width="match_parent"

View File

@ -52,13 +52,6 @@
android:entries="@array/startScreenOptions"
android:entryValues="@array/startScreenOptionsValues" />
<ListPreference
android:key="tabsPlacement"
android:title="@string/tabsPlacement"
android:summary="@string/tabsPlacementSummary"
android:entries="@array/tabsPlacementOptions"
android:entryValues="@array/tabsPlacementOptionsValues" />
<CheckBoxPreference
android:key="executeRulesAndProfilesWithSingleClick"
android:title="@string/executeRulesAndProfilesWithSingleClickTitle" />

View File

@ -3,25 +3,17 @@
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_weight="0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="match_parent"/>
</LinearLayout>
</TabHost>

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TabWidget
android:id="@android:id/tabs"
android:layout_weight="0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</LinearLayout>
</TabHost>

View File

@ -586,12 +586,4 @@
<string name="locationFoundInaccurate">Es konnte nur eine ungenaue Position gefunden werden. Das funktioniert u.U. nicht zuverlässig. Der vorgeschlagene Mindestradius für Orte beträgt %1$d m.</string>
<string name="pleaseGiveBgLocation">Gehen Sie auf dem nächsten Bildschirm bitte auf Berechtigungen, dann Position. Wählen Sie dort Immer erlauben aus, um Automation zu ermöglichen, die Position im Hintergrund zu ermitteln.</string>
<string name="noLocationCouldBeFound">Leider konnte nach einem Limit von %1$s Sekunden keine Position gefunden werden.</string>
<string name="vibrate">Vibrieren</string>
<string name="test">Ausprobieren</string>
<string name="VibrateExplanation">Geben Sie eine Vibrationsdauer, gefolgt von einem Komma ein, dann eine Pausendauer. Sie können so viele Vibrationen eingeben, wie sie möchten. Trennen Sie sie wieder mit Kommata.\nZ.B. wird das Muster 100,500,500,1000,100 100ms vibrieren, 500ms warten, 500ms vibrieren, 1000ms warten, 100ms vibrieren.\nWenn Sie denken, daß eine Vibration verschluckt wird, verlängern Sie die Pause vor ihr.</string>
<string name="pleaseEnterValidVibrationPattern">Bitte geben Sie ein gültiges Vibrationsmuster ein.</string>
<string name="tabsPlacement">Position der Tableiste</string>
<string name="top">Oben</string>
<string name="bottom">Unten</string>
<string name="tabsPlacementSummary">Wol soll die Taskleiste angezeigt werden?</string>
</resources>

View File

@ -2,14 +2,14 @@
<resources>
<string name="ruleActivate">Estoy activando regla %1$s</string>
<string name="profileActivate">Estoy activando perfil %1$s</string>
<string name="ruleActivateToggle">Estoy activando regla %1$s en el modo de invertir</string>
<string name="ruleActivateToggle">Estoy activando regla %1$s en el modo del invertir</string>
<string name="addPoi">Crear sitio</string>
<string name="addRule">Crear regla</string>
<string name="poiList">Lista de sitios:</string>
<string name="ruleList">Lista de reglas:</string>
<string name="pleaseEnterValidName">Inserte un nombre válido, por favor.</string>
<string name="pleaseSpecifiyTrigger">Inserte al menos una condición, por favor.</string>
<string name="pleaseSpecifiyAction">Inserte al menos una acción, por favor.</string>
<string name="pleaseSpecifiyTrigger">Inserta al menos una condición, por favor.</string>
<string name="pleaseSpecifiyAction">Inserta al menos una acción, por favor.</string>
<string name="serviceWontStart">No hay reglas definidas. Servicio no enciende.</string>
<string name="serviceStarted">Automation servicio ha iniciado.</string>
<string name="version">Versión %1$s.</string>
@ -88,7 +88,7 @@
<string name="noPoisSpecified">Primero tiene que crear sitios.</string>
<string name="selectPoi">Seleccionar sitio</string>
<string name="selectTypeOfAction">Seleccione tipo de la acción</string>
<string name="connected">conectado</string>
<string name="connected">connectado</string>
<string name="stopped">terminado</string>
<string name="started">Comenzado</string>
<string name="disconnected">desconectado</string>
@ -131,15 +131,15 @@
<string name="closestPoi">sitio mas cerca</string>
<string name="poi">Posición</string>
<string name="pois">posiciónes</string>
<string name="serviceNotRunning">Servicio no está activo</string>
<string name="serviceNotRunning">Servicio not esta activo</string>
<string name="general">General</string>
<string name="startServiceAfterAppUpdate">Encender servicio después de un update si estuvo activado.</string>
<string name="startServiceAfterAppUpdateShort">Encender servicio después de un update</string>
<string name="startServiceAfterAppUpdate">Encender servicio después un update si estuve activado</string>
<string name="startServiceAfterAppUpdateShort">Encender servicio después un update</string>
<string name="cancel">Cancelar</string>
<string name="wifiName">Nombre de wifi</string>
<string name="wifiConnection">Conexión a un wifi</string>
<string name="exceeding">excediendo</string>
<string name="droppingBelow">estando menos que</string>
<string name="wifiConnection">Coneción a un wifi</string>
<string name="exceeding">exedendo</string>
<string name="droppingBelow">estendo menos que</string>
<string name="anyWifi">algún wifi</string>
<string name="selectApplication">Elija app</string>
<string name="selectPackageOfApplication">Elija el paquete de la app</string>
@ -150,31 +150,31 @@
<string name="stringNotAllowed">String %1$s not esta permitido.</string>
<string name="noFilesImported">No pudo importar archivos.</string>
<string name="noApplicableFilesFoundInDirectory">No pudo encontrar archivos.</string>
<string name="prefsImportError">Hubo un error durante la importación de la configuración.</string>
<string name="configurationImportedSuccessfully">La configuracion está importada con éxito.</string>
<string name="prefsImportError">Hubo un error en importar la configuracion.</string>
<string name="configurationImportedSuccessfully">Importe la configuracion con éxito.</string>
<string name="importConfiguration">Importar configuracion</string>
<string name="exportConfiguration">Exportar configuracion</string>
<string name="startAppSelectionType">Método de elegir aplicación</string>
<string name="startAppSelectionType">Método de elegir applicación</string>
<string name="addParameters">Añade parametrós</string>
<string name="fileDoesNotExist">Archivo no existe.</string>
<string name="selectSoundFile">Elegir archivo sonido</string>
<string name="alwaysPlay">reproducir siempre</string>
<string name="playSound">Reproducir sonido</string>
<string name="fileDoesNotExist">Archivo no exista.</string>
<string name="selectSoundFile">Elija archivo sonido</string>
<string name="alwaysPlay">siempre tocar</string>
<string name="playSound">Tocar sonido</string>
<string name="direction">dirección</string>
<string name="anyApp">cualquier app</string>
<string name="directionStringNotEquals">no es igual a</string>
<string name="directionStringStartsWith">comienza con</string>
<string name="directionStringStartsWith">comenza con</string>
<string name="directionStringEndsWith">termina con</string>
<string name="directionStringContains">incluye</string>
<string name="directionStringEquals">es igual a</string>
<string name="text">Texto</string>
<string name="title">Título</string>
<string name="notification">Notificación</string>
<string name="locationDisabled">Localización desactivada</string>
<string name="title">Titulo</string>
<string name="notification">Notificaión</string>
<string name="locationDisabled">Localización desactivado</string>
<string name="error">Error</string>
<string name="android.permission.ACCESS_BACKGROUND_LOCATION">Determinar su posición en el fondo.</string>
<string name="manageLocations">Crear o editar sitios</string>
<string name="startScreen">Ventana de inicio</string>
<string name="android.permission.ACCESS_BACKGROUND_LOCATION">Determinar su posición en el contexto</string>
<string name="manageLocations">Crear p editar sitios</string>
<string name="startScreen">Ventana incial</string>
<string name="positioningEngine">Metodo de localización</string>
<string name="deviceDoesNotHaveBluetooth">Este dispositivo no tiene Bluetooth. Puede continuar pero probablemente no va a funciónar.</string>
<string name="android.permission.READ_CALL_LOG">Leer protocolo de llamadas</string>
@ -196,27 +196,27 @@
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Modificar la conexión internet</string>
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Exeder configuración no molestar</string>
<string name="android.permission.WRITE_SECURE_SETTINGS">Escribir en el almacenamiento</string>
<string name="apply">aplicar</string>
<string name="publishedOn">publicado el</string>
<string name="apply">acplicar</string>
<string name="publishedOn">publicitado el</string>
<string name="postsNotification">%1$s crea notificación</string>
<string name="removedNotification">notificación de %1$s removido</string>
<string name="notificationAppears">Notificación aparece</string>
<string name="notificationDisappears">Notificación desaparece</string>
<string name="notificationDisappears">Notificación deaparece</string>
<string name="startAppByActivity">a través de activity</string>
<string name="startAppByAction">a través de action</string>
<string name="enterValidAction">Inserte una action válida</string>
<string name="enterPackageName">Inserte un package válido</string>
<string name="configurationExportedSuccessfully">Exportación completada con éxito</string>
<string name="noFileManageInstalled">Administrador de archivos no esta instalada</string>
<string name="cantFindSoundFile">No puedo buscar el archivo sonido %1$s, por eso no puedo reproducirlo.</string>
<string name="noFileManageInstalled">No mánager archivo esta instalada</string>
<string name="cantFindSoundFile">No puedo buscar el archivo sonido %1$s, por eso no puedo tocar lo.</string>
<string name="ruleActive">Regla activa</string>
<string name="triggerCharging">Bateria esta cargando</string>
<string name="triggerCharging">Batteria esta cargando</string>
<string name="triggerUsb_host_connection">USB conexión a un computador</string>
<string name="actionSetDisplayRotation">Girar monitor</string>
<string name="actionEnableScreenRotation">activar girar monitor</string>
<string name="actionDisableScreenRotation">desactivar girar monitor</string>
<string name="overview">Panoramica</string>
<string name="enterWifiName">Inserta el nombre del wifi. Deje vacio para aplicar a todos wifis.</string>
<string name="overview">Sinopsis</string>
<string name="enterWifiName">Inserta el nombre del wifi. Deje vacio para applicar a todos wifis.</string>
<string name="startOtherActivity">Iniciar otra app</string>
<string name="settings">Ajustes</string>
<string name="bluetoothConnection">Conexión Bluetooth</string>
@ -229,14 +229,14 @@
<string name="lockSoundChanges">Bloquear modificaciónes de sonido</string>
<string name="status">Estado</string>
<string name="android.permission.ACCESS_NETWORK_STATE">Determinar el estado de la red</string>
<string name="clickAndHoldForOptions">Cliquee y mantenga un elemento para opciónes.</string>
<string name="clickAndHoldForOptions">Clice ý ase un elemento para opciónes</string>
<string name="ruleLegend">Verde = activado, roja = desactivado, amarillo = no sufienctes permisos</string>
<string name="addProfile">Añadir perfil</string>
<string name="profile">Perfil</string>
<string name="invalidProfileName">Nombre invalido</string>
<string name="anotherProfileByThatName">Hay otro perfil con el mismo nombre.</string>
<string name="errorActivatingProfile">Error activando perfil:</string>
<string name="executeRulesAndProfilesWithSingleClickTitle">Activar reglas/perfiles con 1 clic.</string>
<string name="executeRulesAndProfilesWithSingleClickTitle">Activar reglas/perfiles con 1 clic</string>
<string name="name">Nombre</string>
<string name="useAuthentication">Usar verificación de la autenticidad</string>
<string name="radiusWithUnit">Radio [m]</string>
@ -246,8 +246,8 @@
<string name="incomingCallsRingtone">Sonido de llamadas</string>
<string name="batteryLevel">NIvel de la bateria</string>
<string name="selectBattery">Elija nivel de la bateria</string>
<string name="triggerNoiseLevel">Nivel del ruido fondo</string>
<string name="anotherAppIsRunning">Otra app esta encendida/terminada</string>
<string name="triggerNoiseLevel">Nivel del rudio fondo</string>
<string name="anotherAppIsRunning">Otra app esta encienda/terminada</string>
<string name="airplaneMode">Modo avión</string>
<string name="triggerHeadsetPlugged">Auriculares conectados</string>
<string name="headsetConnected">Auriculares (tipo: %1$s) conectados</string>
@ -258,7 +258,7 @@
<string name="phoneDirection">Elija llamada\nentrante o saliente</string>
<string name="headphoneSimple">Auriculares</string>
<string name="headphoneSelectType">Elija tipo de auriculares</string>
<string name="accelerometer">Acelerómetro</string>
<string name="accelerometer">" Acelerómetro"</string>
<string name="gpsAccuracy">GPS exactitud [m]</string>
<string name="soundSettings">Configuración de sonido</string>
<string name="settingsCategoryNoiseLevelMeasurements">Medición de ruido fondo</string>
@ -266,12 +266,12 @@
<string name="wakeupDevice">Despertar dispositivo</string>
<string name="textToSpeak">Texto para hablar</string>
<string name="state">Estado</string>
<string name="setScreenBrightness">Poner nivel de brillo</string>
<string name="brightnessManual">nivel de brillo manual</string>
<string name="brightnessAuto">brillo automatico</string>
<string name="autoBrightness">Activar brillo automatico</string>
<string name="setScreenBrightnessEnterValue">Inserte nivel de brillo deseado (de 0 a 100).</string>
<string name="autoBrightnessNotice">Si usa nivel de brillo automatico el valor probablemente no va a durar mucho tiempo.</string>
<string name="setScreenBrightness">Poner luminosidad del monitor</string>
<string name="brightnessManual">luminosidad manual del monitor</string>
<string name="brightnessAuto">luminosidad automatico</string>
<string name="autoBrightness">Activar luminosidad automatico</string>
<string name="setScreenBrightnessEnterValue">Inserte luminosidad deseada (de 0 a 100).</string>
<string name="autoBrightnessNotice">Si usa luminosidad automatica el valor probablemente no va a durar mucho tiempo.</string>
<string name="actionDataConnection">Datos móviles</string>
<string name="actionSpeakText">Hablar texto</string>
<string name="selectToggleDirection">Activar o desactivar?</string>
@ -294,11 +294,11 @@
<string name="parameterValue">Valor del parámetro</string>
<string name="addIntentValue">Añadir pareja intento</string>
<string name="parameterType">Tipo del parámetro</string>
<string name="phoneNumberExplanation">Puedes introducir un número, pero es opciónal. Si quieres usar uno puedes elegir uno de su directorio o introducir uno manualmente. Adiciónalmente puedes usar expresiónes regulares. Para probar esos me gusta la pagina:</string>
<string name="phoneNumberExplanation">Puedes entrar un número, pero es opciónal. Si quieres usar un puedes elegir un de su directorio o entrar un manualmente. Adiciónalmente puedes usar expresiónes regulares. Para testar esos me gusta la pagina:</string>
<string name="screenRotationEnabled">Rotación del monitor activado.</string>
<string name="screenRotationDisabled">Rotación del monitor desactivado.</string>
<string name="noPoisDefinedShort">No hay sitios.</string>
<string name="starting">iniciando</string>
<string name="starting">inciendo</string>
<string name="stopping">terminando</string>
<string name="connecting">conectando</string>
<string name="disconnecting">desconectando</string>
@ -306,31 +306,31 @@
<string name="disconnectedFromWifi">desconectado a wifi \"%1$s\"</string>
<string name="cantStopIt">No puedo terminarlo.</string>
<string name="httpAcceptAllCertificatesTitle">Aceptar todo los certificados</string>
<string name="httpAcceptAllCertificatesSummary">Omitir comprobar la validez de certificados (no es una buena idea)</string>
<string name="httpAcceptAllCertificatesSummary">Omitir comprobar el validez de certificados (no es una bien idea)</string>
<string name="httpAttemptsTimeoutTitle">Timeout [sec]</string>
<string name="httpAttemptsTitle">Número de pruebas HTTP</string>
<string name="httpAttemptsTimeoutSummary">Timeout de HTTP requests [segundos]</string>
<string name="httpAttemptGapTitle">Pausa [sec]</string>
<string name="runManually">Encender manualmente</string>
<string name="serviceHasToRunForThat">Para esta acción el servicio tiene que estar activo</string>
<string name="serviceHasToRunForThat">Para este ación el servicio tiene que estar activo</string>
<string name="gpsComparison">Comparación GPS</string>
<string name="timeoutForGpsComparisonsTitle">GPS timeout [sec]</string>
<string name="muteTextToSpeechDuringCallsTitle">Silencio durante llamadas</string>
<string name="anotherRuleByThatName">Ya existe otra regla con el mismo nombre.</string>
<string name="settingsCategoryProcessMonitoring">Monitoreo de procesos</string>
<string name="timeBetweenProcessMonitoringsTitle">Segundos entre monitoreos de procesos</string>
<string name="timeBetweenProcessMonitoringsTitle">Segundos inter monitoreos de procesos</string>
<string name="processes">Procesos</string>
<string name="processMonitoring">Monitoreo de procesos</string>
<string name="privacy">Política de privacidad</string>
<string name="moveUp">Desplazar a arriba</string>
<string name="moveDown">Desplazar a abajo</string>
<string name="warning">Alerta</string>
<string name="ringing">sonando</string>
<string name="ringing">soniendo</string>
<string name="from">de</string>
<string name="to">a</string>
<string name="matching">cordinando</string>
<string name="loadWifiList">Cargar lista de wifis</string>
<string name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">Leer notificaciónes del sistema</string>
<string name="matching">concordiando</string>
<string name="loadWifiList">Cargar listo de wifis</string>
<string name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">Leer notificaciónes del systema</string>
<string name="bluetoothFailed">No pude activar o desactivar Bluetooth. Tiene el dispositvo Bluetooth?</string>
<string name="urlTooShort">El url tiene que tener mínimo 10 caracteres.</string>
<string name="textTooShort">El texto tiene que tener mínimo 10 caracteres.</string>
@ -357,32 +357,33 @@
<string name="satisfactoryAccuracyNetwork">Exactitud necesaria para red en metros.</string>
<string name="networkAccuracy">Red exactitud [m]</string>
<string name="minimumTimeForLocationUpdates">Tiempo mínimo para cambio en milisegundos para actualizar posición</string>
<string name="timeForUpdate">Tiempo para actualizar [milisegundos]</string>
<string name="urlLegend">Variables: Puede usar esas variables. Mientras ejecuta van a sustituir con los valores correspondientes en su dispositivo. Incluya las paréntecis en su texto. [uniqueid] - el número único de su dispositivo [serialnr] - el número de serie de su dispositivo [latitude] - su latitud [longitude] - su longitud [phonenr] - Ùltimo número de llamada realizada tanto de salida como entrante [d] - Dia del mes, 2 digitos con cero al comienzo [m] - número del mes, 2 digitos con cero al comienzo [Y] - Número del año, 4 digitos [h] - Hora, formato 12 horas con cero al comienzo [H] - Hora, formato 24 horas con cero al comienzo [i] - Minutos con cero al comienzo [s] - Segundos con cero al comienzo [ms] - milisegundos [notificationTitle] - Título de la última notificación [notificationText] - Texto de la última notificación</string>
<string name="timeForUpdate">Tiempo de actualizar [milisegundos]</string>
<string name="urlLegend">Variables: Puede usar esas variables. Mientras ejecuta van a sustituir con los valores correspondientes en su dispositivo.
Incluya las paréntecis en su texto.\n\n[uniqueid] - el número único de su dispositivo\n[serialnr] - el número de serie de su dispositivo\n[latitude] - su latitud\n[longitude] - su longitud\n[phonenr] - Ùltimo número de llamada realizada tanto de salida como entrante\n[d] - Dia del mes, 2 digitos con cero al comienzo\n[m] - número del mes, 2 digitos con cero al comienzo\n[Y] - Número del año, 4 digitos\n[h] - Hora, formato 12 horas con cero al comienzo\n[H] - Hora, formato 24 horas con cero al comienzo\n[i] - Minutos con cero al comienzo\n[s] - Segundos con cero al comienzo\n[ms] - milisegundos\n[notificationTitle] - Título de la última notificación\n[notificationText] - Texto de la última notificación</string>
<string name="screenRotationAlreadyEnabled">Rotación del monitor todavia esta activado.</string>
<string name="screenRotationAlreadyDisabled">Rotación del monitor todavia esta desactivado.</string>
<string name="needLocationPermForWifiList">Se puede usar la lista de wifis conocidos para determinar los sitios en los cuales estuvo. Por eso el permiso de localización es necesario para cargar la lista de wifis. Si quiere elegir uno de la lista tiene que conceder el permiso. En caso contrario todavia puede introducir un nombre wifi manualmente.</string>
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Controlar conexiones de la app Wireguard</string>
<string name="shareConfigAndLogFilesWithDev">Enviar configuración y procotolo al desarollador (vía email).</string>
<string name="needLocationPermForWifiList">Se puede usar la lista de wifis conocidos para determinar los sitios a cuales estuve. Por eso el permiso locación esta necesaria para cargar la lista de wifis. Si quiere elegir un de la lista tiene que conceder el permiso. En caso contrario todavia puede entrar un nombre wifi manualmente.</string>
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Controlar conexiones de la app wireguard</string>
<string name="shareConfigAndLogFilesWithDev">Enviar configuración y procotolo al developer (vía email).</string>
<string name="rootExplanation">Necesita permiso root para esta función. Después encienda la función \"ejecutar regla manualmente\" para presentar el permiso superuser dialogo. Es necesario elegir \"siempre permitir root para esta app\". En caso contrario la regla no puede funcionar en segundo plano.</string>
<string name="helpTextRules">Todas las condiciones están \"Y\"-conectadas. La regla solo va a aplicarse cuando todas las condiciones se aplican. Si quiere \"O\", cree otra regla.</string>
<string name="timeBetweenNoiseLevelMeasurementsSummary">Segundos entre dos ensayos de nivel de ruido</string>
<string name="timeBetweenNoiseLevelMeasurementsTitle">Segundos entre dos ensayos de nivel de ruido</string>
<string name="lengthOfNoiseLevelMeasurementsSummary">Duración en segundos para una prueba de nivel de ruido</string>
<string name="lengthOfNoiseLevelMeasurementsTitle">Duración en segundos para una prueba de nivel de ruido</string>
<string name="referenceValueForNoiseLevelMeasurementsSummary">Referencia fisicalo para prueba de nivel ruido</string>
<string name="referenceValueForNoiseLevelMeasurementsTitle">Referencia fisicalo para prueba de nivel ruido</string>
<string name="helpTextRules">Todos las condiciones están y-conectado. La regla solo va a aplicarse cuando todos las condiciones sus aplican. Si quiere O cree otra regla.</string>
<string name="timeBetweenNoiseLevelMeasurementsSummary">Segundos inter dos ensayos de nivel de ruido</string>
<string name="timeBetweenNoiseLevelMeasurementsTitle">Segundos inter dos ensayos de nivel de ruido</string>
<string name="lengthOfNoiseLevelMeasurementsSummary">Duración en segundos para un ensayos de nivel de ruido</string>
<string name="lengthOfNoiseLevelMeasurementsTitle">Duración en segundos para un ensayos de nivel de ruido</string>
<string name="referenceValueForNoiseLevelMeasurementsSummary">Referencia fisicalo para ensayo de nivel ruido</string>
<string name="referenceValueForNoiseLevelMeasurementsTitle">Referencia fisicalo para ensayo de nivel ruido</string>
<string name="logLevelSummary">Nivel del registro (1=mínimo, 5=máximo)</string>
<string name="logLevelTitle">Nivel del registro</string>
<string name="failedToTriggerBluetooth">Error cambiando Bluetooth. Tiene el dispositivo Bluetooth?</string>
<string name="failedToTriggerBluetooth">Error cambiando Bluetooth. El dispositivo tiene Bluetooth?</string>
<string name="settingsCategoryHttp">Pedido HTTP</string>
<string name="httpAttemptsSummary">Cantidad de las pruebas en caso pedidos HTTP fallan por razones de conexión</string>
<string name="httpAttemptsSummary">Cantidad de los pruebos en caso pedidos HTTP fallan por razones de conexißon</string>
<string name="httpAttemptGapSummary">Pausa antes de otra prueba [segundos]</string>
<string name="timeoutForGpsComparisonsSummary">Tiempo máximo en segundos</string>
<string name="rememberLastActivePoiSummary">Si está en un sitio, reinicie su dispositivo o la aplicaión y salga del sitio, la aplicaión va a procesar reglas que incluyan saliendo este sitio.</string>
<string name="rememberLastActivePoiTitle">Memorizar último sitio activo.</string>
<string name="settingsErased">Configuración borrada.</string>
<string name="settingsSetToDefault">Configuración reajustada al predeterminado.</string>
<string name="rememberLastActivePoiSummary">Se esta en un sitio reinicie su dispositivo o la aplicaión y salga el sitio la aplicaión va a procesar reglas que incluyan saliendo este sitio.</string>
<string name="rememberLastActivePoiTitle">Memorar ultimom sitio activo.</string>
<string name="settingsErased">Configuración borrado.</string>
<string name="settingsSetToDefault">Configuración reajustado al predeterminado.</string>
<string name="privacyConfirmationText">Voy a abrir un browser y cargar la política de privacidad de la página del desarrolador.</string>
<string name="waitBeforeNextActionEnterValue">Inserte un valor en milisegundos por cuánto tiempo esperar antes de la proxima acción.</string>
<string name="wakeupDeviceValue">Inserte un valor en milisegundos por cuánto tiempo el dispositivo se tiene que quedar activo. 0 para usar el valor predeterminado.</string>
@ -399,19 +400,19 @@
<string name="any">cualquier</string>
<string name="incoming">recibiendo</string>
<string name="outgoing">saliendo</string>
<string name="noKnownWifis">No hay wifis conocidos en su dispositivo.</string>
<string name="noKnownWifis">No hay wifis conociendos en su disparador.</string>
<string name="helpTextTimeFrame">Si crea una regla con un periodo tiene dos opciones. Puede elegir entre entrar o salir de un periodo. En todo caso la regla será ejecutada solo una vez. Si crea una regla con una condición \"entrar periodo xyz\" y por ejemplo la acción \"poner el dispositivo en vibración\", el dispositivo NO va a cambiar a sonido de llamada automaticamente despues del periodo. Si desea esto tiene que crear otra regla con otro periodo.</string>
<string name="toggableRules">Reglas reversibles</string>
<string name="helpTextPoi">Un sitio consiste de coordinadas GPS y un radio. Porque la localización vía red móvil terrestre es relativamente imprecisa (pero rápida y barata) no especifiqué el radio demasiado corto. La aplicación va a sugerir un radio minimo cuando cree un nuevo sitio.</string>
<string name="helpTextPoi">Un sitio consiste de coordinadas GPS y un radio. Porque la localización vía red móvil terrestre es relativamente imprecisa (pero rápido y barato) no especifiqué el radio demasiado corto. La applicación va a sugerir un radio minimo cuando cree nuevo sitio.</string>
<string name="generalText">Para usar este programa tiene que crear reglas. Ellos tienen condiciones, por ejemplo \"está en un sitio\" o \"está en un periodo\". Despues cliquee el on/off boton en la pantalla principal.</string>
<string name="muteTextToSpeechDuringCallsSummary">Poner TextToSpeech en muto mientras dura las llamadas</string>
<string name="anotherPoiByThatName">Ya existe otro sitio con el mismo nombre.</string>
<string name="timeBetweenProcessMonitoringsSummary">Cuanto mas bajo, mas se utiliza la bateria</string>
<string name="timeBetweenProcessMonitoringsSummary">Cuanto mas bajo tanto mas se utiliza la bateria</string>
<string name="airplaneModeSdk17Warning">A partir de Android version 4.2 esta función solo functiona si su dispositivo esta rooted.</string>
<string name="selectTypeOfIntentPair">"Elija un tipo par intent. "</string>
<string name="enterNameForIntentPair">Inserte nombre para par intent.</string>
<string name="enterValueForIntentPair">Inserte valor para par intent.</string>
<string name="whatToDoWithIntentPair">Hacer que con par?</string>
<string name="selectTypeOfIntentPair">"Elija un tipo pareja intent. "</string>
<string name="enterNameForIntentPair">Inserte nombre para pareja intent.</string>
<string name="enterValueForIntentPair">Inserte valor para pareja intent.</string>
<string name="whatToDoWithIntentPair">Hacer que con pareja?</string>
<string name="gettingListOfInstalledApplications">Determinando lista de aplicaciones instaladas...</string>
<string name="actionSetDataConnectionOn">activar datos móviles</string>
<string name="actionSetDataConnectionOff">desactivar datos móviles</string>
@ -427,7 +428,7 @@
<string name="nfcWriteTag">Escribir tag</string>
<string name="nfcEnterValidIdentifier">Inserte una etiqueta valida para el tag (como \"Puerta de casa\").</string>
<string name="nfcTagWrittenSuccessfully">Tag escrita con éxito.</string>
<string name="nfcTagWriteError">Error escribiendo tag. Está el tag cerca?</string>
<string name="nfcTagWriteError">Error escribiendo tag. Esta el tag cerca?</string>
<string name="nfcTagDiscovered">Tag encontrado.</string>
<string name="nfcBringTagIntoRange">Traiga un tag cerca.</string>
<string name="nfcTagFoundWithText">Tag encontrado con etiqueta:</string>
@ -484,7 +485,7 @@
<string name="helpTextActivityDetection">Esta función puede detectar su estado de movimiento (a pie, en bicicleta, en vehiculo). La función no es parte de Automation, pero de Google Play Services. Técnicamente no da un \"si\" o \"no\" resultado, pero una probabilidad. Puede configurar este porcentaje del cual Automation va a aceptar un resultado. Dos comentarios: 1) Mas de un estado se puede aplicar al mismo tiempo. Por ejemplo puede estar a pie en un autobus. 2) Este sensor es relativamente caro (bateria). Si es posible considere alternativas, por ejemplo bluetooth conexión a su coche en vez de \"en vehiculo\".</string>
<string name="textMessageAnnotations">Puede insertar un numero de llamada. Alternativamente puede importar un numero de su directorio. Pero tenga en cuenta: El número será guardado, no el contacto. Si cambias el número en su directorio tiene que cambiar la regla también.</string>
<string name="startAutomationAsService">Encender automation como un servicio</string>
<string name="startScreenSummary">Elija la pantalla con que Automation enciende.</string>
<string name="startScreenSummary">Elija la pantalla con que automation enciende.</string>
<string name="useExistingTag">Use existente tag NFC</string>
<string name="nfcBringTagIntoRangeToRead">Traiga un tag dentro del alcance.</string>
<string name="toggleRule">Regla reversible</string>
@ -510,18 +511,18 @@
<string name="noiseDetectionHint">Si piensa que la detección del volumen no funciona correctamente (dependiendo del valor que configuró), tenga en cuenta todos los dispositivos son diferentes. Por eso puede cambiar la \"referencia del detección del volumen\" en la configuración. Para mas informaciones vease https://es.wikipedia.org/wiki/Nivel_de_presi%C3%B3n_sonora. Puede usar el probador del volumen en pantalla principal para calibrar su dispositivo.</string>
<string name="hint">Pista</string>
<string name="hapticFeedback">Sensación tactil (vibracion cuando toca la pantalla)</string>
<string name="helpTextSound">En la pantalla principal puede usar \"bloquear cambios de sonido\" para temporalmente evitar, basado en la norma, cambios de sonido. Por ejemplo podría estar en una situación o en un sitio donde un tono de llamada está bien, pero esta vez no es oportuno. La función se desactiva automaticamente despues del tiempo configurado. Cliquee el \"+\" boton para adicionar mas tiempo. Se puede desactivar la función antes tambien usando el boton interruptor (en consecuencia reactivar cambios de sonido, basados en normas).</string>
<string name="helpTextToggable">Las normas tienen una configuracion que se llama \\\"reversible\\\". Significa si una norma es ejecutada y despues las mismas condiciones aplican, la norma es ejecutada de forma reversible donde sea posible. Actualmente solo funciona con la condición NFC. Si toca el tag dos veces, y hay una norma reversible con este tag, la aplicación va a hacer lo contrario de la situación actual, por ejemplo desactivar wifi cuando está activo.</string>
<string name="helpTextProcessMonitoring">Si crea una norma con vigilancia del proceso, la aplicación va a revisar periodicamente si el proceso está activo. Puede ajustar la frecuencia en la configuración. Puede relentizar la reacción, pero la vigilancia permanente gasta mucha bateria. No hay un broadcast del sistema operativo para este evento.</string>
<string name="helpTextEnergySaving">Muchos fabricantes intentan conservar energia limitando las actividades de segundo plano de otras apps. Desafortunadamente el resultado es que esas aplicaciones no funcionan por completo. Automation está entre ellas. Vease <a href="https://dontkillmyapp.com/">esta pagina</a> para determinar como excluir Automation de tales medidas.</string>
<string name="helpTextSound">En la pantalla principal puede usar \\\"bloquear cambios de sonido\\\" para temporalmente evitar, basado en la norma, cambios de sonido. Por ejemplo podria estar en una situación o en un sitio donde tono de llamada estan bien, pero esta vez no fuese oportuno. La función se desactiva automaticamente despues del tiempo configurado. Cliquee el + botton para adicionar mas tiempo. Se puede desactivar la función antes tambien usando el boton interuptor (en consecuencia reactivar cambios de sonido, basados en normas).</string>
<string name="helpTextToggable">Normas tienen una configuracion que se llama \\\"reversible\\\". Significa si una norma es ejecutada y despues las mismas condiciones estan, la norma es ejecutada de forma reversible donde sea posible. Actualmente solo funciona con la condición NFC. Si toca el tag dos veces, y hay una norma reversible con este tag, la applicación va a hacer lo contrario de la situación actual, por ejemplo desactivar wifi cuando esta activo.</string>
<string name="helpTextProcessMonitoring">Si crea una norma con vigilancia del proceso la aplicación va a revisar periodicamente si el proceso esta activo. Puede ajustar la frecuencia en la configuración. Puede relentizar la reacción, pero vigilancia permanente gasta mucha bateria. No hay una broadcast del sistema operativo para este evento.</string>
<string name="helpTextEnergySaving">Muchos fabricantes intentan conservar energia en limitando la actividades de segundo plano de otras apps. Desafortunadamente el resultado es que en esas aplicaciones no funcionan por completo. Automation esta entre ellas. Vease <a href="https://dontkillmyapp.com/">esta pagina</a> para determinar como excluir Automation de tales medidas.</string>
<string name="speedMaximumTimeBetweenLocations">Tiempo maximo entre 2 sitios para determinar la velocidad.</string>
<string name="clone">Clonar</string>
<string name="updateAvailable">Hay nueva versión de la app. Quiere abrir un browser y descargarla?</string>
<string name="updateAvailable">Hay nueva versión de la app. Quiere abrir un browser y descargar lo?</string>
<string name="automaticUpdateCheck">Buscar updates</string>
<string name="urlToTriggerExplanation">Esta función NO abre el browser, pero enciende un URL en el fondo. Puede usar lo por ejemplo para enviar comandos a su automatización de la casa.</string>
<string name="automaticUpdateCheckSummary">Solo en la versión APK.</string>
<string name="locationFound">Determine una posición. El radio minimo sugerido es %1$d m.</string>
<string name="locationFoundInaccurate">Solo pude determinar una posición imprecisa. Puede ser, que funcione poco fiable. El radio minimo sugerido es %1$d m.</string>
<string name="locationFound">Determine un posición. El radio minimo sugeri es %1$d m.</string>
<string name="locationFoundInaccurate">Solo pude determinar una posición imprecisa. Puede ser va a funcionar poco fiable. El radio minimo sugeri es %1$d m.</string>
<string name="volumeMusicVideoGameMedia">Multimedia (música, video …)</string>
<string name="audibleSelection">Audio habilitado cuando selectión</string>
<string name="screenLockUnlockSound">Sonido del (des-)bloqueo de pantalla</string>
@ -558,39 +559,16 @@
<string name="android9RecordAudioNotice">Si usa la condición nivel del ruido fondo: Desafortunadamente iniciando con Android 9 (Pie) Google decidió prohibir aplicaciones de fondo usando el micrófono. Por eso esta condición no tendrá un efecto y no iniciará algo.</string>
<string name="android10WifiToggleNotice">Si usa la condición nivel del ruido fondo: Desafortunadamente iniciando con Android 9 (Pie) Google decidió prohibir aplicaciones de fondo usando el micrófono. Por eso esta condición no tendrá un efecto y no iniciará algo.</string>
<string name="messageNotShownAgain">Esta nota no aparecerá otra vez.</string>
<string name="noLocationCouldBeFound">No pude encontrar una posición despues de un limite de %1$s segundos..</string>
<string name="pleaseGiveBgLocation">En la proxima pantalla por favor vaya a permisos, luego a posición. Ahi elija \"Siempre permitir\" para permitir Automation determinar la posición en el fondo.</string>
<string name="ConfigurationExportError">Hubo un error durante la exportación de la configuración.</string>
<string name="rulesImportedSuccessfully">Reglas y sitios están exportados con exito.</string>
<string name="rulesImportError">Hubo un error durante la importación de las reglas y sitios.</string>
<string name="notAllFilesImported">No pudo importar todos los archivos aplicables.</string>
<string name="importExportExplanation">Despues de cliquear importar o exportar elija el directorio de que archivos serán importados o a que serán exportados. Si exporta archivos que ya existen serán sobreescritos.</string>
<string name="errorRunningRule">Hubo un error al iniciar una regla.</string>
<string name="locationEngineDisabledShort">La posición no sera determinada mas en el fondo. Cliquee aqui para averiguar más.</string>
<string name="noLocationCouldBeFound">No pude encontrar una posición despues un limite de 120 segundos..</string>
<string name="pleaseGiveBgLocation">En la proxima pantalla por favor vaya a permisos, luego posición. Ahi elija \"Siempre permitir\" para permitir Automation determinar la posición en el fondo.</string>
<string name="ConfigurationExportError">Hubo un error durante exportar la configuración.</string>
<string name="rulesImportedSuccessfully">Reglas y sitios serán exportado con exito.</string>
<string name="rulesImportError">Hubo un error durante importando reglas y sitios.</string>
<string name="notAllFilesImported">No pude importar todos los archivos aplicables.</string>
<string name="importExportExplanation">Despues de cliquear importar o exportar elija el directorio de que archivos serán importados o a que serán exportados. Si exporta archivos que ya existen serán sobreescribidos.</string>
<string name="errorRunningRule">Hubo un error iniciar una regla.</string>
<string name="locationEngineDisabledShort">La posición no mas sera determinado en el fondo. Cliquee aqui para averiguar más.</string>
<string name="displayNewsOnMainScreen">Mostrar noticias de la app en la pantalla principal.</string>
<string name="displayNewsOnMainScreenDescription">Noticias solo de esta app. Hablamos de 1-2 veces por año, no mas.</string>
<string name="featureNotInFdroidVersion">Esta caracteristica esta basada en software libre. Por eso no esta disponsible en la versión F-Droid.</string>
<string name="chooseActivityHint">En esta selección final tiene que elegir una \"Activity\" especifica. Simplificado: es una ventana especifica de la aplicación elegida. Si no sabe cual tiene que elegir, normalmente es una buena idea probar los que tienen \"main\" o \"launcher\" en el nombre.</string>
<string name="googleSarcasm">Gracias a la sabiduria infinita de Google y su esfuerzo constante de proteger la privacidad de todo el mundo. Por eso de todas las reglas que pueden enviar SMS o determinar el estado del movil las condiciones y acciones, que Google considera de riesgo, fueron eliminadas.</string>
<string name="screenLockSoundNotice">Sonidos de bloqueo de pantalla no seran mas cambiados en dispositivos que usan Android 6 o mas nuevos. Cualquier ajuste aqui no va a funcionar en cualquier dirección.</string>
<string name="googleLocationChicanery">Este app almacena datos de posición para activar reglas que necesitan la posición o la velocidad - incluso cuando la app esta cerrada o no en uso.</string>
<string name="googleLocationChicaneryOld">Este app almacena datos de posición para determinar si actualmente esta en uno de los sitios que creó. Además estan usados para determinar su actual velocidad (si usa esta condición en reglas). Incluso cuando la app esta cerrada o no en uso (pero solo cuando el servicio esta iniciado).</string>
<string name="settingsReferringToRestrictedFeatures">Su configuración y/o reglas actualmente referencian caracteristicas no-libres no seran proveidas en la versión F-Droid. Esto incluye determinar su actual actividad fisica.</string>
<string name="filesHaveBeenMovedTo">Automation ahora usa otra ruta para guardar sus archivos. Todos sus archivos de Automation fueron desplazados aqui: \"%s\". El permiso del almacenamiento externo todavia no es necesario; puede revocarlo. Sera eliminado en una futura versión.</string>
<string name="newsOptIn">Quiere recibir noticias (solo importantes) en la pantalla principal? Estas serán descargadas de la pagina del desarollador. No habrán notificaciones inoportunas, solo un texto en la pantalla principal cuando abra la app.</string>
<string name="filesStoredAt">Config y archivos de log seran guardados en el directorio %1$s. Cliquee en este texto para abrir un administrador de archivos. Desafortunadamente solo funciona en un dispositivo rooted. PARA OTROS DISP.: Simplemente use el boton para crear un backup.</string>
<string name="notificationTriggerExplanation">Esta condición responde a todas las aplicaciones que abren o cierran notificaciones en el areal notificaciones. Puedes especificar otra aplicación de que la notificación tiene que venir. Si no la notificación puede originarse de cualquier app. Tambien puedes especificar strings que (/no) tienen que estar en en titulo o el texto de la notificación. La comparación es insensible a minúsculas y mayúsculas.</string>
<string name="alwaysPlayExplanation">Si este ajuste esta activo el sonido será reproducido siempre. Si esta inactivo el sonido solo será reproducido si su dispositivo ni esta en mute ni en vibración. Pero si esta activo cambiará el volumen. Tambien si su dispositivo esta en el modo timbre el volumen multimedia no será cambiado por ejemplo. En resumen si el volumen multimedia esta en mute no escuchará nada.</string>
<string name="shareConfigAndLogExplanation">Esto comenzará un nuevo email con su config y los archivos de log adjunto como archivo zip. No será enviado automaticamente. Todavia tiene que cliquear \"enviar\". Tambien puede cambiar el receptor a si mismo por ejemplo.</string>
<string name="tabsPlacement">Posición de la barra de tabs</string>
<string name="top">Arriba</string>
<string name="bottom">Abajo</string>
<string name="vibrate">Vibrar</string>
<string name="test">Probar</string>
<string name="VibrateExplanation">Elija la duración de la vibración, seguido de un coma y una duración de una pausa. Puedes concatenar tantos como quiere. Separelos con comas tambien. Por ejemplo el patrón 100,500,500,1000,100 va a vibrar 100, esperar 500, vibrar 500, esperar 1000, vibrar 100 ms. Si cree que una vibración está perdida, pruebe incrementar la pausa antes de esta vibración.</string>
<string name="pleaseEnterValidVibrationPattern">Por favor introduzca un patrón de vibración válido.</string>
<string name="tabsPlacementSummary">Elija done la barra de tabs está puesto.</string>
<string name="intentDataComment">Si su parametro es de tipo Uri y especifica \"IntentData\" como nombre (minúscula/mayáscula no es importante), el parametro no está añadido como un parametro normal con puExtra(), pero estará añadido al intent con setData().</string>
<string name="locationEngineDisabledLong">Desafortunadamente su posición todavia no puede ser determinada. Gratitud va para Google por su sabiduria y amabilidad infinita.\n\nDejenme explicarselo mas. Comenzando con Android 10 un nuevo permiso se introdujo que es necesario para determinar la posición en el fondo (que es necesario para una app como esta). Aunque lo considero una buena idea, conlleva a una chicana para desarolladores.\n\nCuando se esta desarrollando una app se puede intentar calificar para este permiso mientras se sigue un catalogo de condiciones. Desafortunadamente nuevas versiones de mi app fueron rechazadas por un periodo de trés meses. Cumplé todas las condiciones, pero Google's mierda servicio para desarolladores afirmó que no. Despues de presentar pruebas, que cumplí con todo, recibí una respuesta de "No puedo ayudarte mas.". En algun momento me rendí.\n\nComo consecuencia la version Google Play todavia no sabe usar la locación como una condición. Mi única alternativa fue remover la applicación de Google Play.\n\nLo siento mucho, pero hicé todo lo posible para discutir con un support que no sabe aprobar la prueba de Turing repetidamente.\n\nLa noticia positiva: Usted todavia puede tener todo!\n\nAutomation ahora es open source y se puede encontrar en F-Droid. Es un app store que se preocupa por su privacidad - en vez de solo simular eso. Simplemente guarde su configuración, desinstale la app, instale la de F-Droid, restaure su configuración - terminado.\n\nCliquee aqui para averiguar más:</string>
<string name="startAppChoiceNote">Aqui tiene 2 opciones generales:\\n\\n1. Puede encender un programa seleccionando un activity. Imagine eso como preseleccionar una pantalla/ventana especifica de una aplicación. Tenga en cuenta que no siempre funcionará. Eso es porque las ventanas de una app pueden interactuar entre ellas, por ejemplo dar parametros. Si se abre una ventana especifica directamente esta interacción todavia no ha ocurrido y la ventana se podría cerrar al instante (por lo tanto nunca será presentada). Pruebe esto sin embargo! Puede introducir una trayectoria de una activity manualmente, pero es recomendable usar el boton \"Elegir\". Si decide introducir la trayectoria de la app manualmente en la casilla de arriba y la trayectoria completa de una activity en la de abajo.\\n\\n2.Elección con action\\nContrariamente a elegir una ventana especifica, tambien puede encender una app con un action. Es similar a llamar \"Queria xyz\" y si hay una app que le puede ayudar a usted sera encendida. Un ejemplo bueno seria \"abrir browser\" - podria tener multiples (una normalemente es el valor predeterminado). Usted necesita introducirlo manualmente, PackageName es opcional aqui. Tenga en cuenta las variables no seran resueltas. Si por ejemplo quiere encender la camara usando \"MediaStore.ACTION_IMAGE_CAPTURE\" no va a funcionar. Tiene que mirar en la documentación de Android y usar el valor real de esta variable que - en este ejemplo - seria \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="displayNewsOnMainScreenDescription">Noticias solo de esta app. Hablamos de 1-2 veces per año, no mas.</string>
<string name="featureNotInFdroidVersion">Esta characteristica es basado en software libre. Por eso no esta disponsible in la versión F-Droid.</string>
</resources>

View File

@ -474,7 +474,7 @@
<string name="startAppByActivity">per attività</string>
<string name="startAppBySendBroadcast">per sendBroadcast()</string>
<string name="startAppByStartActivity">per startActivity()</string>
<string name="startAppChoiceNote">Qui hai 2 opzioni generali:\n\n1. Puoi avviare un programma selezionando un\'attività. Immagina questo come la preselezione di una specifica schermata/finestra di un\'applicazione. Tieni a mente che questo potrebbe non funzionare sempre. Questo perché le finestre di un\'applicazione potrebbero interagire tra loro, ad esempio per passarsi dei parametri. Quando si avvia direttamente una schermata specifica la cui\n\ninterazione non è ancora avvenuta, la finestra potrebbe chiudersi istantaneamente (quindi non verrà mai mostrata). Ma puoi provare comunque! Inserisci un percorso di attività manualmente, ma si raccomanda di usare il pulsante \"Seleziona\". Se decidi di inserirlo manualmente, digita il nome del pacchetto dell\'applicazione nel campo superiore e il percorso completo dell\'attività in quello inferiore.\n\n2. Selezione per azione. Invece che selezionare una specifica finestra puoi anche avviare un programma per mezzo di un\'azione. Questo è come gridare "Vorrei xyz" e se c\'è un\'applicazione installata che è registrata con quella funzione, verrà avviata. Un buon esempio sarebbe avviare un navigatore - potresti anche averne più di uno installato (ma uno è di solito quello di default). Devi inserire questo manualmente, mentre PackageName è opzionale qui. Tieni a mente che nessuna variabile sarà risolta. Se vuoi avviare la fotocamera per esempio usando \"MediaStore.ACTION_IMAGE_CAPTURE\" non funzionerà. Devi dare un\'occhiata alla documentazione di Android e usare invece il valore effettivo di questa variabile che in questo esempio sarebbe \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="startAppChoiceNote">Qui hai 2 opzioni generali: 1. Puoi avviare un programma selezionando un\'attività. Immagina questo come la preselezione di una specifica schermata/finestra di un\'applicazione. Tieni a mente che questo potrebbe non funzionare sempre. Questo perché le finestre di un\'applicazione potrebbero interagire tra loro, ad esempio per passarsi dei parametri. Quando si avvia direttamente una schermata specifica la cui interazione non è ancora avvenuta, la finestra potrebbe chiudersi istantaneamente (quindi non verrà mai mostrata). Ma puoi provare comunque! Inserisci un percorso di attività manualmente, ma si raccomanda di usare il pulsante \"Seleziona\". Se decidi di inserirlo manualmente, digita il nome del pacchetto dell\'applicazione nel campo superiore e il percorso completo dell\'attività in quello inferiore. 2. Selezione per azione. Invece che selezionare una specifica finestra puoi anche avviare un programma per mezzo di un\'azione. Questo è come gridare "Vorrei xyz" e se c\'è un\'applicazione installata che è registrata con quella funzione, verrà avviata. Un buon esempio sarebbe avviare un navigatore - potresti anche averne più di uno installato (ma uno è di solito quello di default). Devi inserire questo manualmente, mentre PackageName è opzionale qui. Tieni a mente che nessuna variabile sarà risolta. Se vuoi avviare la fotocamera per esempio usando \"MediaStore.ACTION_IMAGE_CAPTURE\" non funzionerà. Devi dare un\'occhiata alla documentazione di Android e usare invece il valore effettivo di questa variabile che in questo esempio sarebbe \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="startAppSelectionType">Metodo per\nselezionare l\'applicazione</string>
<string name="startAppStartType">Seleziona tipo di avvio</string>
<string name="startAtSystemBoot">Avvio automatico al boot</string>

View File

@ -21,16 +21,4 @@
<item name="2">2</item>
<item name="3">3</item>
</string-array>
<string-array name="tabsPlacementOptions">
<item name="0">@string/top</item>
<item name="1">@string/bottom</item>
</string-array>
<string-array name="tabsPlacementOptionsValues">
<item name="0">0</item>
<item name="1">1</item>
<item name="2">2</item>
<item name="3">3</item>
</string-array>
</resources>

View File

@ -125,7 +125,7 @@
<string name="soundSettings">Sound settings</string>
<string name="showHelp">Show help</string>
<string name="rules">Rules</string>
<string name="helpTextRules">All triggers in a rule are AND-connected. The rule will only apply if all triggers are met. If you want OR, create another rule.</string>
<string name="helpTextRules">All triggers in a rule are AND-connected. The rule will only apply if all triggers are met. If you want OR create another rule.</string>
<string name="timeframes">TimeFrames</string>
<string name="helpTextTimeFrame">If you specify a rule with a timeframe you have two choices. You can choose between entering OR leaving a timeframe. Either way a rule is triggered only once. So if you create a rule that has \"entering timeframe xyz\" as trigger and let it change your sound profile to vibrate that does not mean that the phone will automatically go to ring if the timeframe is over. If you want that you need to specify another rule with another timeframe.</string>
<string name="helpTextSound">On the main screen you can use lock sound changes to temporarily avoid rule based sound changes. E.g. you may be in a situation or place where usually ringtones are ok, but this one time it would be disturbing. The feature will automatically deactivate once the configured time has elapsed. Click the + button to add the given amount of time. Once it is active you may deactivate it again using the toggle button (and that way enable rule based sound changes again).</string>
@ -261,7 +261,7 @@
<string name="anotherAppIsRunning">Another app is started/stopped</string>
<string name="settingsCategoryProcessMonitoring">Process monitoring</string>
<string name="timeBetweenProcessMonitoringsTitle">Seconds between process monitorings</string>
<string name="timeBetweenProcessMonitoringsSummary">The lower, the higher the battery usage</string>
<string name="timeBetweenProcessMonitoringsSummary">The lower the higher the battery usage</string>
<string name="refreshingProcessList" translatable="false">Refreshing process list.</string>
<string name="processes">Processes</string>
<string name="startingPeriodicProcessMonitoringEngine" translatable="false">Starting periodic process monitoring engine.</string>
@ -602,10 +602,11 @@
<string name="displayNewsOnMainScreen">Display application news on main screen</string>
<string name="displayNewsOnMainScreenDescription">Announcements about this app only, we\'re probably talking about 1-2 per year, not more.</string>
<string name="filesHaveBeenMovedTo">Automation now uses another path to store your files. All your Automation-files have been moved here: \"%s\". The external storage permission is not required anymore; you can revoke it. It will be removed in a future version.</string>
<string name="newsOptIn">Would you like to receive (only important) news about this app on the main screen? Those are downloaded from the developer\'s website. There will be no intrusive notification, just a text on the main screen when you open the app.</string>
<string name="locationDisabled">Location disabled</string>
<string name="locationEngineDisabledShort">Location cannot be determined in the background anymore. Click here to find out why.</string>
<string name="locationEngineDisabledLong">Unfortunately your location cannot be determined anymore. A debt of gratitude is owed to Google for its infinite wisdom and amiableness.\\n\\nLet me explain this further. Starting with Android 10 a new permission was introduced that is needed to determine your location in the background (which of course is required for an app like this). Whilst I consider that a good idea in general the chicanery it involves for developers is not.\\n\\nWhen developing an app you can try to qualify for this permission by abiding to a catalog of requirements. Unfortunately new versions of my app have been rejected over a period of three months. I fulfilled all those requirements, Google\'s shitty development support claimed I would not. After giving them proof that I did after all - I got a response like \"I cannot help you anymore\". Eventually I gave up. \\n\\nAs a consequence the Google Play version can NOT use your location as a trigger anymore. My only alternative option would have been to have this application removed from the store entirely.\\n\\nI\'m very sorry about that, but I\'ve tried my best arguing with a \"support\" that repeatedly failed to pass the Turing test.\\n\\nThe good news: You can still have it all!\\n\\nAutomation is now open source and can be found in F-Droid. That is an app store that really cares about your privacy - rather than just acting like that. Simply backup your config file, uninstall this app, install it again from F-Droid, restore your config file - done.\\n\\nClick here to find out more:</string>
<string name="filesStoredAt">Config and log files are stored in folder %1$s. Click on this text to open a file explorer. Unfortunately this will only work on a rooted device. FOR ALL OTHER DEVICES: Simply use the export button to make a backup.</string>
<string name="filesStoredAt">Config and log files are stored in folder %1$s. Click on this text to open a file explorer. Unfortunately this will only work on a rooted device.\n\nFOR ALL OTHER DEVICES: Simply use the export button to make a backup.</string>
<string name="notification">Notification</string>
<string name="title">Title</string>
<string name="text">Text</string>
@ -630,7 +631,7 @@
<string name="noFileManageInstalled">No file manager installed.</string>
<string name="shareConfigAndLogFilesWithDev">Share config and log files with developer (via email).</string>
<string name="shareConfigAndLogExplanation">This will start a new email with your config and log files attached as zip file. It will not be sent automatically, you still need to hit \"send\". You can also change the recipient to yourself for example.</string>
<string name="startAppChoiceNote">Here you have 2 general options:\n\n1. You can start a program by selecting an activity. Imagine this like preselecting a specific screen/window of an application. Keep in mind this may not always work. This is because the windows of an app might interact with each other, e.g. pass on parameters. When bluntly starting a specific screen that interaction has not happened and the window might close instantly (therefore it\'s never really shown). Try it nevertheless! You can enter an activity path manually, but it\'s recommended to use the \"Select\" button. If you decide to enter it manually enter the app\'s package name in the upper field and the full path of the activity in the lower one.\n\n2. Selection by action In contrast to selecting a specific window you can also start a program by an action. This is like shouting out \"I\'d would like xyz\" and if there\'s an app installed that can help you with that it will be started. A good example would be start browser - you might even have multiple installed (one is usually the default one). You need to enter this manually, PackageName is optional here. Keep in mind no variables will be resolved. If you want to start the camera for example using \"MediaStore.ACTION_IMAGE_CAPTURE\" will not work. You have to take a look at the Android documentation and use this variable\'s actual value instead which in this example would be \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="startAppChoiceNote">Here you have 2 general options: 1. You can start a program by selecting an activity. Imagine this like preselecting a specific screen/window of an application. Keep in mind this may not always work. This is because the windows of an app might interact with each other, e.g. pass on parameters. When bluntly starting a specific screen that interaction has not happened and the window might close instantly (therefore it\'s never really shown). Try it nevertheless! You can enter an activity path manually, but it\'s recommended to use the \"Select\" button. If you decide to enter it manually enter the app\'s package name in the upper field and the full path of the activity in the lower one. 2. Selection by action In contrast to selecting a specific window you can also start a program by an action. This is like shouting out \"I\'d would like xyz\" and if there\'s an app installed that can help you with that it will be started. A good example would be start browser - you might even have multiple installed (one is usually the default one). You need to enter this manually, PackageName is optional here. Keep in mind no variables will be resolved. If you want to start the camera for example using \"MediaStore.ACTION_IMAGE_CAPTURE\" will not work. You have to take a look at the Android documentation and use this variable\'s actual value instead which in this example would be \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="errorRunningRule">There was an error running a rule.</string>
<string name="cantFindSoundFile">Cannot find sound file %1$s and therefore not play it.</string>
<string name="addParameters">Add parameters</string>
@ -681,13 +682,4 @@
<string name="clone">Clone</string>
<string name="noLocationCouldBeFound">No position could be found after a timeout of %1$s seconds.</string>
<string name="pleaseGiveBgLocation">In the next screen please go to permissions, then location. There select \"Allow all the time\" to allow Automation to determine your location in the background.</string>
<string name="vibrate">Vibrate</string>
<string name="test">Try</string>
<string name="VibrateExplanation">Enter a vibration duration, followed by a comma, then a pause duration. You can concatenate as many vibrations as you like. Separate them by commas again. E.g. the pattern 100,500,500,1000,100 will vibrate 100, wait 500, vibrate 500, wait 1000, vibrate 100 ms. If you think a vibration is dropped, try increasing the pause before them.</string>
<string name="pleaseEnterValidVibrationPattern">Please enter a valid vibration pattern.</string>
<string name="newsOptIn">Would you like to receive (only important) news about this app on the main screen? Those are downloaded from the developer\'s website. There will be no intrusive notification, just a text on the main screen when you open the app.</string>
<string name="top">Top</string>
<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>
</resources>

View File

@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.android.tools.build:gradle:4.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@ -1,4 +0,0 @@
* Übersetzungen aktualisiert.
* Neue Aktion: Vibrieren
* Geschwindigkeitsberechnung verbessert
* Position der Tableiste kann gewählt werden (oben/unten)

View File

@ -1,4 +0,0 @@
* Translations updated.
* New action: Vibrate
* Improved speed calculation
* Position of tabbar can be chosen (top/bottom)

View File

@ -1,4 +0,0 @@
* Traducciones actualizadas.
* Nueva acción: Vibrate
* Cálculo de velocidad mejorado
* Posición de tabbar se puede elegir (top/bottom)

View File

@ -1,4 +0,0 @@
* Traduzioni aggiornate.
* Nuova azione: Vibrate
* Calcolo della velocità migliorato
* La posizione della barra delle schede può essere scelta (in alto / in basso)