Continued work on new settings

This commit is contained in:
Jan Christian Grünhage 2017-01-14 16:58:16 +01:00
parent 87a80b4dd7
commit 903a1162e7
Signed by: jcgruenhage
GPG key ID: 321A67D9EE8BC3E1
12 changed files with 144 additions and 58 deletions

View file

@ -37,7 +37,7 @@
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View file

@ -67,14 +67,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@ -83,6 +75,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />

View file

@ -23,7 +23,7 @@
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
<exclude-output />
@ -66,14 +66,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
@ -82,6 +74,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
@ -98,6 +98,7 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/25.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/25.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/transition/25.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.github.paolorotolo/appintro/4.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
@ -126,6 +127,7 @@
<orderEntry type="library" exported="" name="appcompat-v7-25.1.0" level="project" />
<orderEntry type="library" exported="" name="recyclerview-v7-25.1.0" level="project" />
<orderEntry type="library" exported="" name="support-core-utils-25.1.0" level="project" />
<orderEntry type="library" exported="" name="appintro-4.1.0" level="project" />
<orderEntry type="module" module-name="playmusiclib" exported="" />
<orderEntry type="module" module-name="framework" exported="" />
<orderEntry type="library" exported="" name="mp3agic-0.8.4" level="project" />

View file

@ -13,13 +13,13 @@ import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.support.v7.app.ActionBar;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
import re.jcg.playmusicexporter.BuildConfig;
import re.jcg.playmusicexporter.R;
import re.jcg.playmusicexporter.services.ExportAllJob;
import re.jcg.playmusicexporter.services.ExportAllService;
import re.jcg.playmusicexporter.settings.PlayMusicExporterPreferences;
@ -40,6 +40,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
private static final String TAG = "MusicExporter_Settings";
private static final int REQUEST_CODE_OPEN_DOCUMENT_TREE_ALBA_PATH = 0;
private static final int REQUEST_CODE_OPEN_DOCUMENT_TREE_GROUPS_PATH = 1;
private static final int REQUEST_CODE_OPEN_DOCUMENT_TREE_AUTO_PATH = 2;
/**
* A preference value change listener that updates the preference's summary
* to reflect its new value.
@ -129,7 +130,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
// Remove the Debug Fragment
if (!BuildConfig.DEBUG) {
for (int i = 0; i < target.size(); i++) {
if ("Debug".equals(target.get(i).title)){
if ("Debug".equals(target.get(i).title)) {
target.remove(i);
break;
}
@ -214,11 +215,77 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
}
public static class AutomationPreferenceFragment extends PreferenceFragment {
/**
* Little helper method to get the context.
* If the Android version is high enough, the newer {@link PreferenceFragment#getContext()} is used,
* else, the older {@link PreferenceFragment#getActivity()}, since activities are contexts too.
*
* @return The context.
*/
@Override
public Context getContext() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return super.getContext();
} else {
return super.getActivity();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_automation);
setHasOptionsMenu(true);
//Schedules an export with the current settings.
ExportAllJob.scheduleExport(getContext());
setupOnClickListeners();
}
private void setupOnClickListeners() {
findPreference(PlayMusicExporterPreferences.AUTO_EXPORT_PATH).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivityForResult(new Intent("android.intent.action.OPEN_DOCUMENT_TREE"), REQUEST_CODE_OPEN_DOCUMENT_TREE_AUTO_PATH);
return true;
}
});
//For every setting that is used to define the export job, setup a listener that
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_REQUIRE_CHARGING);
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_REQUIRE_UNMETERED);
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_ENABLED);
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_FREQUENCY);
}
private void setupRescheduler(String preference) {
findPreference(preference).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
ExportAllJob.scheduleExport(getContext());
return false;
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
switch (requestCode) {
case REQUEST_CODE_OPEN_DOCUMENT_TREE_AUTO_PATH:
if (resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
PlayMusicExporterPreferences.init(getActivity());
PlayMusicExporterPreferences.setAutoExportPath(treeUri);
getActivity().getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Log.i(TAG, "Selected " + treeUri.toString());
}
break;
default:
Log.i(TAG, "Received activityResult with unknown requestCode");
}
}
@Override

View file

@ -6,7 +6,6 @@ import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import re.jcg.playmusicexporter.settings.PlayMusicExporterPreferences;
@ -15,17 +14,13 @@ public class ExportAllJob extends JobService {
public static final String TAG = "AutoGPME_ExportJob";
/**
* Schedules an export with the current settings
*
* @param pContext
*/
public static void scheduleExport(final Context pContext) {
PlayMusicExporterPreferences.init(pContext);
PlayMusicExporterPreferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.contains("auto")) {
scheduleExport(pContext);
Log.i(TAG, "Preference changed: " + key);
}
}
});
if (PlayMusicExporterPreferences.getAutoExportEnabled()) {
long lInterval = PlayMusicExporterPreferences.getAutoExportFrequency();
boolean lRequireUnmeteredNetwork = PlayMusicExporterPreferences.getAutoExportRequireUnmetered();

View file

@ -67,6 +67,18 @@ public class ExportAllService extends IntentService {
for (MusicTrack lTrack : lAlbum.getMusicTrackList()) {
if (lTrack.isOfflineAvailable()) {
String lPath = MusicPathBuilder.Build(lTrack, lExportStructure);
try {
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Invalid URI:")) {
/*
TODO: Make it impossible to reach this point
This happens when the user has not yet set the export path.
*/
Log.i(TAG, "Automatic export failed, because the URI is invalid.");
} else throw e;
}
if (!isAlreadyThere(lUri, lPath)) {
if (lPlayMusicManager.exportMusicTrack(lTrack, lUri, lPath)) {
Log.i(TAG, "Exported Music Track: " + getStringForTrack(lTrack));

View file

@ -11,33 +11,33 @@ import re.jcg.playmusicexporter.fragments.NavigationDrawerFragment;
public class PlayMusicExporterPreferences {
private static SharedPreferences preferences;
private static final String AUTO_EXPORT_ENABLED = "preference_auto_export_enabled";
private static final boolean AUTO_EXPORT_ENABLED_DEFAULT = false;
private static final String AUTO_EXPORT_USES_DIFFERENT_PATH = "preference_auto_export_use_different_path";
private static final boolean AUTO_EXPORT_USES_DIFFERENT_PATH_DEFAULT = false;
private static final String AUTO_EXPORT_USES_DIFFERENT_STRUCTURE = "preference_auto_export_use_different_structure";
private static final boolean AUTO_EXPORT_USES_DIFFERENT_STRUCTURE_DEFAULT = false;
private static final String AUTO_EXPORT_FREQUENCY = "preference_auto_export_frequency";
private static final String AUTO_EXPORT_FREQUENCY_DEFAULT = "86400000";
public static final String AUTO_EXPORT_ENABLED = "preference_auto_export_enabled";
public static final boolean AUTO_EXPORT_ENABLED_DEFAULT = false;
public static final String AUTO_EXPORT_USES_DIFFERENT_PATH = "preference_auto_export_use_different_path";
public static final boolean AUTO_EXPORT_USES_DIFFERENT_PATH_DEFAULT = false;
public static final String AUTO_EXPORT_USES_DIFFERENT_STRUCTURE = "preference_auto_export_use_different_structure";
public static final boolean AUTO_EXPORT_USES_DIFFERENT_STRUCTURE_DEFAULT = false;
public static final String AUTO_EXPORT_FREQUENCY = "preference_auto_export_frequency";
public static final String AUTO_EXPORT_FREQUENCY_DEFAULT = "86400000";
public static final String AUTO_EXPORT_REQUIRE_CHARGING = "preference_auto_export_require_charging";
public static final String AUTO_EXPORT_REQUIRE_UNMETERED = "preference_auto_export_require_unmetered";
public static final boolean AUTO_EXPORT_REQUIRE_CONDITION_DEFAULT = false;
private static final String AUTO_EXPORT_PATH = "preference_auto_export_path";
public static final String AUTO_EXPORT_PATH = "preference_auto_export_path";
//TODO Split Export Paths in export prefs, this won't work else.
private static final String ALBA_EXPORT_PATH = "preference_alba_export_path";
private static final String GROUPS_EXPORT_PATH = "preference_groups_export_path";
private static final String URI_DEFAULT = Uri.EMPTY.toString();
public static final String ALBA_EXPORT_PATH = "preference_alba_export_path";
public static final String GROUPS_EXPORT_PATH = "preference_groups_export_path";
public static final String URI_DEFAULT = Uri.EMPTY.toString();
private static final String AUTO_EXPORT_STRUCTURE = "preference_auto_export_structure";
private static final String ALBA_EXPORT_STRUCTURE = "preference_alba_export_structure";
private static final String GROUPS_EXPORT_STRUCTURE = "preference_groups_export_structure";
private static final String EXPORT_STRUCTURE_DEFAULT = "{album-artist}/{album}/{disc=CD $}/{no=$$.} {title}.mp3";
public static final String AUTO_EXPORT_STRUCTURE = "preference_auto_export_structure";
public static final String ALBA_EXPORT_STRUCTURE = "preference_alba_export_structure";
public static final String GROUPS_EXPORT_STRUCTURE = "preference_groups_export_structure";
public static final String EXPORT_STRUCTURE_DEFAULT = "{album-artist}/{album}/{disc=CD $}/{no=$$.} {title}.mp3";
private static final String DRAWER_LEARNED = "pref_drawer_learned";
private static final boolean DRAWER_LEARNED_DEFAULT = false;
private static final String DRAWER_SELECTED_TYPE = "pref_drawer_selected_type";
private static final String DRAWER_SELECTED_TYPE_DEFAULT = "Album";
public static final String DRAWER_LEARNED = "pref_drawer_learned";
public static final boolean DRAWER_LEARNED_DEFAULT = false;
public static final String DRAWER_SELECTED_TYPE = "pref_drawer_selected_type";
public static final String DRAWER_SELECTED_TYPE_DEFAULT = "Album";
private PlayMusicExporterPreferences() {
@ -141,4 +141,8 @@ public class PlayMusicExporterPreferences {
public static boolean getAutoExportRequireCharging() {
return preferences.getBoolean(AUTO_EXPORT_REQUIRE_CHARGING, AUTO_EXPORT_REQUIRE_CONDITION_DEFAULT);
}
public static void setAutoExportPath(Uri treeUri) {
preferences.edit().putString(AUTO_EXPORT_PATH, treeUri.toString()).apply();
}
}

View file

@ -73,10 +73,10 @@
<string name="settings_donation_old_summery">Spende an David Schulte via PayPal</string>
<string name="settings_donation_old_title">Unterstützt den ursprünglichen Entwickler</string>
<string name="settings_export_structure_alba">Verzeichnisbaum für Alben</string>
<string name="settings_export_subdirectory_structure_album">Setze den Verzeichnisbaum</string>
<string name="settings_export_structure_alba_dialog_title">Setze den Verzeichnisbaum</string>
<string name="settings_export_subdirectory_structure_album_example">Beispiel: Beatles/Help!/13. Yesterday.mp3</string>
<string name="settings_export_subdirectory_structure_dialog_message">"Nutze / für einen neuen Order. Available Tags: - {album-artist} - {album} - {artist} - {title} - {disc=CD $} - {no=$$.} - {year} - {genre} "</string>
<string name="settings_export_subdirectory_structure_group">Setze den Verzeichnisbaum</string>
<string name="settings_export_structure_groups_dialog_title">Setze den Verzeichnisbaum</string>
<string name="settings_export_subdirectory_structure_group_example">Beispiel: Great Songs/4. Beatles - Yesterday.mp3</string>
<string name="settings_version_number">Versionsnummer</string>
<string name="debug_trigger_export_all_title">Jetzt den ExportAllService starten</string>

View file

@ -85,6 +85,7 @@
<string name="settings_auto_export_different_structure_switch">Use a different subdirectory structure</string>
<string name="settings_auto_export_different_structure_switch_summary">Off means that the automatic export uses the same subdirectory structure as alba.</string>
<string name="settings_auto_export_different_structure">Subdirectory structure</string>
<string name="settings_auto_export_different_structure_dialog_title">Subdirectory structure</string>
<string name="settings_category_export_location">Export Location</string>
<string name="settings_export_path">Export Base Path</string>
@ -93,12 +94,12 @@
<string name="settings_export_path_alba">Export path for alba</string>
<string name="settings_export_structure_alba">Subdirectory structure for albums</string>
<string name="settings_export_subdirectory_structure_album">Set your subdirectory structure</string>
<string name="settings_export_structure_alba_dialog_title">Set your subdirectory structure</string>
<string name="settings_export_subdirectory_structure_album_example">Example: Beatles/Help!/13. Yesterday.mp3</string>
<string name="settings_export_path_groups">Export path for groups</string>
<string name="settings_export_structure_groups">Subdirectory structure for playlists</string>
<string name="settings_export_subdirectory_structure_group">Set your subdirectory structure</string>
<string name="settings_export_structure_groups_dialog_title">Set your subdirectory structure</string>
<string name="settings_export_subdirectory_structure_group_example">Example: Great Songs/4. Beatles - Yesterday.mp3</string>
<string name="settings_export_id3">ID3 Tags</string>

View file

@ -20,8 +20,13 @@
android:key="preference_auto_export_use_different_structure"
android:summary="@string/settings_auto_export_different_structure_switch_summary"
android:title="@string/settings_auto_export_different_structure_switch" />
<Preference
<EditTextPreference
android:defaultValue="@string/settings_export_structure_alba_default_value"
android:dialogMessage="@string/settings_export_subdirectory_structure_dialog_message"
android:dialogTitle="@string/settings_auto_export_different_structure_dialog_title"
android:hint="@string/settings_export_structure_alba_default_value"
android:key="preference_auto_export_structure"
android:summary="@string/settings_export_subdirectory_structure_album_example"
android:title="@string/settings_auto_export_different_structure" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/settings_category_auto_export_conditions">

View file

@ -9,7 +9,7 @@
<EditTextPreference
android:defaultValue="@string/settings_export_structure_alba_default_value"
android:dialogMessage="@string/settings_export_subdirectory_structure_dialog_message"
android:dialogTitle="@string/settings_export_subdirectory_structure_album"
android:dialogTitle="@string/settings_export_structure_alba_dialog_title"
android:hint="@string/settings_export_structure_alba_default_value"
android:key="preference_alba_export_structure"
android:summary="@string/settings_export_subdirectory_structure_album_example"
@ -25,7 +25,7 @@
<EditTextPreference
android:defaultValue="@string/settings_export_structure_groups_default_value"
android:dialogMessage="@string/settings_export_subdirectory_structure_dialog_message"
android:dialogTitle="@string/settings_export_subdirectory_structure_group"
android:dialogTitle="@string/settings_export_structure_groups_dialog_title"
android:hint="@string/settings_export_structure_groups_default_value"
android:key="preference_groups_export_structure"
android:summary="@string/settings_export_subdirectory_structure_group_example"

View file

@ -538,7 +538,7 @@ public class PlayMusicManager {
// Creates the subdirectories
String[] directories = path.split("\\/");
for(int i=0; i<directories.length - 1; i++) {
String directoryName = directories[i];
String directoryName = directories[i];
boolean found = false;
// Search all sub elements