Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,23 @@ android {
applicationId = "com.prangesoftwaresolutions.audioanchor"
minSdk = 21
targetSdk = 35
versionCode = 31
versionName = "2.4.0"
versionCode = 32
versionName = "2.5.0"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
resValue("string", "app_package_uri",
"package:" + android.defaultConfig.applicationId)
}

debug {
applicationIdSuffix = ".debug"
versionNameSuffix = "-DEBUG"
isDebuggable = true
resValue("string", "app_package_uri",
"package:" + android.defaultConfig.applicationId + applicationIdSuffix)
}
}
compileOptions {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.content.ContentUris;
import android.content.CursorLoader;
import android.content.Loader;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
Expand All @@ -19,6 +20,7 @@
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.preference.PreferenceManager;

import com.nambimobile.widgets.efab.FabOption;
import com.prangesoftwaresolutions.audioanchor.R;
Expand Down Expand Up @@ -135,7 +137,12 @@ public void onDestroyActionMode(ActionMode actionMode) {
}

private void addDirectory(boolean isParentDirectory) {
File baseDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
String baseDirectoryPref = PreferenceManager.getDefaultSharedPreferences(this).getString(
getString(R.string.settings_directory_picker_initial_path_key), getString(R.string.settings_directory_picker_initial_path_default));
File baseDirectory = baseDirectoryPref.isBlank()
? Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
: new File(baseDirectoryPref);

FileDialog fileDialog = new FileDialog(this, baseDirectory, true, null, this);
fileDialog.addDirectoryListener(directory -> {
Directory.Type directoryType = isParentDirectory ? Directory.Type.PARENT_DIR : Directory.Type.SUB_DIR;
Expand All @@ -144,6 +151,12 @@ private void addDirectory(boolean isParentDirectory) {
mSynchronizer.addDirectory(newDirectory);
}
});
fileDialog.addDefaultDirectoryListener(directory -> {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putString(getString(R.string.settings_directory_picker_initial_path_key), directory.getAbsolutePath());
editor.apply();
fileDialog.showDialog();
});
fileDialog.showDialog();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import androidx.annotation.NonNull;
import android.util.Log;
import android.view.View;
Expand Down Expand Up @@ -47,6 +50,7 @@ public interface DirectorySelectedListener {

private final ListenerList<FileSelectedListener> fileListenerList = new ListenerList<>();
private final ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<>();
private final ListenerList<DirectorySelectedListener> defaultDirListenerList = new ListenerList<>();
private final Activity activity;
private final boolean mSelectDirectory;
private String fileEndsWith;
Expand All @@ -56,9 +60,22 @@ public FileDialog(Activity activity, File initialPath, boolean selectDirectory,
this.activity = activity;
setFileEndsWith(fileEndsWith);
mSelectDirectory = selectDirectory;
mContext = context;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
StorageManager storageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
for (StorageVolume v: storageManager.getStorageVolumes()) {
File volumePath = v.getDirectory();
if (volumePath != null && volumePath.canRead()) {
ensureReachabilityOfPath(volumePath);
}
}
} else {
ensureReachabilityOfPath(Environment.getExternalStorageDirectory());
}

if (!initialPath.exists()) initialPath = Environment.getExternalStorageDirectory();
loadFileList(initialPath);
mContext = context;
}

/**
Expand Down Expand Up @@ -86,6 +103,10 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) {
Log.d(TAG, currentPath.getPath());
fireDirectorySelectedEvent(currentPath);
});
builder.setNeutralButton(R.string.dialog_msg_set_default_dir, (dialog1, which) -> {
Log.d(TAG, currentPath.getPath());
fireDefaultDirectorySelectedEvent(currentPath);
});
}
builder.setNegativeButton(R.string.dialog_msg_cancel, (dialog1, which) -> {
if (dialog1 != null) {
Expand Down Expand Up @@ -131,6 +152,14 @@ public void removeDirectoryListener(DirectorySelectedListener listener) {
dirListenerList.remove(listener);
}

public void addDefaultDirectoryListener(DirectorySelectedListener listener) {
defaultDirListenerList.add(listener);
}

public void removeDefaultDirectoryListener(DirectorySelectedListener listener) {
defaultDirListenerList.remove(listener);
}

/**
* Show file dialog
*/
Expand All @@ -146,6 +175,10 @@ private void fireDirectorySelectedEvent(final File directory) {
dirListenerList.fireEvent(listener -> listener.directorySelected(directory));
}

private void fireDefaultDirectorySelectedEvent(final File directory) {
defaultDirListenerList.fireEvent(listener -> listener.directorySelected(directory));
}

private void loadFileList(File path) {
this.currentPath = path;
List<FileSelectorItem> fileList = new ArrayList<>();
Expand Down Expand Up @@ -200,6 +233,20 @@ private File getChosenFile(String fileChosen) {
private void setFileEndsWith(String fileEndsWith) {
this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() : null;
}

private void ensureReachabilityOfPath(File path) {
Log.i("FileDialog.java", "Ensure reachability of " + path);
String filename = path.getName();
File parent = path.getParentFile();
while (parent != null) {
HashSet<String> childDirs = childDirectories.get(parent.getAbsolutePath());
if (childDirs == null) childDirs = new HashSet<>();
childDirs.add(filename);
childDirectories.put(parent.getAbsolutePath(), childDirs);
filename = parent.getName();
parent = parent.getParentFile();
}
}
}

class ListenerList<L> {
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/donttranslate.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@
<string name="settings_notification_backward_button_key" translatable="false">notification_backward_button</string>
<string name="settings_notification_forward_button_key" translatable="false">notification_forward_button</string>
<string name="settings_skip_interval" translatable="false">%d s</string>
<string name="settings_manage_external_storage_key" translatable="false">manage_external_storage</string>
<string name="settings_directory_picker_initial_path_key" translatable="false">directory_picker_initial_path</string>
<string name="settings_directory_picker_initial_path_default" translatable="false" />

<!-- Intent data Strings -->
<string name="album_id" translatable="false">album_id</string>
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@
<string name="settings_notification_backward_button">Notification backward button</string>
<string name="settings_notification_forward_button">Notification forward button</string>
<string name="settings_skip_interval_msg">Skip interval for %s</string>
<string name="settings_manage_external_storage_label">Request \"All files access\"</string>
<string name="settings_directory_picker_initial_path_label">Initial directory picker path</string>


<!-- Layout Texts -->
<string name="title">Title</string>
Expand Down Expand Up @@ -141,7 +144,8 @@
<string name="add_directory">You can select a single directory that contains audio files or a parent directory that contains several directories containing audio files.</string>

<!-- Dialog strings -->
<string name="dialog_msg_select_dir">Select directory</string>
<string name="dialog_msg_select_dir">Select</string>
<string name="dialog_msg_set_default_dir">Set default</string>
<string name="dialog_msg_sleep_timer">Enter the number of minutes for which the player should keep playing</string>
<string name="dialog_msg_ok">OK</string>
<string name="dialog_msg_cancel">Cancel</string>
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/xml-v26/settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,13 @@
android:key="@string/settings_keep_deleted_key"
android:title="@string/settings_keep_deleted_label"
android:singleLineTitle="false" />

<EditTextPreference
android:defaultValue="@string/settings_directory_picker_initial_path_default"
android:key="@string/settings_directory_picker_initial_path_key"
android:title="@string/settings_directory_picker_initial_path_label"
android:singleLine="true"
android:singleLineTitle="false"/>
</PreferenceCategory>

</PreferenceScreen>
Loading