package com.aiyou.bbs.fileselect;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import com.aiyou.R;
import com.aiyou.utils.AiYouManager;
import com.aiyou.utils.SwitchManager;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Environment;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class DirectoryChooserView extends LinearLayout {
private TextView mDirTextView;
private Button mLastDirButton;
private ListView mListView;
private Context mContext;
private String mSDCardDir;
private String mDir = "";
private ArrayList<String> mSubDirsList;
private ChosenDirectoryListener mChosenDirListener;
private ArrayAdapter<String> mListAdapter;
private SwitchManager mSwitchMgr;
public DirectoryChooserView(Context context) {
super(context);
init(context);
}
public DirectoryChooserView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public DirectoryChooserView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public void setChosenDirectoryListener(ChosenDirectoryListener listener) {
mChosenDirListener = listener;
}
public void chooseDirectory() {
chooseDirectory(mSDCardDir);
}
public void chooseDirectory(String dir) {
setVisibility(View.VISIBLE);
File dirFile = new File(dir);
if (!dirFile.exists() || !dirFile.isDirectory()) {
dir = mSDCardDir;
}
mDir = dir;
mSubDirsList = getDirectories(dir);
mListAdapter = createListAdapter(mSubDirsList);
mListView.setAdapter(mListAdapter);
updateDirectory();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && getVisibility() == View.VISIBLE) {
setVisibility(View.GONE);
return true;
}
return super.onKeyDown(keyCode, event);
}
private void init(Context context) {
mContext = context;
mSwitchMgr = SwitchManager.getInstance(mContext);
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.directory_chooser_view, this);
mDirTextView = (TextView) view.findViewById(R.id.directory_chooser_view_tv);
mLastDirButton = (Button) view.findViewById(R.id.directory_chooser_view_bt);
mListView = (ListView) view.findViewById(R.id.directory_chooser_view_lv);
mLastDirButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!mDir.equals(mSDCardDir)) {
// Navigate back to an upper directory
mDir = new File(mDir).getParent();
updateDirectory();
}
}
});
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mDir += "/" + mSubDirsList.get(position);
File file = new File(mDir);
if (file.isDirectory()) {
updateDirectory();
} else {
if (mChosenDirListener != null) {
mChosenDirListener.onChosenDir(mDir);
}
setVisibility(View.GONE);
}
}
});
mSDCardDir = Environment.getExternalStorageDirectory()
.getAbsolutePath();
}
private ArrayList<String> getDirectories(String dir) {
ArrayList<String> dirs = new ArrayList<>();
try {
File dirFile = new File(dir);
if (!dirFile.exists() || !dirFile.isDirectory()) {
return dirs;
}
String fileName;
for (File file : dirFile.listFiles()) {
fileName = file.getName();
if (!fileName.startsWith(".")) {// 不显示隐藏文件
dirs.add(fileName);
}
}
} catch (Exception e) {
e.printStackTrace();
}
Collections.sort(dirs, new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
return dirs;
}
private void updateDirectory() {
mSubDirsList.clear();
mSubDirsList.addAll(getDirectories(mDir));
mDirTextView.setText(mDir);
mListAdapter.notifyDataSetChanged();
}
private ArrayAdapter<String> createListAdapter(final ArrayList<String> items) {
return new ArrayAdapter<String>(mContext,
android.R.layout.select_dialog_item, android.R.id.text1, items) {
@SuppressWarnings("deprecation")
@SuppressLint("DefaultLocale")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (v instanceof TextView) {
TextView tv = (TextView) v;
tv.setTextSize(15);
if (mSwitchMgr.isNightModeEnabled()) {
tv.setTextColor(Color.GRAY);
} else {
tv.setTextColor(Color.BLACK);
}
String path = mDir + "/"
+ items.get(position).toLowerCase();
File file = new File(path);
int id = R.drawable.file_folder;
if (!file.isDirectory()) {
if (path.endsWith(".ppt") || path.endsWith(".pptx")) {
id = R.drawable.file_ppt;
} else if (path.endsWith(".doc")
|| path.endsWith(".docx")) {
id = R.drawable.file_word;
} else if (path.endsWith(".xls")
|| path.endsWith(".xlsx")) {
id = R.drawable.file_xls;
} else if (path.endsWith(".pdf")) {
id = R.drawable.file_pdf;
} else if (path.endsWith(".bmp")
|| path.endsWith(".jpg")
|| path.endsWith(".png")
|| path.endsWith(".gif")
|| path.endsWith(".jpeg")) {
id = R.drawable.file_img;
} else if (path.endsWith(".mp4")
|| path.endsWith(".mov")
|| path.endsWith(".avi")
|| path.endsWith(".wmv")
|| path.endsWith(".mkv")
|| path.endsWith(".flv")
|| path.endsWith(".3gp")
|| path.endsWith(".rmvb")
|| path.endsWith(".mpeg")) {
id = R.drawable.file_vedio;
} else if (path.endsWith(".mp3")
|| path.endsWith(".wav")
|| path.endsWith(".wma")
|| path.endsWith(".amr")
|| path.endsWith(".ogg")) {
id = R.drawable.file_music;
} else if (path.endsWith(".txt")) {
id = R.drawable.file_txt;
} else if (path.endsWith(".zip")
|| path.endsWith(".rar")) {
id = R.drawable.file_zip;
} else {
id = R.drawable.file_file;
}
}
Drawable drawable = null;
if (id == R.drawable.file_img) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bmp;
BitmapFactory.decodeFile(path, options);
int scalew = (int) ((float) options.outWidth / AiYouManager.getInstance(getContext()).dip2px(40));
int scaleh = (int) ((float) options.outHeight / AiYouManager.getInstance(getContext()).dip2px(40));
options.inSampleSize = Math.max(scalew, scaleh) + 1;
// 获取图像
options.inJustDecodeBounds = false;
options.inInputShareable = true;
options.inPurgeable = true;
bmp = BitmapFactory.decodeFile(path, options);
if (bmp != null) {
drawable = new BitmapDrawable(bmp);
}
}
if (drawable == null) {
drawable = mContext.getResources().getDrawable(id);
}
if (drawable != null) {
drawable.setBounds(0, 0, AiYouManager.getInstance(getContext()).dip2px(40),
AiYouManager.getInstance(getContext()).dip2px(40));
if (mSwitchMgr.isNightModeEnabled()) {
drawable.setColorFilter(Color.GRAY, Mode.MULTIPLY);
}
}
tv.setCompoundDrawables(drawable, null, null, null);
tv.setEllipsize(null);
}
return v;
}
};
}
public interface ChosenDirectoryListener {
void onChosenDir(String chosenDir);
}
}