/*
* Copyright (C) 2014 Saravan Pantham
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.aniruddhc.acemusic.player.MusicFoldersSelectionFragment;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.aniruddhc.acemusic.player.R;
import com.aniruddhc.acemusic.player.DBHelpers.DBAccessHelper;
import com.aniruddhc.acemusic.player.Helpers.TypefaceHelper;
import com.aniruddhc.acemusic.player.Helpers.UIElementsHelper;
import com.aniruddhc.acemusic.player.Utils.Common;
public class MusicFoldersSelectionFragment extends Fragment {
private Context mContext;
private Common mApp;
private boolean mWelcomeSetup = false;
private RelativeLayout mUpLayout;
private ImageView mUpIcon;
private TextView mUpText;
private TextView mCurrentFolderText;
private ListView mFoldersListView;
private Cursor mCursor;
private String mRootDir;
private String mCurrentDir;
private List<String> mFileFolderNamesList;
private List<String> mFileFolderPathsList;
private List<String> mFileFolderSizesList;
private HashMap<String, Boolean> mMusicFolders;
private static boolean CALLED_FROM_WELCOME = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = getActivity().getApplicationContext();
mApp = (Common) mContext;
View rootView = getActivity().getLayoutInflater().inflate(R.layout.fragment_folders_selection, null);
mMusicFolders = new HashMap<String, Boolean>();
mFoldersListView = (ListView) rootView.findViewById(R.id.folders_list_view);
mFoldersListView.setFastScrollEnabled(true);
mWelcomeSetup = getArguments().getBoolean("com.aniruddhc.acemusic.player.WELCOME");
mUpLayout = (RelativeLayout) rootView.findViewById(R.id.folders_up_layout);
mUpIcon = (ImageView) rootView.findViewById(R.id.folders_up_icon);
mUpText = (TextView) rootView.findViewById(R.id.folders_up_text);
mCurrentFolderText = (TextView) rootView.findViewById(R.id.folders_current_directory_text);
mUpText.setTypeface(TypefaceHelper.getTypeface(mContext, "Roboto-Regular"));
mCurrentFolderText.setTypeface(TypefaceHelper.getTypeface(mContext, "Roboto-Regular"));
mUpLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
getDir(new File(mCurrentDir).getParentFile().getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
});
if (mWelcomeSetup) {
mFoldersListView.setDivider(getResources().getDrawable(R.drawable.icon_list_divider_light));
mUpIcon.setImageResource(R.drawable.up);
} else {
mUpIcon.setImageResource(UIElementsHelper.getIcon(mContext, "up"));
if (mApp.getCurrentTheme()==Common.DARK_THEME) {
mUpIcon.setImageResource(R.drawable.icon_list_divider_light);
} else {
mUpIcon.setImageResource(R.drawable.icon_list_divider);
}
}
mFoldersListView.setDividerHeight(1);
mRootDir = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
mCurrentDir = mRootDir;
//Get a mCursor with a list of all the current folder paths (will be empty if this is the first run).
mCursor = mApp.getDBAccessHelper().getAllMusicFolderPaths();
//Get a list of all the paths that are currently stored in the DB.
for (int i=0; i < mCursor.getCount(); i++) {
mCursor.moveToPosition(i);
//Filter out any double slashes.
String path = mCursor.getString(mCursor.getColumnIndex(DBAccessHelper.FOLDER_PATH));
if (path.contains("//")) {
path.replace("//", "/");
}
mMusicFolders.put(path, true);
}
//Close the cursor.
if (mCursor!=null)
mCursor.close();
//Get the folder hierarchy of the selected folder.
getDir(mRootDir);
mFoldersListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int index, long arg3) {
String newPath = mFileFolderPathsList.get(index);
getDir(newPath);
}
});
return rootView;
}
/**
* Sets the current directory's text.
*/
private void setCurrentDirText() {
mCurrentFolderText.setText(mCurrentDir);
}
/**
* Retrieves the folder hierarchy for the specified folder
* (this method is NOT recursive and doesn't go into the parent
* folder's subfolders.
*/
private void getDir(String dirPath) {
mFileFolderNamesList = new ArrayList<String>();
mFileFolderPathsList = new ArrayList<String>();
mFileFolderSizesList = new ArrayList<String>();
File f = new File(dirPath);
File[] files = f.listFiles();
Arrays.sort(files);
if (files!=null) {
for(int i=0; i < files.length; i++) {
File file = files[i];
if(!file.isHidden() && file.canRead()) {
if (file.isDirectory()) {
/*
* Starting with Android 4.2, /storage/emulated/legacy/...
* is a symlink that points to the actual directory where
* the user's files are stored. We need to detect the
* actual directory's file path here.
*/
String filePath;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
filePath = getRealFilePath(file.getAbsolutePath());
else
filePath = file.getAbsolutePath();
mFileFolderPathsList.add(filePath);
mFileFolderNamesList.add(file.getName());
File[] listOfFiles = file.listFiles();
if (listOfFiles!=null) {
if (listOfFiles.length==1) {
mFileFolderSizesList.add("" + listOfFiles.length + " item");
} else {
mFileFolderSizesList.add("" + listOfFiles.length + " items");
}
}
}
}
}
}
boolean dirChecked = false;
if (getMusicFoldersHashMap().get(dirPath)!=null)
dirChecked = getMusicFoldersHashMap().get(dirPath);
MultiselectListViewAdapter mFoldersListViewAdapter = new MultiselectListViewAdapter(getActivity(),
this,
mWelcomeSetup,
dirChecked);
mFoldersListView.setAdapter(mFoldersListViewAdapter);
mFoldersListViewAdapter.notifyDataSetChanged();
mCurrentDir = dirPath;
setCurrentDirText();
}
/**
* Resolves the /storage/emulated/legacy paths to
* their true folder path representations. Required
* for Nexuses and other devices with no SD card.
*/
@SuppressLint("SdCardPath")
private String getRealFilePath(String filePath) {
if (filePath.equals("/storage/emulated/0") ||
filePath.equals("/storage/emulated/0/") ||
filePath.equals("/storage/emulated/legacy") ||
filePath.equals("/storage/emulated/legacy/") ||
filePath.equals("/storage/sdcard0") ||
filePath.equals("/storage/sdcard0/") ||
filePath.equals("/sdcard") ||
filePath.equals("/sdcard/") ||
filePath.equals("/mnt/sdcard") ||
filePath.equals("/mnt/sdcard/")) {
return Environment.getExternalStorageDirectory().toString();
}
return filePath;
}
@Override
public void onDestroy() {
super.onDestroy();
if (CALLED_FROM_WELCOME==false) {
getActivity().finish();
}
}
@Override
public void onPause() {
super.onPause();
if (CALLED_FROM_WELCOME==false) {
getActivity().finish();
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (isRemoving()) {
mCursor.close();
mCursor = null;
}
}
/*
* Getter methods.
*/
public HashMap<String, Boolean> getMusicFoldersHashMap() {
return mMusicFolders;
}
public ArrayList<String> getMusicFolderPaths() {
return new ArrayList<String>(mMusicFolders.keySet());
}
public List<String> getFileFolderNamesList() {
return mFileFolderNamesList;
}
public List<String> getFileFolderSizesList() {
return mFileFolderSizesList;
}
public List<String> getFileFolderPathsList() {
return mFileFolderPathsList;
}
}