some file list handling, action bar added
authorBartek Przybylski <bart.p.pl@gmail.com>
Sat, 11 Feb 2012 22:11:57 +0000 (23:11 +0100)
committerBartek Przybylski <bart.p.pl@gmail.com>
Sat, 11 Feb 2012 22:11:57 +0000 (23:11 +0100)
AndroidManifest.xml
res/layout-port/files.xml
res/layout/files.xml
res/values/styles.xml
src/eu/alefzero/owncloud/ui/FragmentListView.java [new file with mode: 0644]
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
src/eu/alefzero/owncloud/ui/fragment/FileList.java

index b41fa66..8f9a8fb 100644 (file)
@@ -25,7 +25,7 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>\r
 \r
     <application android:icon="@drawable/icon" android:label="@string/app_name">\r
-        <activity android:name=".ui.activity.FileDisplayActivity"></activity>\r
+        <activity android:name=".ui.activity.FileDisplayActivity" android:theme="@style/Theme.ownCloud" android:label="@string/app_name"></activity>\r
         <activity android:name=".Uploader">\r
             <intent-filter>\r
                 <action android:name="android.intent.action.SEND"></action>\r
index fbb30c3..631fa98 100644 (file)
@@ -5,14 +5,6 @@
     android:background="#F7F7F7"\r
     android:orientation="vertical" >\r
 \r
-    <fragment \r
-        android:id="@+id/actionBar"\r
-        android:layout_width="fill_parent"\r
-        android:layout_height="wrap_content"\r
-        class="eu.alefzero.owncloud.ui.fragment.ActionBar">\r
-        <!-- Preview: layout=@layout/action_bar -->\r
-    </fragment>\r
-\r
     <fragment\r
         android:id="@+id/fileList"\r
         android:layout_width="fill_parent"\r
index 012fb6e..0c94456 100644 (file)
         android:layout_height="fill_parent"\r
         android:orientation="vertical" >\r
 \r
-        <fragment\r
-            android:id="@+id/actionBar"\r
-            android:layout_height="wrap_content"\r
-            android:layout_width="fill_parent"\r
-            class="eu.alefzero.owncloud.ui.fragment.ActionBar">\r
-            <!-- Preview: layout=@layout/action_bar -->\r
-        </fragment>\r
-\r
         <LinearLayout\r
             android:id="@+id/linearLayout2"\r
             android:layout_width="fill_parent"\r
index 1f6874b..1d44455 100644 (file)
@@ -11,9 +11,8 @@
        <style name="ocActionBarTextStyle">
        <item name="android:textColor">#ffffff</item>
        </style>
-       
-       
-       
+           
+           
        <!-- PopDownMenu -->
        <style name="Animations.PopDownMenu" />
        
diff --git a/src/eu/alefzero/owncloud/ui/FragmentListView.java b/src/eu/alefzero/owncloud/ui/FragmentListView.java
new file mode 100644 (file)
index 0000000..aff7005
--- /dev/null
@@ -0,0 +1,38 @@
+package eu.alefzero.owncloud.ui;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.AdapterView.OnItemClickListener;
+
+public class FragmentListView extends Fragment implements OnItemClickListener {
+  ListView mList;
+  
+  @Override
+  public void onCreate(Bundle savedInstanceState) {
+    mList = new ListView(getActivity());
+    mList.setOnItemClickListener(this);
+    super.onCreate(savedInstanceState);
+  }
+  
+  public void setListAdapter(ListAdapter listAdapter) {
+    mList.setAdapter(listAdapter);
+    mList.invalidate();
+  }
+
+  @Override
+  public View onCreateView(LayoutInflater inflater, ViewGroup container,
+      Bundle savedInstanceState) {
+    return mList;
+    //return super.onCreateView(inflater, container, savedInstanceState);
+  }
+  
+  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {}
+  
+  
+}
index 500a244..b6b099f 100644 (file)
@@ -30,14 +30,17 @@ import android.accounts.AccountManager;
 import android.app.AlertDialog;\r
 import android.app.Dialog;\r
 import android.app.ListActivity;\r
+import android.app.ActionBar.OnNavigationListener;\r
 import android.content.DialogInterface;\r
 import android.content.Intent;\r
 import android.content.DialogInterface.OnCancelListener;\r
 import android.content.res.Configuration;\r
 import android.database.Cursor;\r
+import android.database.DataSetObserver;\r
 import android.graphics.Bitmap;\r
 import android.graphics.BitmapFactory;\r
 import android.graphics.Matrix;\r
+import android.graphics.drawable.Drawable;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.os.Environment;\r
@@ -49,9 +52,13 @@ import android.text.TextUtils;
 import android.util.Log;\r
 import android.view.MenuInflater;\r
 import android.view.View;\r
+import android.view.ViewGroup;\r
 import android.view.Window;\r
+import android.widget.ArrayAdapter;\r
 import android.widget.ImageView;\r
 import android.widget.ListView;\r
+import android.widget.Spinner;\r
+import android.widget.SpinnerAdapter;\r
 import android.widget.TextView;\r
 import eu.alefzero.owncloud.R;\r
 import eu.alefzero.owncloud.R.id;\r
@@ -70,25 +77,42 @@ import eu.alefzero.owncloud.ui.fragment.ActionBar;
  * @author Bartek Przybylski\r
  *\r
  */\r
-public class FileDisplayActivity extends FragmentActivity {\r
+\r
+public class FileDisplayActivity extends android.support.v4.app.FragmentActivity implements OnNavigationListener {\r
   private DbHandler mDBHandler;\r
   private Stack<String> mParents;\r
   private LinkedList<String> mPath;\r
   private Account mAccount;\r
   private Cursor mCursor;\r
   private boolean mIsDisplayingFile;\r
-\r
+  private ArrayAdapter<String> mDirectories;\r
+  private FileList mFileList;\r
\r
   private static final int DIALOG_CHOOSE_ACCOUNT = 0;\r
-\r
+  \r
+  public void pushPath(String path) {\r
+    mDirectories.insert(path, 0);\r
+  }\r
+  \r
+  public boolean popPath() {\r
+    mDirectories.remove(mDirectories.getItem(0));\r
+    Log.d("TAG", ""+getActionBar().getCustomView());\r
+    return !mDirectories.isEmpty();\r
+  }\r
+  \r
   @Override\r
   public void onCreate(Bundle savedInstanceState) {\r
     super.onCreate(savedInstanceState);\r
-    getWindow().requestFeature(Window.FEATURE_NO_TITLE);\r
+    mDirectories = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item);\r
+    mDirectories.add("/");\r
+    mFileList = new FileList();\r
     setContentView(R.layout.files);\r
+    getActionBar().setNavigationMode(android.support.v4.app.ActionBar.NAVIGATION_MODE_LIST);\r
+    getActionBar().setDisplayShowTitleEnabled(false);\r
+    getActionBar().setListNavigationCallbacks(mDirectories, this);\r
     \r
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
-    //ft.add(R.id.actionBar, new ActionBar());\r
-    ft.add(R.id.fileList, new FileList());\r
+    ft.add(R.id.fileList, mFileList);\r
     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {\r
       ft.add(R.id.fileDetail, new FileDetail());\r
     }\r
@@ -344,6 +368,25 @@ public class FileDisplayActivity extends FragmentActivity {
 //    setListAdapter(new FileListListAdapter(mCursor, this));\r
 //    getListView().invalidate();\r
   }\r
+\r
+  @Override\r
+  public boolean onNavigationItemSelected(int itemPosition, long itemId) {\r
+    int i = itemPosition;\r
+    while (i-- != 0) {\r
+      popPath();\r
+      mFileList.onBackPressed();\r
+    }\r
+    return true;\r
+  }\r
+  \r
+  @Override\r
+  public void onBackPressed() {\r
+    popPath();\r
+    if (mDirectories.isEmpty()) {\r
+      super.onBackPressed();\r
+    }\r
+    mFileList.onBackPressed();\r
+  }\r
   \r
   //@Override\r
   /*protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r
index 1fb8abc..691c2cf 100644 (file)
  */\r
 package eu.alefzero.owncloud.ui.fragment;\r
 \r
+import java.util.ListIterator;\r
+import java.util.Stack;\r
+\r
+import eu.alefzero.owncloud.DisplayUtils;\r
 import eu.alefzero.owncloud.R;\r
 import eu.alefzero.owncloud.R.id;\r
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
 import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;\r
+import eu.alefzero.owncloud.ui.FragmentListView;\r
 import eu.alefzero.owncloud.ui.activity.FileDetailActivity;\r
+import eu.alefzero.owncloud.ui.activity.FileDisplayActivity;\r
 import eu.alefzero.owncloud.ui.adapter.FileListListAdapter;\r
 import eu.alefzero.owncloud.ui.fragment.ActionBar;\r
 import android.accounts.Account;\r
@@ -33,32 +39,39 @@ import android.database.Cursor;
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.support.v4.app.FragmentTransaction;\r
+import android.support.v4.app.Fragment;\r
 import android.support.v4.app.ListFragment;\r
+import android.util.Log;\r
 import android.view.LayoutInflater;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
+import android.widget.AdapterView;\r
 import android.widget.ArrayAdapter;\r
 import android.widget.ListView;\r
 import android.widget.TextView;\r
 import android.widget.Toast;\r
+import android.widget.AdapterView.OnItemClickListener;\r
 \r
 /**\r
  * A Fragment that lists all files and folders in a given path.\r
  * @author Bartek Przybylski\r
  *\r
  */\r
-public class FileList extends ListFragment {\r
+public class FileList extends FragmentListView {\r
   private Cursor mCursor;\r
   private Account mAccount;\r
   private AccountManager mAccountManager;\r
   private View mheaderView;\r
+  private Stack<String> mParentsIds;\r
+  private Stack<String> mDirNames;\r
 \r
-  \r
   @Override\r
   public void onCreate(Bundle savedInstanceState) {\r
     // TODO Auto-generated method stub\r
     super.onCreate(savedInstanceState);\r
     \r
+    mParentsIds = new Stack<String>();\r
+    mDirNames = new Stack<String>();\r
     mAccountManager = (AccountManager)getActivity().getSystemService(Service.ACCOUNT_SERVICE);\r
     mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[0];\r
     populateFileList();\r
@@ -71,42 +84,40 @@ public class FileList extends ListFragment {
   }\r
   \r
   @Override\r
-  public void onListItemClick(ListView l, View v, int position, long id) {\r
+  public void onItemClick(AdapterView<?> l, View v, int position, long id) {\r
     FileDetail fd = (FileDetail) getFragmentManager().findFragmentById(R.id.fileDetail);\r
-    ActionBar ab = (ActionBar) getFragmentManager().findFragmentById(R.id.actionBar);\r
-    \r
     if (!mCursor.moveToPosition(position)) {\r
       throw new IndexOutOfBoundsException("Incorrect item selected");\r
     }\r
+    \r
     if (mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)).equals("DIR")) {\r
         String id_ = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta._ID));\r
+        mParentsIds.push(id_);\r
         String dirname = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_NAME));\r
-        //ab..push(DisplayUtils.HtmlDecode(dirname));\r
-        //mPath.addLast(DisplayUtils.HtmlDecode(dirname));\r
-        //mParents.push(id_);\r
+        mDirNames.push(dirname);\r
+        ((FileDisplayActivity)getActivity()).pushPath(DisplayUtils.HtmlDecode(dirname));\r
         mCursor = getActivity().managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, id_),\r
                                null,\r
                                ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",\r
                                new String[]{mAccount.name}, null);\r
         setListAdapter(new FileListListAdapter(mCursor, getActivity()));\r
-        setListShown(false);\r
-        setListShown(true);\r
-        super.onListItemClick(l, v, position, id);\r
+        //super.onListItemClick(l, v, position, id);\r
         return;\r
     }\r
     Intent i = new Intent(getActivity(), FileDetailActivity.class);\r
-    i.putExtra("FILE_PATH", ab.getCurrentPath());\r
     i.putExtra("FILE_NAME", ((TextView)v.findViewById(R.id.Filename)).getText());\r
     if (fd != null) {\r
       fd.setStuff(i);\r
       //fd.use(((TextView)v.findViewById(R.id.Filename)).getText());\r
     } else {\r
-      i.putExtra("FILE_PATH", ab.getCurrentPath());\r
       i.putExtra("FILE_NAME", ((TextView)v.findViewById(R.id.Filename)).getText());\r
       startActivity(i);\r
     }\r
-    super.onListItemClick(l, v, position, id);\r
-\r
+    FragmentTransaction ft = getFragmentManager().beginTransaction();\r
+    ft.replace(R.id.fileList, this);\r
+    ft.commitAllowingStateLoss();\r
+    //super.onListItemClick(l, v, position, id);\r
+    \r
   }\r
   \r
   @Override\r
@@ -124,4 +135,24 @@ public class FileList extends ListFragment {
     \r
     setListAdapter(new FileListListAdapter(mCursor, getActivity()));\r
   }\r
+  \r
+  public void onBackPressed() {\r
+    if (!mParentsIds.empty()) {\r
+      mParentsIds.pop();\r
+      mDirNames.pop();\r
+    }\r
+    if (!mParentsIds.empty()) {\r
+      \r
+      String id_ = mParentsIds.peek();\r
+      String dirname = mDirNames.peek();\r
+      mCursor = getActivity().managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, id_),\r
+                             null,\r
+                             ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",\r
+                             new String[]{mAccount.name}, null);\r
+      setListAdapter(new FileListListAdapter(mCursor, getActivity()));\r
+    } else {\r
+      populateFileList();\r
+    }\r
+      \r
+  }\r
 }\r