@Override public View getView(int position, View convertView, ViewGroup parent) { DirectoryAdapter.Node selectedNode = mCurrentNode.children.get(position); DirectoryViewHolder holder; View v = convertView; Context context = VLCApplication.getAppContext(); /* If view not created */ if (v == null) { v = mInflater.inflate(R.layout.directory_view_item, parent, false); holder = new DirectoryViewHolder(); holder.layout = v.findViewById(R.id.layout_item); holder.title = (TextView) v.findViewById(R.id.title); holder.text = (TextView) v.findViewById(R.id.text); holder.icon = (ImageView) v.findViewById(R.id.dvi_icon); v.setTag(holder); } else holder = (DirectoryViewHolder) v.getTag(); Util.setItemBackground(holder.layout, position); String holderText = ""; if (selectedNode.isFile()) { Log.d(TAG, "Loading media " + selectedNode.name); Media m = new Media(getMediaLocation(position), false); holder.title.setText(m.getTitle()); holderText = m.getSubtitle(); } else holder.title.setText(selectedNode.getVisibleName()); if (selectedNode.name == "..") holderText = context.getString(R.string.parent_folder); else if (!selectedNode.isFile()) { int folderCount = selectedNode.subfolderCount(); int mediaFileCount = selectedNode.subfilesCount(); holderText = ""; if (folderCount > 0) holderText += context .getResources() .getQuantityString(R.plurals.subfolders_quantity, folderCount, folderCount); if (folderCount > 0 && mediaFileCount > 0) holderText += ", "; if (mediaFileCount > 0) holderText += context .getResources() .getQuantityString(R.plurals.mediafiles_quantity, mediaFileCount, mediaFileCount); } holder.text.setText(holderText); if (selectedNode.isFile()) holder.icon.setImageResource(R.drawable.icon); else holder.icon.setImageResource(R.drawable.ic_folder); return v; }
public int subfilesCount() { int c = 0; for (DirectoryAdapter.Node n : this.children) { if (n.isFile() == true) c++; } return c; }
public int subfolderCount() { int c = 0; for (DirectoryAdapter.Node n : this.children) { if (n.isFile() == false && n.name != "..") c++; } return c; }
public boolean isChildFile(int position) { DirectoryAdapter.Node selectedNode = mCurrentNode.children.get(position); return selectedNode.isFile(); }
public boolean browse(int position) { DirectoryAdapter.Node selectedNode = mCurrentNode.children.get(position); if (selectedNode.isFile()) return false; return browse(selectedNode.name); }
/** * @param n Node to populate * @param path Path to populate * @param depth Depth of iteration (0 = 1st level of nesting, 1 = 2 level of nesting, etc) */ private void populateNode(DirectoryAdapter.Node n, String path, int depth) { if (path == null) { // We're on the storage list String storages[] = Util.getMediaDirectories(); for (String storage : storages) { File f = new File(storage); DirectoryAdapter.Node child = new DirectoryAdapter.Node(f.getName(), getVisibleName(f)); child.isFile = false; this.populateNode(child, storage, 0); n.addChildNode(child); } return; } File file = new File(path); if (!file.exists() || !file.isDirectory()) return; ArrayList<String> files = new ArrayList<String>(); LibVLC.nativeReadDirectory(path, files); StringBuilder sb = new StringBuilder(100); /* If no sub-directories or I/O error don't crash */ if (files == null || files.size() < 1) { // return } else { for (int i = 0; i < files.size(); i++) { String filename = files.get(i); /* Avoid infinite loop */ if (filename.equals(".") || filename.equals("..") || filename.startsWith(".")) continue; DirectoryAdapter.Node nss = new DirectoryAdapter.Node(filename); nss.isFile = false; sb.append(path); sb.append("/"); sb.append(filename); String newPath = sb.toString(); sb.setLength(0); // Don't try to go beyond depth 10 as a safety measure. if (LibVLC.nativeIsPathDirectory(newPath) && depth < 10) { ArrayList<String> files_int = new ArrayList<String>(); LibVLC.nativeReadDirectory(newPath, files_int); if (files_int.size() < 8) { /* Optimisation: If there are more than 8 sub-folders, don't scan each one, otherwise when scaled it is very slow to load */ String mCurrentDir_old = mCurrentDir; mCurrentDir = path; this.populateNode(nss, newPath, depth + 1); mCurrentDir = mCurrentDir_old; } } else { if (acceptedPath(newPath)) nss.setIsFile(); else continue; } n.addChildNode(nss); } Collections.sort(n.children); } DirectoryAdapter.Node up = new DirectoryAdapter.Node(".."); n.children.add(0, up); }