/**
* Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com).
*
* 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.rincliu.library.widget;
import java.io.File;
import java.util.ArrayList;
import com.rincliu.library.util.RLUiUtil;
import com.rincliu.library.R;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
public class RLFileExplorer extends ViewGroup implements OnItemClickListener {
private ListView lv = null;
private String currentPath;
private String homePath;
private ArrayList<Item> list = new ArrayList<Item>();
private Context context;
private Listener listener;
private int textColor = Color.BLACK;
/**
* @param context
*/
public RLFileExplorer(Context context) {
super(context);
init(context, null);
}
/**
* @param context
* @param attrs
*/
public RLFileExplorer(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, heightMeasureSpec);
}
}
private void init(final Context context, AttributeSet attrs) {
this.context = context;
View rootView = LayoutInflater.from(context).inflate(R.layout.file_explorer, null);
lv = (ListView) rootView.findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.file_explorer_item, null);
Item item = list.get(position);
ImageView iv = (ImageView) convertView.findViewById(R.id.iv);
iv.setImageResource(item.getIcon());
TextView tv = (TextView) convertView.findViewById(R.id.tv);
tv.setTextColor(textColor);
tv.setText(item.getName());
return convertView;
}
});
lv.setOnItemClickListener(this);
this.addView(rootView);
}
private void refresh(String path) {
File[] files = new File(path).listFiles();
ArrayList<Item> tempList = new ArrayList<Item>(files.length);
Item parent = new Item();
parent.setIcon(R.drawable.icon_explorer_folder);
parent.setName("..");
tempList.add(parent);
for (File file : files) {
Item item = new Item();
if (file.isDirectory()) {
item.setIcon(R.drawable.icon_explorer_folder);
} else {
item.setIcon(R.drawable.icon_explorer_file);
}
item.setName(file.getName());
item.setPath(file.getPath());
tempList.add(item);
}
if (!list.isEmpty()) {
list.clear();
}
list.addAll(tempList);
lv.setSelection(0);
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
if (position == 0) {
File fileParent = new File(currentPath).getParentFile();
if (!currentPath.equals(homePath)) {
currentPath = fileParent.getAbsolutePath();
if (listener != null) {
listener.onPathChanged(currentPath);
}
refresh(currentPath);
}
} else {
String pathx = list.get(position).getPath();
File file = new File(pathx);
if (file.canRead()) {
if (file.isDirectory()) {
currentPath = pathx;
if (listener != null) {
listener.onPathChanged(currentPath);
}
refresh(currentPath);
} else {
if (listener != null) {
listener.onFileSelected(pathx);
}
}
} else {
RLUiUtil.toast(context, R.string.cannot_access_file);
}
}
}
/**
*
*/
public interface Listener {
public void onPathChanged(String path);
public void onFileSelected(String file);
}
/**
* @param listener
*/
public void setListener(Listener listener) {
this.listener = listener;
}
/**
* @param color
*/
public void setTextColor(int color) {
this.textColor = color;
}
public void openPath(String path) {
homePath = path;
currentPath = path;
refresh(currentPath);
}
private class Item {
private int icon;
private String name;
private String path;
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
}