4 Commits

10 changed files with 98 additions and 72 deletions

View File

@ -49,7 +49,7 @@ android {
{ {
dimension "version" dimension "version"
// applicationIdSuffix ".fdroid" // applicationIdSuffix ".fdroid"
versionNameSuffix "-fdroid" // versionNameSuffix "-fdroid"
targetSdkVersion 28 targetSdkVersion 28
} }

View File

@ -53,11 +53,11 @@ public class ActivityMainPoi extends ActivityGeneric
@Override @Override
public void onClick(View v) public void onClick(View v)
{ {
if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, ActivityMainPoi.this)) // if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, ActivityMainPoi.this))
{ // {
Toast.makeText(ActivityMainPoi.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show(); // Toast.makeText(ActivityMainPoi.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show();
return; // return;
} // }
if(!ActivityPermissions.havePermission(ActivityPermissions.permissionNameLocationCoarse, ActivityMainPoi.this) || !ActivityPermissions.havePermission(ActivityPermissions.permissionNameLocationFine, ActivityMainPoi.this)) if(!ActivityPermissions.havePermission(ActivityPermissions.permissionNameLocationCoarse, ActivityMainPoi.this) || !ActivityPermissions.havePermission(ActivityPermissions.permissionNameLocationFine, ActivityMainPoi.this))
{ {

View File

@ -50,11 +50,11 @@ public class ActivityMainProfiles extends ActivityGeneric
@Override @Override
public void onClick(View v) public void onClick(View v)
{ {
if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, ActivityMainProfiles.this)) // if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, ActivityMainProfiles.this))
{ // {
Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show(); // Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show();
return; // return;
} // }
profileToEdit = null; profileToEdit = null;
Intent manageSpecificProfileIntent = new Intent (ActivityMainProfiles.this, ActivityManageProfile.class); Intent manageSpecificProfileIntent = new Intent (ActivityMainProfiles.this, ActivityManageProfile.class);

View File

@ -52,11 +52,11 @@ public class ActivityMainRules extends ActivityGeneric
@Override @Override
public void onClick(View v) public void onClick(View v)
{ {
if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, ActivityMainRules.this)) // if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, ActivityMainRules.this))
{ // {
Toast.makeText(ActivityMainRules.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show(); // Toast.makeText(ActivityMainRules.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show();
return; // return;
} // }
ruleToEdit = null; ruleToEdit = null;
Intent startAddRuleIntent = new Intent(ActivityMainRules.this, ActivityManageRule.class); Intent startAddRuleIntent = new Intent(ActivityMainRules.this, ActivityManageRule.class);

View File

@ -281,8 +281,8 @@ public class ActivityPermissions extends Activity
addToArrayListUnique("android.permission.RECEIVE_BOOT_COMPLETED", requiredPermissions); addToArrayListUnique("android.permission.RECEIVE_BOOT_COMPLETED", requiredPermissions);
*/ */
if (!havePermission("android.permission.WRITE_EXTERNAL_STORAGE", workingContext)) // if (!havePermission(ActivityPermissions.writeExternalStoragePermissionName, workingContext))
addToArrayListUnique("android.permission.WRITE_EXTERNAL_STORAGE", requiredPermissions); // addToArrayListUnique(ActivityPermissions.writeExternalStoragePermissionName, requiredPermissions);
for(Profile profile : Profile.getProfileCollection()) for(Profile profile : Profile.getProfileCollection())
{ {

View File

@ -106,17 +106,17 @@ public class AutomationService extends Service implements OnInitListener
public boolean checkStartupRequirements(Context context, boolean startAtBoot) public boolean checkStartupRequirements(Context context, boolean startAtBoot)
{ {
if (!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, AutomationService.this)) // if (!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, AutomationService.this))
{ // {
/* // /*
Don't have permission to access external storage. This is a show stopper as // Don't have permission to access external storage. This is a show stopper as
the configuration file is stored on external storage. // the configuration file is stored on external storage.
*/ // */
Miscellaneous.logEvent("e", "Permission", "Don't have permission to access external storage. Will request it now.", 4); // Miscellaneous.logEvent("e", "Permission", "Don't have permission to access external storage. Will request it now.", 4);
// Toast.makeText(AutomationService.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show(); //// Toast.makeText(AutomationService.this, getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show();
ActivityPermissions.requestSpecificPermission(ActivityPermissions.writeExternalStoragePermissionName); // ActivityPermissions.requestSpecificPermission(ActivityPermissions.writeExternalStoragePermissionName);
return false; // return false;
} // }
if(Build.VERSION.SDK_INT >= 28) if(Build.VERSION.SDK_INT >= 28)
{ {

View File

@ -313,45 +313,64 @@ public class Miscellaneous extends Service
{ {
if(writeableFolderStringCache == null) if(writeableFolderStringCache == null)
{ {
String testPath = null; // Use the app-specific folder as new default.
File folder = null; writeableFolderStringCache = Miscellaneous.getAnyContext().getFilesDir().getAbsolutePath();
try File newConfigFile = new File(writeableFolderStringCache + "/" + XmlFileInterface.settingsFileName);
migration:
if (!newConfigFile.exists())
{ {
String[] foldersToTestArray = new String[] if (ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, Miscellaneous.getAnyContext()))
{
Environment.getExternalStorageDirectory().getAbsolutePath(),
"/storage/emulated/0",
"/HWUserData",
"/mnt/sdcard"
};
for(String f : foldersToTestArray)
{ {
if (testFolder(f)) // We have the storage permission, probably because it's an old installation. Files should be migrated to app-specific folder.
String testPath = null;
File folder = null;
try
{ {
String pathToUse = f + "/" + Settings.folderName; String[] foldersToTestArray = new String[]
Miscellaneous.logEvent("i", "Path", "Using " + pathToUse + " to store settings and log.", 2); {
Environment.getExternalStorageDirectory().getAbsolutePath(),
"/storage/emulated/0",
"/HWUserData",
"/mnt/sdcard"
};
for (String f : foldersToTestArray)
{
if (testFolder(f))
{
String pathToUse = f + "/" + Settings.folderName;
// Toast.makeText(getAnyContext(), "Using " + pathToUse + " to store settings and log.", Toast.LENGTH_LONG).show(); // Toast.makeText(getAnyContext(), "Using " + pathToUse + " to store settings and log.", Toast.LENGTH_LONG).show();
return pathToUse; // Migrate existing files
File oldDirectory = new File(pathToUse);
File newDirectory = new File(writeableFolderStringCache);
File oldConfigFilePath = new File(pathToUse + "/" + XmlFileInterface.settingsFileName);
if (oldConfigFilePath.exists() && oldConfigFilePath.canWrite())
{
Miscellaneous.logEvent("i", "Path", "Found old path " + pathToUse + " for settings and logs. Migrating old files to new directory.", 2);
for (File moveFile : oldDirectory.listFiles())
moveFile.renameTo(newDirectory);
String message = String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.filesHaveBeenMovedTo), newDirectory.getAbsolutePath());
Miscellaneous.writeStringToFile(oldDirectory.getAbsolutePath() + "readme.txt", message);
break migration;
}
}
}
} catch (Exception e)
{
Log.w("getWritableFolder", folder + " not writable.");
} }
else
Miscellaneous.logEvent("e", "getWritableFolder", folder.getAbsolutePath() + " does not exist and could not be created.", 3);
} }
} }
catch(Exception e)
{
Log.w("getWritableFolder", folder + " not writable.");
}
// do not change to logEvent() - we can't write
Toast.makeText(getAnyContext(), "No writable folder could be found.", Toast.LENGTH_LONG).show();
Log.e("getWritableFolder", "No writable folder could be found.");
return null;
} }
else
return writeableFolderStringCache; return writeableFolderStringCache;
} }
protected final static String logFileName = "Automation_logfile.txt"; protected final static String logFileName = "Automation_logfile.txt";

View File

@ -107,7 +107,7 @@ public class Settings implements SharedPreferences
protected static final boolean default_privacyLocationing = false; protected static final boolean default_privacyLocationing = false;
protected static final int default_startScreen = 0; protected static final int default_startScreen = 0;
protected static final boolean default_executeRulesAndProfilesWithSingleClick = false; protected static final boolean default_executeRulesAndProfilesWithSingleClick = false;
protected static final boolean default_displayNewsOnMainScreen = true; protected static final boolean default_displayNewsOnMainScreen = false;
protected static final boolean default_lockSoundChanges = false; protected static final boolean default_lockSoundChanges = false;
protected static final long default_lastNewsPolltime = -1; protected static final long default_lastNewsPolltime = -1;

View File

@ -25,7 +25,8 @@ import java.util.Collections;
public class XmlFileInterface public class XmlFileInterface
{ {
public static File settingsFile = new File(Miscellaneous.getWriteableFolder() + "/Automation_settings.xml"); public static String settingsFileName = "Automation_settings.xml";
public static File settingsFile = new File(Miscellaneous.getWriteableFolder() + "/" + settingsFileName);
public static Context context; public static Context context;
protected static final String encryptionKey = "Y1vsP12L2S3NkTJbDOR4bQ6i02hsoo"; protected static final String encryptionKey = "Y1vsP12L2S3NkTJbDOR4bQ6i02hsoo";
@ -344,17 +345,22 @@ public class XmlFileInterface
public static void readFile() throws FileNotFoundException public static void readFile() throws FileNotFoundException
{ {
if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, Miscellaneous.getAnyContext())) /*
{ Storage location has been moved to app-specific folder in Android/data
/* Hence this permission is not requested any more. If it is already granted we assume the files are on /sdcard or similar.
Don't have permission to access external storage. This is a show stopper as Migration to app-specific folder has yet to be implemented.
the configuration file is stored on external storage. */
*/ // if(!ActivityPermissions.havePermission(ActivityPermissions.writeExternalStoragePermissionName, Miscellaneous.getAnyContext()))
Miscellaneous.logEvent("e", "Permission", "Don't have permission to access external storage. Will request it now.", 4); // {
Toast.makeText(Miscellaneous.getAnyContext(), Miscellaneous.getAnyContext().getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show(); // /*
ActivityPermissions.requestSpecificPermission(ActivityPermissions.writeExternalStoragePermissionName); // Don't have permission to access external storage. This is a show stopper as
return; // the configuration file is stored on external storage.
} // */
// Miscellaneous.logEvent("e", "Permission", "Don't have permission to access external storage. Will request it now.", 4);
// Toast.makeText(Miscellaneous.getAnyContext(), Miscellaneous.getAnyContext().getResources().getString(R.string.appRequiresPermissiontoAccessExternalStorage), Toast.LENGTH_LONG).show();
// ActivityPermissions.requestSpecificPermission(ActivityPermissions.writeExternalStoragePermissionName);
// return;
// }
/* /*
If we are here it may be that we just got permission to read storage. We need to check for the If we are here it may be that we just got permission to read storage. We need to check for the

View File

@ -605,4 +605,5 @@
<string name="publishedOn">published on</string> <string name="publishedOn">published on</string>
<string name="displayNewsOnMainScreen">Display application news on main screen</string> <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="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. The existing ones have been moved. You can find them here: %s.</string>
</resources> </resources>