forked from jens/Automation
Setting ringtones from profiles works again
This commit is contained in:
parent
2b69938ad5
commit
62a8723344
@ -12,7 +12,7 @@ android {
|
|||||||
buildToolsVersion '29.0.2'
|
buildToolsVersion '29.0.2'
|
||||||
useLibrary 'org.apache.http.legacy'
|
useLibrary 'org.apache.http.legacy'
|
||||||
versionCode 123
|
versionCode 123
|
||||||
versionName "1.7.7"
|
versionName "1.7.8"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
@ -47,37 +47,37 @@ public class ActivityManageProfile extends Activity
|
|||||||
|
|
||||||
boolean guiUpdate = false;
|
boolean guiUpdate = false;
|
||||||
|
|
||||||
File incomingCallsRingtone = null, notificationsRingtone = null;
|
String incomingCallsRingtone = null, notificationsRingtone = null;
|
||||||
|
|
||||||
ArrayAdapter<String> soundModeAdapter;
|
ArrayAdapter<String> soundModeAdapter;
|
||||||
ArrayAdapter<String> dndModeAdapter;
|
ArrayAdapter<String> dndModeAdapter;
|
||||||
|
|
||||||
public void setIncomingCallsRingtone(File incomingCallsRingtone)
|
public void setIncomingCallsRingtone(String incomingCallsRingtone)
|
||||||
{
|
{
|
||||||
this.incomingCallsRingtone = incomingCallsRingtone;
|
this.incomingCallsRingtone = incomingCallsRingtone;
|
||||||
|
|
||||||
if(incomingCallsRingtone != null)
|
if(incomingCallsRingtone != null)
|
||||||
tvIncomingCallsRingtone.setText(this.incomingCallsRingtone.getAbsolutePath());
|
tvIncomingCallsRingtone.setText(this.incomingCallsRingtone);
|
||||||
else
|
else
|
||||||
tvIncomingCallsRingtone.setText(getResources().getString(R.string.none));
|
tvIncomingCallsRingtone.setText(getResources().getString(R.string.none));
|
||||||
}
|
}
|
||||||
|
|
||||||
public File getIncomingCallsRingtone()
|
public String getIncomingCallsRingtone()
|
||||||
{
|
{
|
||||||
return incomingCallsRingtone;
|
return incomingCallsRingtone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNotificationsRingtone(File notificationsRingtone)
|
public void setNotificationsRingtone(String notificationsRingtone)
|
||||||
{
|
{
|
||||||
this.notificationsRingtone = notificationsRingtone;
|
this.notificationsRingtone = notificationsRingtone;
|
||||||
|
|
||||||
if(this.notificationsRingtone != null)
|
if(this.notificationsRingtone != null)
|
||||||
tvNotificationsRingtone.setText(this.notificationsRingtone.getAbsolutePath());
|
tvNotificationsRingtone.setText(this.notificationsRingtone);
|
||||||
else
|
else
|
||||||
tvNotificationsRingtone.setText(getResources().getString(R.string.none));
|
tvNotificationsRingtone.setText(getResources().getString(R.string.none));
|
||||||
}
|
}
|
||||||
|
|
||||||
public File getNotificationsRingtone()
|
public String getNotificationsRingtone()
|
||||||
{
|
{
|
||||||
return notificationsRingtone;
|
return notificationsRingtone;
|
||||||
}
|
}
|
||||||
@ -284,26 +284,26 @@ public class ActivityManageProfile extends Activity
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v)
|
public void onClick(View v)
|
||||||
{
|
{
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
// Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||||
fileIntent.setType("audio/*");
|
// fileIntent.setType("audio/*");
|
||||||
startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
|
// startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
|
||||||
}
|
// }
|
||||||
catch(ActivityNotFoundException e)
|
// catch(ActivityNotFoundException e)
|
||||||
{
|
// {
|
||||||
// Use media browser instead
|
// Use media browser instead
|
||||||
Intent fileSelectionIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
|
Intent fileSelectionIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
|
||||||
|
|
||||||
if(ActivityMainProfiles.profileToEdit != null)
|
if(ActivityMainProfiles.profileToEdit != null)
|
||||||
{
|
{
|
||||||
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.incomingCallsRingtone.getAbsolutePath());
|
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.incomingCallsRingtone);
|
||||||
if(ActivityMainProfiles.profileToEdit.changeIncomingCallsRingtone)
|
if(ActivityMainProfiles.profileToEdit.changeIncomingCallsRingtone)
|
||||||
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
|
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
|
||||||
}
|
}
|
||||||
|
|
||||||
startActivityForResult(fileSelectionIntent, intentCodeRingtonePickerCallsRingtone);
|
startActivityForResult(fileSelectionIntent, intentCodeRingtonePickerCallsRingtone);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
bChangeSoundNotifications.setOnClickListener(new OnClickListener()
|
bChangeSoundNotifications.setOnClickListener(new OnClickListener()
|
||||||
@ -324,7 +324,7 @@ public class ActivityManageProfile extends Activity
|
|||||||
|
|
||||||
if(ActivityMainProfiles.profileToEdit != null)
|
if(ActivityMainProfiles.profileToEdit != null)
|
||||||
{
|
{
|
||||||
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.notificationRingtone.getAbsolutePath());
|
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.notificationRingtone);
|
||||||
if(ActivityMainProfiles.profileToEdit.changeNotificationRingtone)
|
if(ActivityMainProfiles.profileToEdit.changeNotificationRingtone)
|
||||||
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
|
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
|
||||||
}
|
}
|
||||||
@ -495,15 +495,20 @@ public class ActivityManageProfile extends Activity
|
|||||||
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
|
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
|
||||||
if (uri != null)
|
if (uri != null)
|
||||||
{
|
{
|
||||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
|
// if(Build.VERSION.SDK_INT < 26)
|
||||||
setIncomingCallsRingtone(new File(ringTonePath));
|
// {
|
||||||
|
// String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
|
||||||
|
// setIncomingCallsRingtone(ringTonePath);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
setIncomingCallsRingtone(uri.toString());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case intentCodeRingtonePickerCallsFile:
|
case intentCodeRingtonePickerCallsFile:
|
||||||
{
|
{
|
||||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
||||||
setIncomingCallsRingtone(new File(ringTonePath));
|
setIncomingCallsRingtone(ringTonePath);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case intentCodeRingtonePickerNotificationsRingtone: // notifications
|
case intentCodeRingtonePickerNotificationsRingtone: // notifications
|
||||||
@ -511,15 +516,20 @@ public class ActivityManageProfile extends Activity
|
|||||||
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
|
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
|
||||||
if (uri != null)
|
if (uri != null)
|
||||||
{
|
{
|
||||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
// if(Build.VERSION.SDK_INT < 26)
|
||||||
setNotificationsRingtone(new File(ringTonePath));
|
// {
|
||||||
|
// String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
|
||||||
|
// setNotificationsRingtone(ringTonePath);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
setNotificationsRingtone(uri.toString());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case intentCodeRingtonePickerNotificationsFile:
|
case intentCodeRingtonePickerNotificationsFile:
|
||||||
{
|
{
|
||||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
||||||
setNotificationsRingtone(new File(ringTonePath));
|
setNotificationsRingtone(ringTonePath);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -3,6 +3,7 @@ package com.jens.automation2;
|
|||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.database.Cursor;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.media.RingtoneManager;
|
import android.media.RingtoneManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@ -41,13 +42,13 @@ public class Profile implements Comparable<Profile>
|
|||||||
protected int volumeAlarms;
|
protected int volumeAlarms;
|
||||||
|
|
||||||
protected boolean changeIncomingCallsRingtone;
|
protected boolean changeIncomingCallsRingtone;
|
||||||
protected File incomingCallsRingtone;
|
protected String incomingCallsRingtone;
|
||||||
|
|
||||||
protected boolean changeVibrateWhenRinging;
|
protected boolean changeVibrateWhenRinging;
|
||||||
protected boolean vibrateWhenRinging;
|
protected boolean vibrateWhenRinging;
|
||||||
|
|
||||||
protected boolean changeNotificationRingtone;
|
protected boolean changeNotificationRingtone;
|
||||||
protected File notificationRingtone;
|
protected String notificationRingtone;
|
||||||
|
|
||||||
protected boolean changeAudibleSelection;
|
protected boolean changeAudibleSelection;
|
||||||
protected boolean audibleSelection;
|
protected boolean audibleSelection;
|
||||||
@ -171,11 +172,11 @@ public class Profile implements Comparable<Profile>
|
|||||||
return changeIncomingCallsRingtone;
|
return changeIncomingCallsRingtone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIncomingCallsRingtone(File incomingCallsRingtone)
|
public void setIncomingCallsRingtone(String incomingCallsRingtone)
|
||||||
{
|
{
|
||||||
this.incomingCallsRingtone = incomingCallsRingtone;
|
this.incomingCallsRingtone = incomingCallsRingtone;
|
||||||
}
|
}
|
||||||
public File getIncomingCallsRingtone()
|
public String getIncomingCallsRingtone()
|
||||||
{
|
{
|
||||||
return incomingCallsRingtone;
|
return incomingCallsRingtone;
|
||||||
}
|
}
|
||||||
@ -207,11 +208,11 @@ public class Profile implements Comparable<Profile>
|
|||||||
return changeNotificationRingtone;
|
return changeNotificationRingtone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNotificationRingtone(File notificationsRingtone)
|
public void setNotificationRingtone(String notificationsRingtone)
|
||||||
{
|
{
|
||||||
this.notificationRingtone = notificationsRingtone;
|
this.notificationRingtone = notificationsRingtone;
|
||||||
}
|
}
|
||||||
public File getNotificationRingtone()
|
public String getNotificationRingtone()
|
||||||
{
|
{
|
||||||
return notificationRingtone;
|
return notificationRingtone;
|
||||||
}
|
}
|
||||||
@ -292,9 +293,9 @@ public class Profile implements Comparable<Profile>
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean applyRingTone(File ringtoneFile, int ringtoneType, Context context)
|
private boolean applyRingTone(String ringtoneFile, int ringtoneType, Context context)
|
||||||
{
|
{
|
||||||
Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile.getAbsolutePath(), 3);
|
Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile, 3);
|
||||||
|
|
||||||
// if(!ringtoneFile.exists() || !ringtoneFile.canRead())
|
// if(!ringtoneFile.exists() || !ringtoneFile.canRead())
|
||||||
// {
|
// {
|
||||||
@ -304,53 +305,55 @@ public class Profile implements Comparable<Profile>
|
|||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
// Set by URI
|
||||||
values.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
|
if(ringtoneFile.contains("//"))
|
||||||
values.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
|
|
||||||
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
|
|
||||||
values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length());
|
|
||||||
values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
|
|
||||||
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, ringtoneType == RingtoneManager.TYPE_NOTIFICATION);
|
|
||||||
values.put(MediaStore.Audio.Media.IS_ALARM, false);
|
|
||||||
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
Uri newRingTone = null;
|
Uri target = Uri.parse(ringtoneFile);
|
||||||
|
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, target);
|
||||||
|
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + ringtoneFile, 1);
|
||||||
|
return true;
|
||||||
|
} // Set by filepath
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(MediaStore.MediaColumns.DATA, ringtoneFile);
|
||||||
|
values.put(MediaStore.MediaColumns.TITLE, ringtoneFile);
|
||||||
|
//values.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
|
||||||
|
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
|
||||||
|
values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length());
|
||||||
|
values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
|
||||||
|
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, ringtoneType == RingtoneManager.TYPE_NOTIFICATION);
|
||||||
|
values.put(MediaStore.Audio.Media.IS_ALARM, false);
|
||||||
|
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
|
||||||
|
|
||||||
//TODO: This part needs to be made compatible with Android 11 and above.
|
try
|
||||||
if(Build.VERSION.SDK_INT < 30)
|
|
||||||
{
|
{
|
||||||
Uri existingRingTone = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile.getAbsolutePath());
|
Uri newRingTone = null;
|
||||||
|
|
||||||
if (existingRingTone != null)
|
Uri existingRingTone = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile);
|
||||||
context.getContentResolver().delete(existingRingTone, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"", null);
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (existingRingTone != null)
|
||||||
|
context.getContentResolver().delete(existingRingTone, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile + "\"", null);
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
Miscellaneous.logEvent("w","Delete file from ringtones", "Deleting ringtone from library failed: " + Log.getStackTraceString(e), 2);
|
||||||
|
}
|
||||||
|
|
||||||
newRingTone = context.getContentResolver().insert(existingRingTone, values);
|
newRingTone = context.getContentResolver().insert(existingRingTone, values);
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, newRingTone);
|
||||||
Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath());
|
|
||||||
Uri newUri = mCr.insert(uri, values);
|
|
||||||
try {
|
|
||||||
Uri rUri = RingtoneManager.getValidRingtoneUri(this);
|
|
||||||
if (rUri != null)
|
|
||||||
ringtoneManager.setStopPreviousRingtone(true);
|
|
||||||
RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri);
|
|
||||||
Toast.makeText(this, "New Rigntone set", Toast.LENGTH_SHORT).show();
|
|
||||||
} catch (Throwable t) {
|
|
||||||
Log.e("sanjay in catch", "catch exception"+e.getMessage());
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, newRingTone);
|
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + newRingTone.toString(), 1);
|
||||||
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + newRingTone.toString(), 1);
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
catch (Throwable t)
|
||||||
catch (Throwable t)
|
{
|
||||||
{
|
String message = "Error setting ringtone: " + Log.getStackTraceString(t);
|
||||||
String message = "Error setting ringtone: " + Log.getStackTraceString(t);
|
Miscellaneous.logEvent("e", "Profile", message, 1);
|
||||||
Miscellaneous.logEvent("e", "Profile", message, 1);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -160,9 +160,9 @@ public class XmlFileInterface
|
|||||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeIncomingCallsRingtone()));
|
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeIncomingCallsRingtone()));
|
||||||
serializer.endTag(null, "changeIncomingCallsRingtone");//
|
serializer.endTag(null, "changeIncomingCallsRingtone");//
|
||||||
serializer.startTag(null, "incomingCallsRingtone");
|
serializer.startTag(null, "incomingCallsRingtone");
|
||||||
File incomingFile = Profile.getProfileCollection().get(i).getIncomingCallsRingtone();
|
String incomingFile = Profile.getProfileCollection().get(i).getIncomingCallsRingtone();
|
||||||
if(incomingFile != null)
|
if(incomingFile != null)
|
||||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getIncomingCallsRingtone().getPath()));
|
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getIncomingCallsRingtone()));
|
||||||
else
|
else
|
||||||
serializer.text("null");
|
serializer.text("null");
|
||||||
serializer.endTag(null, "incomingCallsRingtone");
|
serializer.endTag(null, "incomingCallsRingtone");
|
||||||
@ -178,9 +178,9 @@ public class XmlFileInterface
|
|||||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeNotificationRingtone()));
|
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeNotificationRingtone()));
|
||||||
serializer.endTag(null, "changeNotificationRingtone");//
|
serializer.endTag(null, "changeNotificationRingtone");//
|
||||||
serializer.startTag(null, "notificationRingtone");
|
serializer.startTag(null, "notificationRingtone");
|
||||||
File notificationFile = Profile.getProfileCollection().get(i).getNotificationRingtone();
|
String notificationFile = Profile.getProfileCollection().get(i).getNotificationRingtone();
|
||||||
if(notificationFile != null)
|
if(notificationFile != null)
|
||||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getNotificationRingtone().getPath()));
|
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getNotificationRingtone()));
|
||||||
else
|
else
|
||||||
serializer.text("null");
|
serializer.text("null");
|
||||||
serializer.endTag(null, "notificationRingtone");
|
serializer.endTag(null, "notificationRingtone");
|
||||||
@ -631,7 +631,7 @@ public class XmlFileInterface
|
|||||||
{
|
{
|
||||||
String path = readTag(parser, "incomingCallsRingtone");
|
String path = readTag(parser, "incomingCallsRingtone");
|
||||||
if(!path.equals("null"))
|
if(!path.equals("null"))
|
||||||
newProfile.setIncomingCallsRingtone(new File(path));
|
newProfile.setIncomingCallsRingtone(path);
|
||||||
else
|
else
|
||||||
newProfile.setIncomingCallsRingtone(null);
|
newProfile.setIncomingCallsRingtone(null);
|
||||||
}
|
}
|
||||||
@ -643,7 +643,7 @@ public class XmlFileInterface
|
|||||||
{
|
{
|
||||||
String path = readTag(parser, "notificationRingtone");
|
String path = readTag(parser, "notificationRingtone");
|
||||||
if(!path.equals("null"))
|
if(!path.equals("null"))
|
||||||
newProfile.setNotificationRingtone(new File(path));
|
newProfile.setNotificationRingtone(path);
|
||||||
else
|
else
|
||||||
newProfile.setNotificationRingtone(null);
|
newProfile.setNotificationRingtone(null);
|
||||||
}
|
}
|
||||||
|
@ -3,3 +3,4 @@
|
|||||||
* New trigger/action: Set custom variables as actions and check for them in triggers
|
* New trigger/action: Set custom variables as actions and check for them in triggers
|
||||||
* Fixed: Battery receiver could trigger above 100% or below 0%
|
* Fixed: Battery receiver could trigger above 100% or below 0%
|
||||||
* Fixed: Date format when variables are used in texts
|
* Fixed: Date format when variables are used in texts
|
||||||
|
* Fixed: Changing ringtone now works after Android 7.1, but you need to edit the profile for it to apply
|
Loading…
Reference in New Issue
Block a user