/* == This file is part of Tomahawk Player - <http://tomahawk-player.org> === * * Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com> * * Tomahawk 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. * * Tomahawk 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 Tomahawk. If not, see <http://www.gnu.org/licenses/>. */ package org.tomahawk.tomahawk_android.views; import org.tomahawk.libtomahawk.collection.UserCollection; import org.tomahawk.libtomahawk.database.DatabaseHelper; import org.tomahawk.tomahawk_android.R; import org.tomahawk.tomahawk_android.adapters.DirectoryChooserAdapter; import android.content.Context; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; public class DirectoryChooser extends FrameLayout implements StickyListHeadersListView.OnHeaderClickListener { private final static String TAG = DirectoryChooser.class.getSimpleName(); private int mDrillDownCount = 0; private int mLastDrillDownCount = 0; private File mCurrentFolderRoot; private DirectoryChooserAdapter mAdapter; public DirectoryChooser(Context context) { super(context); inflate(getContext(), R.layout.directory_chooser, this); } public DirectoryChooser(Context context, AttributeSet attrs) { super(context, attrs); inflate(getContext(), R.layout.directory_chooser, this); } public interface DirectoryChooserListener { void onDirectoryChecked(File chosenSubFolder, boolean isChecked); void onDirectoryBrowsed(File clickedSubFolder); } public void setup() { mDrillDownCount = 0; ArrayList<String> storageDirs = new ArrayList<>(); storageDirs.addAll(UserCollection.getStorageDirectories()); List<File> mediaDirs = new ArrayList<>(); for (String dir : storageDirs) { File f = new File(dir); if (f.exists()) { mediaDirs.add(f); } } setup(mediaDirs); } public void setup(File currentFolderRoot) { mCurrentFolderRoot = currentFolderRoot; ArrayList<File> folders = new ArrayList<>(); if (mCurrentFolderRoot.listFiles() != null && mCurrentFolderRoot.listFiles().length > 0) { for (File file : mCurrentFolderRoot.listFiles()) { if (file.isDirectory() && !file.isHidden()) { folders.add(file); } } } setup(folders); } public void setup(List<File> folders) { boolean isFirstRoot = mDrillDownCount == 0; ArrayList<DirectoryChooserAdapter.CustomDirectory> dirs = new ArrayList<>(); for (File folder : folders) { DirectoryChooserAdapter.CustomDirectory dir = new DirectoryChooserAdapter.CustomDirectory(); dir.file = folder; try { dir.isWhitelisted = DatabaseHelper.get() .isMediaDirWhiteListed(folder.getCanonicalPath()); dir.isMediaDirComplete = DatabaseHelper.get() .isMediaDirComplete(folder.getCanonicalPath()); } catch (IOException e) { Log.e(TAG, "setup: " + e.getClass() + ": " + e.getLocalizedMessage()); } int position; for (position = 0; position < dirs.size(); position++) { if (dir.file.getName().compareToIgnoreCase(dirs.get(position).file.getName()) < 0) { break; } } dirs.add(position, dir); } if (mAdapter == null) { mAdapter = new DirectoryChooserAdapter(LayoutInflater.from(getContext()), isFirstRoot, dirs, new DirectoryChooserListener() { @Override public void onDirectoryChecked(File chosenSubFolder, boolean isChecked) { try { if (isChecked) { DatabaseHelper.get() .addMediaDir(chosenSubFolder.getCanonicalPath()); } else { DatabaseHelper.get() .removeMediaDir(chosenSubFolder.getCanonicalPath()); } } catch (IOException e) { Log.e(TAG, "onDirectoryChecked: " + e.getClass() + ": " + e.getLocalizedMessage()); } if (mDrillDownCount == 0) { setup(); } else { setup(chosenSubFolder.getParentFile()); } } @Override public void onDirectoryBrowsed(File clickedSubFolder) { for (File file : clickedSubFolder.listFiles()) { if (file.isDirectory()) { mDrillDownCount++; setup(clickedSubFolder); break; } } } }); } else { mAdapter.update(isFirstRoot, dirs); } StickyListHeadersListView listView = (StickyListHeadersListView) findViewById(R.id.listview); listView.setOnHeaderClickListener(this); if (mDrillDownCount == mLastDrillDownCount) { Parcelable listState = listView.getWrappedList().onSaveInstanceState(); listView.setAdapter(mAdapter); listView.getWrappedList().onRestoreInstanceState(listState); } else { listView.setAdapter(mAdapter); } mLastDrillDownCount = mDrillDownCount; } @Override public void onHeaderClick(StickyListHeadersListView l, View header, int itemPosition, long headerId, boolean currentlySticky) { if (mCurrentFolderRoot != null && mCurrentFolderRoot.getParentFile() != null) { mDrillDownCount--; if (mDrillDownCount > 0) { setup(mCurrentFolderRoot.getParentFile()); } else { setup(); } } } }