de.qspool.clementineremote.ui.settings.DefaultDirChooser.java Source code

Java tutorial

Introduction

Here is the source code for de.qspool.clementineremote.ui.settings.DefaultDirChooser.java

Source

/* This file is part of the Android Clementine Remote.
 * Copyright (C) 2013, Andreas Muttscheller <asfa194@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package de.qspool.clementineremote.ui.settings;

import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Environment;
import android.support.v4.content.ContextCompat;

import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import de.qspool.clementineremote.R;

public class DefaultDirChooser {

    private Context mContext;

    private LinkedList<DirectorySelectedListener> dirListenerList = new LinkedList<>();

    public DefaultDirChooser(Context context) {
        mContext = context;
    }

    public void showAvailableDirectories() {
        final AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);

        dialog.setTitle(R.string.file_dialog_set_dir);
        final List<String> directories = getDirectories();
        dialog.setItems(directories.toArray(new CharSequence[directories.size()]),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        fireDirectorySelectedEvent(directories.get(which));
                    }
                });

        dialog.show();
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private LinkedList<String> getDirectories() {
        LinkedList<String> directories = new LinkedList<>();

        File[] defaultDirs = ContextCompat.getExternalFilesDirs(mContext, Environment.DIRECTORY_MUSIC);
        for (File f : defaultDirs) {
            if (f != null)
                directories.add(f.toString());
        }

        String publicMusicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
                .toString();
        if (canWriteToExternalStorage(publicMusicDir)) {
            directories.add(publicMusicDir);
        }

        if (canWriteToExternalStorage(Environment.getExternalStorageDirectory().getAbsolutePath())) {
            directories.add(mContext.getString(R.string.file_dialog_custom_paths_available));
        }
        return directories;
    }

    private boolean canWriteToExternalStorage(String path) {
        // Check the external store state
        File checkFile = new File(path, "/ClementineTestFile.CheckIfWritable");
        try {
            if (checkFile.createNewFile()) {
                checkFile.delete();
            }
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    public void addDirectoryListener(DirectorySelectedListener listener) {
        dirListenerList.add(listener);
    }

    private void fireDirectorySelectedEvent(final String directory) {
        for (DirectorySelectedListener l : dirListenerList) {
            l.directorySelected(directory);
        }
    }

    public interface DirectorySelectedListener {

        void directorySelected(String dir);
    }
}