Android Open Source - unmp Directory Chooser Dialog






From Project

Back to project page unmp.

License

The source code is released under:

MIT License

If you think the Android project unmp listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.parnswir.unmp;
/*  w w  w .  j av  a2 s  .  c o m*/
// The following code was created by Gregory Shpitalnik under The Code Project Open License
// http://www.codeproject.com/Articles/547636/Android-Ready-to-use-simple-directory-chooser-dial
//
// Some adjustments were made:
//   + hasParent() determines if a directory has a parent
//   + add ".." to directories to navigate up
//   + handle click on ".."
//    + navigate to parent with "Back" key

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnKeyListener;
import android.os.Environment;
import android.text.Editable;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class DirectoryChooserDialog 
{
 private boolean m_isNewFolderEnabled = true;
 private String m_sdcardDirectory = "";
 private Context m_context;
 private TextView m_titleView;

 private String m_dir = "";
 private List<String> m_subdirs = null;
 private ChosenDirectoryListener m_chosenDirectoryListener = null;
 private ArrayAdapter<String> m_listAdapter = null;

 //////////////////////////////////////////////////////
 // Callback interface for selected directory
 //////////////////////////////////////////////////////
 public interface ChosenDirectoryListener 
 {
     public void onChosenDir(String chosenDir);
 }

 public DirectoryChooserDialog(Context context, ChosenDirectoryListener chosenDirectoryListener)
 {
     m_context = context;
     m_sdcardDirectory = Environment.getExternalStorageDirectory().getAbsolutePath();
     m_chosenDirectoryListener = chosenDirectoryListener;

     try
     {
         m_sdcardDirectory = new File(m_sdcardDirectory).getCanonicalPath();
     }
     catch (IOException ioe)
     {
     }
 }

 ///////////////////////////////////////////////////////////////////////
 // setNewFolderEnabled() - enable/disable new folder button
 ///////////////////////////////////////////////////////////////////////

 public void setNewFolderEnabled(boolean isNewFolderEnabled)
 {
     m_isNewFolderEnabled = isNewFolderEnabled;
 }

 public boolean getNewFolderEnabled()
 {
     return m_isNewFolderEnabled;
 }

 ///////////////////////////////////////////////////////////////////////
 // chooseDirectory() - load directory chooser dialog for initial
 // default sdcard directory
 ///////////////////////////////////////////////////////////////////////

 public void chooseDirectory()
 {
     // Initial directory is sdcard directory
     chooseDirectory(m_sdcardDirectory);
 }

 ////////////////////////////////////////////////////////////////////////////////
 // chooseDirectory(String dir) - load directory chooser dialog for initial 
 // input 'dir' directory
 ////////////////////////////////////////////////////////////////////////////////

 public void chooseDirectory(String dir)
 {
     File dirFile = new File(dir);
     if (! dirFile.exists() || ! dirFile.isDirectory())
     {
         dir = m_sdcardDirectory;
     }

     try
     {
         dir = new File(dir).getCanonicalPath();
     }
     catch (IOException ioe)
     {
         return;
     }

     m_dir = dir;
     m_subdirs = new ArrayList<String>();
     if (hasParent(m_dir)) {
       m_subdirs.add("..");
     }
     m_subdirs.addAll(getDirectories(dir));

     class DirectoryOnClickListener implements DialogInterface.OnClickListener
     {
         public void onClick(DialogInterface dialog, int item) 
         {
           if (item == 0 && hasParent(m_dir) ) {
             m_dir = new File(m_dir).getParent();
                 updateDirectory();
           } else {
             // Navigate into the sub-directory
                 m_dir += "/" + ((AlertDialog) dialog).getListView().getAdapter().getItem(item);
                 updateDirectory();
           }
         }
     }

 AlertDialog.Builder dialogBuilder = 
 createDirectoryChooserDialog(dir, m_subdirs, new DirectoryOnClickListener());

 dialogBuilder.setPositiveButton("OK", new OnClickListener() 
 {
     @Override
     public void onClick(DialogInterface dialog, int which) 
     {
         // Current directory chosen
         if (m_chosenDirectoryListener != null)
         {
             // Call registered listener supplied with the chosen directory
             m_chosenDirectoryListener.onChosenDir(m_dir);
         }
     }
 }).setNegativeButton("Cancel", null);

 final AlertDialog dirsDialog = dialogBuilder.create();

 dirsDialog.setOnKeyListener(new OnKeyListener() 
 {
     @Override
     public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) 
     {
         if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN)
         {
             // Back button pressed
             if ( ! hasParent(m_dir) )
             {
                 // The very top level directory, do nothing
                 return false;
             }
             else
             {
                 // Navigate back to an upper directory
                 m_dir = new File(m_dir).getParent();
                 updateDirectory();
             }
 
             return true;
         }
         else
         {
             return false;
         }
     }
 });

 // Show directory chooser dialog
 dirsDialog.show();
}

private boolean createSubDir(String newDir)
{
 File newDirFile = new File(newDir);
 if (! newDirFile.exists() )
 {
     return newDirFile.mkdir();
 }

 return false;
}

private List<String> getDirectories(String dir)
{
 List<String> dirs = new ArrayList<String>();

 try
 {
     File dirFile = new File(dir);
     if (! dirFile.exists() || ! dirFile.isDirectory())
     {
         return dirs;
     }

     for (File file : dirFile.listFiles()) 
     {
         if ( file.isDirectory() )
         {
             dirs.add( file.getName() );
         }
     }
 }
 catch (Exception e)
 {
 }

 Collections.sort(dirs, new Comparator<String>()
 {
     public int compare(String o1, String o2) 
     {
         return o1.compareTo(o2);
     }
 });

 return dirs;
}

@SuppressWarnings("deprecation")
private AlertDialog.Builder createDirectoryChooserDialog(String title, List<String> listItems,
     DialogInterface.OnClickListener onClickListener)
{
 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(m_context);

 // Create custom view for AlertDialog title containing 
 // current directory TextView and possible 'New folder' button.
 // Current directory TextView allows long directory path to be wrapped to multiple lines.
 LinearLayout titleLayout = new LinearLayout(m_context);
 titleLayout.setOrientation(LinearLayout.VERTICAL);

 m_titleView = new TextView(m_context);
 m_titleView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
 m_titleView.setTextAppearance(m_context, android.R.style.TextAppearance_Large);
 m_titleView.setTextColor( m_context.getResources().getColor(android.R.color.white) );
 m_titleView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
 m_titleView.setText(title);

 Button newDirButton = new Button(m_context);
 newDirButton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
 newDirButton.setText("New folder");
 newDirButton.setOnClickListener(new View.OnClickListener() 
 {
     @Override
     public void onClick(View v) 
     {
         final EditText input = new EditText(m_context);

         // Show new folder name input dialog
         new AlertDialog.Builder(m_context).
         setTitle("New folder name").
         setView(input).setPositiveButton("OK", new DialogInterface.OnClickListener() 
         {
             public void onClick(DialogInterface dialog, int whichButton) 
             {
                 Editable newDir = input.getText();
                 String newDirName = newDir.toString();
                 // Create new directory
                 if ( createSubDir(m_dir + "/" + newDirName) )
                 {
                     // Navigate into the new directory
                     m_dir += "/" + newDirName;
                     updateDirectory();
                 }
                 else
                 {
                     Toast.makeText(
                     m_context, "Failed to create '" + newDirName + 
                       "' folder", Toast.LENGTH_SHORT).show();
                 }
             }
         }).setNegativeButton("Cancel", null).show(); 
     }
 });

 if (! m_isNewFolderEnabled)
 {
     newDirButton.setVisibility(View.GONE);
 }

 titleLayout.addView(m_titleView);
 titleLayout.addView(newDirButton);

 dialogBuilder.setCustomTitle(titleLayout);

 m_listAdapter = createListAdapter(listItems);

 dialogBuilder.setSingleChoiceItems(m_listAdapter, -1, onClickListener);
 dialogBuilder.setCancelable(false);

 return dialogBuilder;
}

private void updateDirectory()
{
 m_subdirs.clear();
 if (hasParent(m_dir)) {
   m_subdirs.add("..");
 }
 m_subdirs.addAll( getDirectories(m_dir) );
 m_titleView.setText(m_dir);

 m_listAdapter.notifyDataSetChanged();
}

private Boolean hasParent(String directory) {
  String parent = new File(directory).getParent();
  return parent != null;
}

private ArrayAdapter<String> createListAdapter(List<String> items)
{
 return new ArrayAdapter<String>(m_context, 
   android.R.layout.select_dialog_item, android.R.id.text1, items)
 {
     @Override
     public View getView(int position, View convertView,
     ViewGroup parent) 
     {
         View v = super.getView(position, convertView, parent);

         if (v instanceof TextView)
         {
             // Enable list item (directory) text wrapping
             TextView tv = (TextView) v;
             tv.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
             tv.setEllipsize(null);
         }
         return v;
     }
 };
}
}




Java Source Code List

com.parnswir.unmp.AbstractFragment.java
com.parnswir.unmp.DirectoryChooserDialog.java
com.parnswir.unmp.DrawerActivity.java
com.parnswir.unmp.DrawerState.java
com.parnswir.unmp.LibraryFragment.java
com.parnswir.unmp.ListFragment.java
com.parnswir.unmp.MainActivity.java
com.parnswir.unmp.PlayerFragment.java
com.parnswir.unmp.PlayerService.java
com.parnswir.unmp.PlaylistsFragment.java
com.parnswir.unmp.SplashActivity.java
com.parnswir.unmp.core.AlbumCoverRetriever.java
com.parnswir.unmp.core.C.java
com.parnswir.unmp.core.CoverList.java
com.parnswir.unmp.core.DatabaseUtils.java
com.parnswir.unmp.core.IceCreamSandwichNotificationBuilder.java
com.parnswir.unmp.core.IconicAdapter.java
com.parnswir.unmp.core.ImageLoader.java
com.parnswir.unmp.core.ImageRetriever.java
com.parnswir.unmp.core.JellybeanNotificationBuilder.java
com.parnswir.unmp.core.MemoryCache.java
com.parnswir.unmp.core.MusicDatabaseHelper.java
com.parnswir.unmp.core.NotificationBuilder.java
com.parnswir.unmp.core.ProgressObservable.java
com.parnswir.unmp.core.ProjectResources.java
com.parnswir.unmp.core.Utils.java
com.parnswir.unmp.media.DefaultFileHandler.java
com.parnswir.unmp.media.FileAdditionThread.java
com.parnswir.unmp.media.FileCrawlerThread.java
com.parnswir.unmp.media.FileHandler.java
com.parnswir.unmp.media.FileRemovalThread.java
com.parnswir.unmp.media.MP3Handler.java
com.parnswir.unmp.media.MediaInformation.java
com.parnswir.unmp.media.MediaPlayerStatus.java
com.parnswir.unmp.media.PlaylistHandler.java
com.parnswir.unmp.playlist.MediaFile.java
com.parnswir.unmp.playlist.PlaylistElement.java
com.parnswir.unmp.playlist.Playlist.java
com.parnswir.unmp.playlist.parser.PlaylistParser.java
com.parnswir.unmp.playlist.parser.WPLParser.java