package com.zanehuy.player;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Stack;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.zanehuy.player.R;
import com.zanehuy.player.PlayerService.PlayerBinder;
public class FileBrowserActivity extends Activity {
private ListView fileListView;
private TextView currentDirView;
private File currentDir;
private ArrayList<File> currentFiles;
private ArrayAdapter<File> fileListAdapter;
private Stack<Dir> dirHistory;
private boolean parentAllowed;
private PlayerServiceConnection playerServiceConnection = new PlayerServiceConnection();
private PlayerService playerService = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.file_browser);
SharedPreferences settings = getSharedPreferences("settings", 0);
currentDir = new File(settings.getString("last_dir", Environment.getExternalStorageDirectory().getAbsolutePath()));
currentFiles = new ArrayList<File>();
dirHistory = new Stack<Dir>();
dirHistory.push(new Dir(currentDir.getAbsolutePath(), 0));
currentDirView = (TextView)findViewById(R.id.file_browser_dir);
currentDirView.setSelected(true);
fileListView = (ListView)findViewById(R.id.files_listview);
fileListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
File selectedFile;
if (pos == 0) {
if (parentAllowed) {
selectedFile = currentDir.getParentFile();
} else {
return;
}
} else {
selectedFile = currentFiles.get(pos-1);
}
if (selectedFile.isFile()) {
playerService.addTrack(playerService.new Track(selectedFile.getPath()));
} else {
dirHistory.push(new Dir(currentDir.getAbsolutePath(), pos));
browse(selectedFile);
}
}
});
fileListAdapter = new ArrayAdapter<File>(this, R.layout.file_browser_item, 0) {
@Override
public View getView(final int pos, View convertView, android.view.ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if (v == null) {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.file_browser_item, null);
holder = new ViewHolder();
holder.fileName = (TextView)v.findViewById(R.id.file_browser_file_name);
holder.fileIcon = (ImageView)v.findViewById(R.id.file_browser_file_icon);
v.setTag(holder);
} else {
holder = (ViewHolder)v.getTag();
}
File item = getItem(pos);
holder.fileName.setText(item.getName());
if (!item.isFile()) {
holder.fileIcon.setImageResource(R.drawable.dir);
} else {
holder.fileIcon.setImageResource(R.drawable.file);
}
holder.fileName.setText(item.getName());
return v;
};
};
fileListView.setAdapter(fileListAdapter);
browse(currentDir);
}
@Override
protected void onStart() {
super.onStart();
Intent playerServiceIntent = new Intent(this, PlayerService.class);
getApplicationContext().bindService(playerServiceIntent, playerServiceConnection, 0);
}
@Override
protected void onStop() {
super.onStop();
getApplicationContext().unbindService(playerServiceConnection);
SharedPreferences settings = getSharedPreferences("settings", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("last_dir", currentDir.getAbsolutePath());
editor.commit();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && dirHistory.size() > 1) {
browse(new File(dirHistory.pop().getPath()));
return true;
}
return super.onKeyDown(keyCode, event);
}
private void browse(File dir) {
if (dir.compareTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath())) == 0) {
parentAllowed = false;
} else {
parentAllowed = true;
}
currentFiles.clear();
currentDir = dir;
File[] fileList = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
if ((file.getName().toLowerCase().endsWith("mp3") || file.isDirectory()) && (file.getName()).charAt(0) != '.') {
return true;
}
return false;
}
});
Arrays.sort(fileList, new Comparator<Object>() {
@Override
public int compare(Object file1, Object file2) {
return new String(((File)file1).getName()).compareTo(((File)file2).getName());
}
});
Arrays.sort(fileList, new Comparator<Object>() {
@Override
public int compare(Object file1, Object file2) {
if (((File)file1).isDirectory() && ((File)file2).isFile()) {
return -1;
}
if (!((File)file1).isDirectory() && ((File)file2).isDirectory()) {
return 1;
}
return 0;
}
});
for (File file : fileList) {
currentFiles.add(new File(file.getAbsolutePath()));
}
fileListAdapter.clear();
fileListAdapter.add(new File(".."));
for (File f : currentFiles) {
fileListAdapter.add(f);
}
fileListAdapter.notifyDataSetChanged();
currentDirView.setText(currentDir.getAbsolutePath());
fileListView.setSelection(dirHistory.lastElement().getPos());
}
private class PlayerServiceConnection implements ServiceConnection {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder service) {
PlayerBinder playerBinder = (PlayerBinder)service;
playerService = playerBinder.getService();
}
}
static private class ViewHolder {
TextView fileName;
ImageView fileIcon;
}
private class Dir {
private String path;
private int pos;
public Dir(String path, int pos) {
this.path = path;
this.pos = pos;
}
public String getPath() {
return path;
}
public int getPos() {
return pos;
}
}
}