From aeadb0136b7a2bd8b6275fd6e26a68d85c4b6ec7 Mon Sep 17 00:00:00 2001 From: John Weyrauch Date: Wed, 24 Jul 2013 12:23:54 -0700 Subject: [PATCH 1/6] Add core feature Open As --- .../filemanager/OpenFileManagerActivity.java | 3 +- .../models/adapters/OpenAsAdapter.java | 50 +++++++++++++++++ .../models/baseadapters/BaseArrayAdapter.java | 16 +++++- .../models/fragments/SingleViewFragment.java | 46 +++++++++++++-- .../linuxmotion/filemanager/utils/Alerts.java | 56 +++++++++++++++++++ .../filemanager/utils/FileUtils.java | 9 +-- .../res/drawable/list_background_slected.xml | 6 ++ src/main/res/layout/layout_dialog_open_as.xml | 51 +++++++++++++++++ .../res/layout/layout_list_item_open_as.xml | 14 +++++ src/main/res/values/styles.xml | 6 ++ 10 files changed, 243 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/linuxmotion/filemanager/models/adapters/OpenAsAdapter.java create mode 100644 src/main/res/drawable/list_background_slected.xml create mode 100644 src/main/res/layout/layout_dialog_open_as.xml create mode 100644 src/main/res/layout/layout_list_item_open_as.xml diff --git a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java index f47b353..4055615 100644 --- a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java +++ b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java @@ -17,7 +17,7 @@ */ package org.linuxmotion.filemanager; -import android.app.Fragment; + import android.app.FragmentTransaction; import android.app.ListActivity; import android.content.Context; @@ -45,6 +45,7 @@ import java.io.File; + public class OpenFileManagerActivity extends ListActivity implements Alerts.GPLAlertClickDispatcher, SingleViewFragment.ContextualActionBarMenu, CutPasteFragment.onPasteListener, SideNavigationFragment.GroupClickCallback, SideNavigationFragment.ChildClickCallback, diff --git a/src/main/java/org/linuxmotion/filemanager/models/adapters/OpenAsAdapter.java b/src/main/java/org/linuxmotion/filemanager/models/adapters/OpenAsAdapter.java new file mode 100644 index 0000000..f4c0103 --- /dev/null +++ b/src/main/java/org/linuxmotion/filemanager/models/adapters/OpenAsAdapter.java @@ -0,0 +1,50 @@ +package org.linuxmotion.filemanager.models.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.linuxmotion.asyncloaders.LogWrapper; +import org.linuxmotion.filemanager.R; +import org.linuxmotion.filemanager.models.baseadapters.BaseArrayAdapter; + +/** + * Created by john on 7/24/13. + */ +public class OpenAsAdapter extends BaseArrayAdapter { + private static final String TAG = OpenAsAdapter.class.getSimpleName(); + + public OpenAsAdapter(Context context, int textViewResourceId, String[] data) { + super(context, textViewResourceId, data); + } + + private class Holder{ + TextView mTextHolder; + } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LogWrapper.Logi(TAG, "getView() called"); + Holder holder = new Holder(); + if(convertView == null){ + + LogWrapper.Logv(TAG, "Inflating the convertView"); + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = inflater.inflate(R.layout.layout_list_item_open_as, parent, false); + TextView text = (TextView) convertView.findViewById(R.id.list_item_open_as); + holder.mTextHolder = text; + convertView.setTag(holder); + } + else{ + LogWrapper.Logv(TAG, "reusing the convertView"); + holder = (Holder) convertView.getTag(); + } + + holder.mTextHolder.setText(mArrayList.get(position)); + + return convertView; + } + + +} diff --git a/src/main/java/org/linuxmotion/filemanager/models/baseadapters/BaseArrayAdapter.java b/src/main/java/org/linuxmotion/filemanager/models/baseadapters/BaseArrayAdapter.java index 2fdadc0..ff88cb9 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/baseadapters/BaseArrayAdapter.java +++ b/src/main/java/org/linuxmotion/filemanager/models/baseadapters/BaseArrayAdapter.java @@ -3,6 +3,8 @@ import android.content.Context; import android.widget.ArrayAdapter; +import org.linuxmotion.asyncloaders.LogWrapper; + import java.util.ArrayList; /** @@ -10,19 +12,20 @@ */ public class BaseArrayAdapter extends ArrayAdapter { - private static boolean DBG = false;// (true || Constants.FULL_DBG); - private static String TAG = "FileArrayAdapter"; + private static final boolean DBG = false;// (true || Constants.FULL_DBG); + private static final String TAG = "FileArrayAdapter"; protected ArrayList mArrayList = new ArrayList(); public BaseArrayAdapter(Context context, int textViewResourceId, T[] data) { super(context, textViewResourceId, data); - + LogWrapper.Logv(TAG, "Creating an adapter from BaseArrayAdapter"); mArrayList.clear(); if (data != null && data.length > 0) { for (T item : data) { mArrayList.add(item); } + LogWrapper.Logv(TAG, "Added " + mArrayList.size() + " items"); } @@ -32,7 +35,14 @@ public BaseArrayAdapter(Context context, int textViewResourceId, T[] data) { public void clear() { //super.clear(); if (mArrayList != null) { + LogWrapper.Logd(TAG,"Clearing " + mArrayList.size() + " items"); mArrayList.clear(); + if (mArrayList.size() != 0){ + // Wtf happened to get here + // why did the adapter not clear ??!! + LogWrapper.Loge(TAG,"Couldn't clear the adapter"); + throw new RuntimeException("Couldn't clear the adapter"); + } } } diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java index c872a9b..4e59632 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java @@ -692,6 +692,34 @@ public void onSelectPositiveButton(String newFile) { // TEXT // VIDEO // PICTURE + final File[] f = getCheckedFiles(); + mode.finish(); + Alerts.OpenAsAlertBox(getActivity(), new Alerts.OpenAsListener() { + @Override + public void onSelectTypeText() { + LogWrapper.Logi(TAG, "onSelectTypeText called"); + startOpenAsActivity(f[0], "text/*"); + } + + @Override + public void onSelectTypePictures() { + LogWrapper.Logi(TAG, "onSelectTypePictures"); + startOpenAsActivity(f[0], "image/*"); + } + + @Override + public void onSelectTypeMusic() { + LogWrapper.Logi(TAG, "onSelectTypeMusic"); + startOpenAsActivity(f[0], "audio/*"); + } + + @Override + public void onSelectTypeVideo() { + + LogWrapper.Logi(TAG, "onSelectTypeVideo"); + startOpenAsActivity(f[0], "video/*"); + } + }); } @@ -750,16 +778,13 @@ public boolean onPrepareActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mActionMode.getMenuInflater(); if (mMultiSelected) { - if(determineDataType( new Intent(), getCheckedFiles())){ inflater.inflate(R.menu.menu_context_actions_multiple_items_share, menu); - }else { inflater.inflate(R.menu.menu_context_actions_multiple_items, menu); } - } else { inflater.inflate(R.menu.menu_context_actions, menu); @@ -775,6 +800,17 @@ public boolean onPrepareActionMode(ActionMode mode, Menu menu) { } + private void startOpenAsActivity(File file, String type) { + Intent resourceintent = new Intent(Intent.ACTION_VIEW); + resourceintent.setDataAndType(Uri.parse("file://" + file.getPath()), type); + try { + startActivity(resourceintent); + } catch (ActivityNotFoundException e) { + e.printStackTrace(); + mUIRefresher.sendEmptyMessage(Constants.UNKNOWN_FILE_TYPE); + } + } + private boolean determineDataType(Intent shareIntent, File[] checkedFiles) { @@ -805,7 +841,6 @@ private void deleteSelectedItems() { private File[] getCheckedFiles() { LogWrapper.Logi(TAG, "getCheckedFiles()"); - SparseBooleanArray array = mList.getCheckedItemPositions(); ArrayList files = new ArrayList(); LogWrapper.Logi(TAG, "Found " + mList.getCheckedItemCount() + " checked items"); @@ -928,16 +963,15 @@ public void run() { // clear the adapter list.clear(); if (files != null && files.length > 0) { - // TODO: Make this faster for large data sets // Perceived lag on data sets > 1000 // unkown for smaller data sets // when perceived lag starts LogWrapper.Logv(TAG, "Files " + files.length + ""); files = FileUtils.sortFiles(files, mWContext.get()); - LogWrapper.Logv(TAG, "Files " + files.length + " after sorting"); for (File f : files) { + LogWrapper.Logv(TAG, "The file name is: " + f.getName() + " and the full path is " + f.getPath()); list.add(f); list.notifyDataSetChanged(); } diff --git a/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java b/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java index de667b6..36d382f 100644 --- a/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java +++ b/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java @@ -10,13 +10,16 @@ import android.view.View; import android.widget.EditText; import android.widget.Switch; +import android.widget.TextView; import org.linuxmotion.asyncloaders.LogWrapper; import org.linuxmotion.filemanager.R; import org.linuxmotion.filemanager.models.FileDeleteDialogClickListener; +import org.linuxmotion.filemanager.models.adapters.OpenAsAdapter; import java.io.File; import java.io.IOException; +import java.util.ArrayList; /** * Wrapper class for showing different alerts. @@ -300,5 +303,58 @@ public void onClick(DialogInterface arg0, int arg1) { } + public interface OpenAsListener { + public void onSelectTypeText(); + public void onSelectTypePictures(); + public void onSelectTypeMusic(); + public void onSelectTypeVideo(); + } + public static void OpenAsAlertBox(Context context, final OpenAsListener listener){ + + + String[] dialogs = {"Text","Music", "Video", "Picture"}; + + AlertDialog.Builder rename = new AlertDialog.Builder(context); + rename.setTitle("Open As"); + rename.setCancelable(true); + //View v = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.layout_dialog_open_as, null, false); + //rename.setView(v); + + rename.setAdapter(new OpenAsAdapter(context, 0, dialogs), new OnClickListener(){ + + @Override + public void onClick(DialogInterface dialogInterface, int i) { + switch (i){ + + case 0:{ + listener.onSelectTypeText(); + }break; + case 1:{ + listener.onSelectTypeMusic(); + }break; + case 2:{ + listener.onSelectTypeVideo(); + }break; + case 3:{ + listener.onSelectTypePictures(); + }break; + } + + } + }); + + rename.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface arg0, int arg1) { + // Do nothing + + } + + }); + + + rename.create().show(); + } } diff --git a/src/main/java/org/linuxmotion/filemanager/utils/FileUtils.java b/src/main/java/org/linuxmotion/filemanager/utils/FileUtils.java index ca30959..fef47ef 100644 --- a/src/main/java/org/linuxmotion/filemanager/utils/FileUtils.java +++ b/src/main/java/org/linuxmotion/filemanager/utils/FileUtils.java @@ -20,6 +20,7 @@ import android.content.Context; import android.util.Log; +import org.linuxmotion.asyncloaders.LogWrapper; import org.linuxmotion.filemanager.preferences.PreferenceUtils; import java.io.File; @@ -40,10 +41,10 @@ public static File[] getFilesInDirectory(String directory, Context context) { File temp = new File(directory); if (temp.exists()) { - - - if (temp.listFiles() != null) { - Log.d(TAG, "[Path = " + temp.toString() + " exists"); + Log.d(TAG, "[Path = " + temp.toString() + " exists"); + File[] files = temp.listFiles(); + if (files != null) { + LogWrapper.Logd(TAG, "Found " + files.length + " files"); return temp.listFiles(); } else { // If this point is reached then the directory doesnt contain any diff --git a/src/main/res/drawable/list_background_slected.xml b/src/main/res/drawable/list_background_slected.xml new file mode 100644 index 0000000..7fe9ebb --- /dev/null +++ b/src/main/res/drawable/list_background_slected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/src/main/res/layout/layout_dialog_open_as.xml b/src/main/res/layout/layout_dialog_open_as.xml new file mode 100644 index 0000000..d0aaa1b --- /dev/null +++ b/src/main/res/layout/layout_dialog_open_as.xml @@ -0,0 +1,51 @@ + + + + + + /> + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/layout_list_item_open_as.xml b/src/main/res/layout/layout_list_item_open_as.xml new file mode 100644 index 0000000..59dd691 --- /dev/null +++ b/src/main/res/layout/layout_list_item_open_as.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index 6ce89c7..ee24370 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -17,4 +17,10 @@ + + From 4352d70285cf5218a38b8ff519a84ab3c225624c Mon Sep 17 00:00:00 2001 From: John Weyrauch Date: Wed, 24 Jul 2013 16:16:25 -0700 Subject: [PATCH 2/6] Add core feature favorites Update README --- README | 4 +- .../filemanager/OpenFileManagerActivity.java | 47 +++- .../filemanager/database/DataBaseHelper.java | 155 +++++++++++++ .../filemanager/database/StringDatabase.java | 203 ++++++++++++++++++ .../fragments/SideNavigationFragment.java | 39 +++- .../models/fragments/SingleViewFragment.java | 5 +- .../linuxmotion/filemanager/utils/Alerts.java | 28 +++ 7 files changed, 464 insertions(+), 17 deletions(-) create mode 100644 src/main/java/org/linuxmotion/filemanager/database/DataBaseHelper.java create mode 100644 src/main/java/org/linuxmotion/filemanager/database/StringDatabase.java diff --git a/README b/README index ebcfbee..0d6eb03 100644 --- a/README +++ b/README @@ -19,12 +19,12 @@ Core features --(Multiple)Item select - Open as + --Open as --Rename --Cut/Paste --Delete file/folder --New file/folder - Add/remove favorites(Currently working on) + --Add/remove favorites Set home directory(Needs a preference to set/read from) Forward/Back directory switching(Needs the logic) diff --git a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java index 4055615..9093145 100644 --- a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java +++ b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java @@ -31,6 +31,7 @@ import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import org.linuxmotion.asyncloaders.LogWrapper; +import org.linuxmotion.filemanager.database.DataBaseHelper; import org.linuxmotion.filemanager.models.MenuAction; import org.linuxmotion.filemanager.models.adapters.ImageArrayAdapter; import org.linuxmotion.filemanager.models.baseadapters.ExpandableBaseArrayAdapter; @@ -49,7 +50,7 @@ public class OpenFileManagerActivity extends ListActivity implements Alerts.GPLAlertClickDispatcher, SingleViewFragment.ContextualActionBarMenu, CutPasteFragment.onPasteListener, SideNavigationFragment.GroupClickCallback, SideNavigationFragment.ChildClickCallback, - SideNavigationFragment.OnFavoritesCallback { + SideNavigationFragment.OnFavoritesCallback, DataBaseHelper.onDatabaseTransactionFinished { private static final String TAG = OpenFileManagerActivity.class.getSimpleName(); private static final boolean DEBUG = (true || Constants.FULL_DBG); @@ -63,7 +64,7 @@ public class OpenFileManagerActivity extends ListActivity implements Alerts.GPLA private boolean mDualPane; private SlidingMenu mSlidingMenu; private boolean mAttached = false; - + DataBaseHelper mHelper= new DataBaseHelper(); /** * Called when the activity is first created. */ @@ -76,6 +77,9 @@ public void onCreate(Bundle savedInstanceState) { mDualPane = false; + mHelper.initDatabase(this, this); + mHelper.open(); + if (mDualPane) { @@ -120,6 +124,7 @@ public void onStop() { super.onStop(); LogWrapper.Logi(TAG, "onStop called"); + mHelper.close(); } @@ -389,6 +394,11 @@ public boolean OnChildClick(String childFilePath, int groupPosition, int childIn } } + @Override + public void OnChildItemLongClicked(int childPosition) { + + } + @Override public void OnFavoriteAdded(String path, int child) { if (mDualPane) { @@ -398,17 +408,28 @@ public void OnFavoriteAdded(String path, int child) { } - PreferenceUtils.putFavorite(this, child, path); + mHelper.AddToList(path); + + // PreferenceUtils.putFavorite(this, child, path); } @Override - public void OnFavoriteRemoved(int group, int child) { + public void OnFavoriteRemoved(String path, int group, int child) { + LogWrapper.Logi(TAG, "OnFavoriteRemoved() called"); if (mDualPane) { return; } else { } + mHelper.RemoveFromList(path); + } + + @Override + public String[] OnFavoritesInitialized() { + String[] favorites = mHelper.getAllEntries(); + LogWrapper.Logv(TAG, "Found " + favorites.length + " favorites to add"); + return favorites; } @Override @@ -426,4 +447,22 @@ public boolean OnRenameCallback() { } return false; } + + @Override + public void onTransactionFinished(int action) { + switch (action){ + case DataBaseHelper.onDatabaseTransactionFinished.TRANSACTION_ADD:{ + LogWrapper.Logd(TAG, "Succesfully added favorite to database"); + + }break; + case DataBaseHelper.onDatabaseTransactionFinished.TRANSACTION_DELETE:{ + LogWrapper.Logd(TAG, "Succesfully delete favorite to database"); + + }break; + case DataBaseHelper.onDatabaseTransactionFinished.TRANSACTION_INCOMPLETE:{ + LogWrapper.Logd(TAG, "Database transaction was incomplete"); + + }break; + } + } } diff --git a/src/main/java/org/linuxmotion/filemanager/database/DataBaseHelper.java b/src/main/java/org/linuxmotion/filemanager/database/DataBaseHelper.java new file mode 100644 index 0000000..cecf07d --- /dev/null +++ b/src/main/java/org/linuxmotion/filemanager/database/DataBaseHelper.java @@ -0,0 +1,155 @@ +package org.linuxmotion.filemanager.database; + +import android.content.Context; + +import org.linuxmotion.asyncloaders.LogWrapper; + +import java.io.File; +import java.util.List; + +public class DataBaseHelper { + + private static final String TAG = DataBaseHelper.class.getSimpleName(); + + onDatabaseTransactionFinished mDatabaseTransactionListener = null; + Context mContext = null; + public interface onDatabaseTransactionFinished{ + public static final int TRANSACTION_INCOMPLETE = 0; + public static final int TRANSACTION_ADD = 1; + public static final int TRANSACTION_DELETE = 2; + public void onTransactionFinished(int action); + + } + + public void setTransactionFinishedListener(onDatabaseTransactionFinished listener){ + + mDatabaseTransactionListener = listener; + } + + private static StringDatabase mDatabase; + + public void initDatabase(Context context){ + mDatabase = new StringDatabase(context); + mContext = context; + + } + + public void initDatabase(Context context, onDatabaseTransactionFinished listener){ + setTransactionFinishedListener(listener); + mDatabase = new StringDatabase(context); + + } + + public void updatePhotoList(File[] photos){} + + public void updatePhotoList(String[] photos){} + + /** + * Add to the database, ran on a seperate thread + * @param favorite + */ + public void AddToList(final String favorite) { + + new Thread(new Runnable(){ + + @Override + public void run() { + long transcode = mDatabase.addString(favorite); + LogWrapper.Logi(TAG, "The add transaction code is = " + transcode); + if(transcode == StringDatabase.PATH_ERROR || StringDatabase.INSERT_ERROR == transcode || StringDatabase.DATABASE_NOT_OPEN_ERROR == transcode){ + + if(mDatabaseTransactionListener != null){ + LogWrapper.Logi(TAG, "Invoking transaction finished with code = " + onDatabaseTransactionFinished.TRANSACTION_INCOMPLETE); + mDatabaseTransactionListener.onTransactionFinished(onDatabaseTransactionFinished.TRANSACTION_INCOMPLETE); + } + + }else if(transcode >= 0){ + + if(mDatabaseTransactionListener != null){ + LogWrapper.Logi(TAG, + "Invoking transaction finished with code = " + onDatabaseTransactionFinished.TRANSACTION_ADD); + mDatabaseTransactionListener.onTransactionFinished(onDatabaseTransactionFinished.TRANSACTION_ADD); + + } + } + }}).run(); + } + + /** + * + * Delete from the database, Ran from another thread + * @param favorite + */ + public void RemoveFromList(final String favorite) { + + new Thread(new Runnable(){ + + @Override + public void run() { + int transcode = mDatabase.deleteImage(favorite); + LogWrapper.Logi(TAG, "The delete transaction code is = " + transcode); + if(transcode > 0){ + if(mDatabaseTransactionListener != null){ + LogWrapper.Logi(TAG, + "Invoking transaction finished with code = " + onDatabaseTransactionFinished.TRANSACTION_DELETE); + mDatabaseTransactionListener.onTransactionFinished(onDatabaseTransactionFinished.TRANSACTION_DELETE); + } + }else if(transcode == 0 || transcode == StringDatabase.PATH_ERROR ){ + if(mDatabaseTransactionListener != null){ + LogWrapper.Logi(TAG, + "Invoking transaction finished with code = " + onDatabaseTransactionFinished.TRANSACTION_INCOMPLETE); + + mDatabaseTransactionListener.onTransactionFinished(onDatabaseTransactionFinished.TRANSACTION_INCOMPLETE); + } + + } + + }}).run(); + } + + public Boolean isInDataBase(String path) { + if(path == null)return false; + return mDatabase.isImagePathPresent(path); + } + + public String[] getAllEntries() { + + List im = mDatabase.getAllStrings(); + int count = im.size(); + String[] paths = new String[count]; + for(int i = 0; i < count; i++){ + + paths[i] = im.get(i); + + } + return paths; + } + + public boolean open(){ + if(mDatabase != null || !mDatabase.isOpen()){ + mDatabase.open(); + return true; + } + return false; + } + + public boolean close(){ + + if(mDatabase != null || mDatabase.isOpen()){ + + mDatabase.close(); + return true; + } + return false; + } + + + + + public boolean isOpen(){ + return mDatabase.isOpen(); + } + + + +} diff --git a/src/main/java/org/linuxmotion/filemanager/database/StringDatabase.java b/src/main/java/org/linuxmotion/filemanager/database/StringDatabase.java new file mode 100644 index 0000000..de6d5b9 --- /dev/null +++ b/src/main/java/org/linuxmotion/filemanager/database/StringDatabase.java @@ -0,0 +1,203 @@ +package org.linuxmotion.filemanager.database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.database.sqlite.SQLiteOpenHelper; + + +import org.linuxmotion.asyncloaders.AeSimpleSHA1; +import org.linuxmotion.asyncloaders.LogWrapper; + +import java.util.ArrayList; +import java.util.List; + +public class StringDatabase extends SQLiteOpenHelper { + + + private SQLiteDatabase mDatabase; + private Cursor mCursor; + // All Static variables + // Database Version + private static final int DATABASE_VERSION = 1; + + // Database Name + private static final String DATABASE_NAME = "selectedImages"; + + // Path table name + private static final String PATHS_TABLE = "imagepath"; + + // Path Table Columns names + private static final String KEY_ID = "id"; + // Path Table Columns names + private static final String PATH_ID = "path"; + + private static final String TAG = "MyImageDatabase"; + + /** + * Wrapper function , use defaults when called + * @param context + */ + public StringDatabase(Context context) { + this(context, DATABASE_NAME, null, DATABASE_VERSION); + //mDatabase = this.getWritableDatabase(); + //this.close(); + //super(context, name, factory, version); + } + + public StringDatabase(Context context, String name, CursorFactory factory, + int version) { + super(context, name, null, version); + //super(context, name, factory, version); + } + + public void open(){ + mDatabase = this.getWritableDatabase(); + + } + + + @Override + public void onCreate(SQLiteDatabase db) { + LogWrapper.Logd(TAG, "Creating database"); + // TODO Auto-generated method stub + String CREATE_IMAGE_PATH_TABLE = "CREATE TABLE " + PATHS_TABLE + "(" + + KEY_ID + " INTERGER PRIMARY KEY," + PATH_ID + " TEXT )"; + db.execSQL(CREATE_IMAGE_PATH_TABLE); + //db.close(); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // Drop older table if existed + db.execSQL("DROP TABLE IF EXISTS " + PATHS_TABLE); + + // Create tables again + onCreate(db);// Will close the db + + } + + + public static final int INSERT_ERROR = -1; + public static final int PATH_ERROR = -2; + public static final long DATABASE_NOT_OPEN_ERROR = -3; + /** + * + * @param path The path to the image to add + * @return The row ID of the newly inserted row, -1 if an error occurred while inserting,
or -2 if the path was not present + */ + public synchronized long addString(String path) { + + + ContentValues values = new ContentValues(); + + + + if(!isImagePathPresent(path)){ // No need to insert into db if present + + String hash = AeSimpleSHA1.SHA1(path); + LogWrapper.Logdb(TAG, "Adding image with the path: " + path + " and hash: " + hash); + + values.put(KEY_ID, hash); // String hash + values.put(PATH_ID, path); // String path + + // Inserting Row + if(mDatabase == null || mDatabase.isOpen()) + return mDatabase.insert(PATHS_TABLE, null, values); + else + return DATABASE_NOT_OPEN_ERROR; + + } + return PATH_ERROR; + } + + // Getting single contact + + + // Getting All Contacts + public synchronized List getAllStrings() { + List pathList = new ArrayList(); + // Select All Query + String selectQuery = "SELECT * FROM " + PATHS_TABLE; + + mCursor = mDatabase.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (mCursor.moveToFirst()) { + do { + String path = mCursor.getString(1); + // Adding contact to list + pathList.add(path); + } while (mCursor.moveToNext()); + } + mCursor.close(); + + // return contact list + return pathList; + } + + // Getting contacts Count + public synchronized int getImagesCount() { + String selectQuery = "SELECT * FROM " + PATHS_TABLE; + + + mCursor = mDatabase.rawQuery(selectQuery, null); + int count = mCursor.getCount(); + mCursor.close(); + + return count; + } + // Updating single contact + public synchronized int updateImage(String contact) { + return 0;} + + // Deleting single contact + /** + * + * @param path + * @return The error code if no image path is present, the number of rows affected if a whereClause is passed in, or 0 otherwise. + */ + public synchronized int deleteImage(String path) { + + if(isImagePathPresent(path)){ + String hash = AeSimpleSHA1.SHA1(path); + LogWrapper.Logdb(TAG, "Deleting image with name " + path + " and hash " + hash); + return mDatabase.delete(PATHS_TABLE, KEY_ID + " = ?", new String[]{hash}); + } + + return PATH_ERROR; + + + } + + + public synchronized boolean isImagePathPresent(String path) { + + // Select All Query + String hash = AeSimpleSHA1.SHA1(path); + String selectQuery = "SELECT * FROM " + PATHS_TABLE + " WHERE " + KEY_ID + " = \"" + hash +"\""; + + mDatabase = this.getWritableDatabase(); + mCursor = mDatabase.rawQuery(selectQuery, null); + if(mCursor.getCount() > 0){ + mCursor.moveToFirst(); + LogWrapper.Logdb(TAG, "Entry is present for " + mCursor.getInt(0)); + mCursor.close(); + + return true; // A key entry was found + + } + return false; // A key entry was not found + } + + + public boolean isOpen(){ + + return (mDatabase != null ? mDatabase.isOpen() : false); + + } + + +} diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java index 76d3815..a588825 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java @@ -14,7 +14,9 @@ import org.linuxmotion.filemanager.models.adapters.ExpandableDrawerListAdapter; import org.linuxmotion.filemanager.models.baseadapters.ExpandableBaseArrayAdapter; import org.linuxmotion.filemanager.preferences.PreferenceUtils; +import org.linuxmotion.filemanager.utils.Alerts; +import java.io.File; import java.util.ArrayList; /** @@ -50,8 +52,10 @@ public void onActivityCreated(Bundle savedInstanceState) { private void setupDrawerListView() { + String[] groups = {"Home", "SdCard", "Favorites"}; - String[][] children = {{}, {}, {}}; + String[] favs = mOnFavoriteAdded.OnFavoritesInitialized(); + String[][] children = {{}, {}, favs}; ArrayList> childrenList = new ArrayList>(); @@ -61,13 +65,16 @@ private void setupDrawerListView() { // Fill the group array childrenList.add(new ArrayList()); int j = 0; - while( !PreferenceUtils.getFavorite(this.getActivity(), j).equals("")){ - childrenList.get(i).add(new ExpandableBaseArrayAdapter.Child(i, j, children[i][j], PreferenceUtils.getFavorite(this.getActivity(), j))); + + while( j < children[i].length ){ + + childrenList.get(i).add(new ExpandableBaseArrayAdapter.Child(i, j,new File(children[i][j]).getName(), children[i][j] )); j++; } } + LogWrapper.Logd(TAG, "Added " + childrenList.size() + " children"); mDrawerList.setAdapter(new ExpandableDrawerListAdapter(getActivity(), groups, childrenList)); @@ -134,11 +141,20 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l long newId = mDrawerList.getExpandableListPosition(position); if (ExpandableListView.getPackedPositionType(newId) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { LogWrapper.Logi(TAG, "OnItemLongClicked called on a child view"); - int groupPosition = ExpandableListView.getPackedPositionGroup(newId); - int childPosition = ExpandableListView.getPackedPositionChild(newId); + final int groupPosition = ExpandableListView.getPackedPositionGroup(newId); + final int childPosition = ExpandableListView.getPackedPositionChild(newId); + mChildCallback.OnChildItemLongClicked(childPosition); + ExpandableDrawerListAdapter adapter = (ExpandableDrawerListAdapter) mDrawerList.getExpandableListAdapter(); + String childPath = ((ExpandableDrawerListAdapter.Child) adapter.getChild(groupPosition, childPosition)).mPath; // show a alertdialog that asks the user if they want to remove the favorite + Alerts.FavoriteRemoveAlertBox(getActivity(), new Alerts.FavoriteRemoveListener() { + @Override + public void OnFavoriteRemoved(String favorite) { + removeFavorite(groupPosition, childPosition); + } + },childPath); // You now have everything that you would as if this was an OnChildClickListener() // Add your logic here. @@ -174,13 +190,17 @@ public interface GroupClickCallback { public interface ChildClickCallback { public boolean OnChildClick(String childFilePath, int groupPosition, int childInGroup); + + void OnChildItemLongClicked(int childPosition); } public interface OnFavoritesCallback { public void OnFavoriteAdded(String path, int child); - public void OnFavoriteRemoved(int group, int child); + public void OnFavoriteRemoved(String path, int group, int child); + + public String[] OnFavoritesInitialized(); } public void AddFavorite(ExpandableBaseArrayAdapter.Child child) { @@ -204,16 +224,17 @@ public void AddFavorite(ExpandableBaseArrayAdapter.Child child) { } - private void removeFavorite(int group, int child) { - //mDrawerList.getAdapter(). + private void removeFavorite( int group, int child) { + ExpandableBaseArrayAdapter adapter = (ExpandableBaseArrayAdapter) mDrawerList.getExpandableListAdapter(); + String path = ((ExpandableBaseArrayAdapter.Child)adapter.getChild(group, child)).mPath; adapter.removeChild(group, child); adapter.notifyDataSetChanged(); if (mOnFavoriteAdded == null) { throw new NullPointerException("Class must implement OnFavoritesCallback"); } - mOnFavoriteAdded.OnFavoriteRemoved(group, child); + mOnFavoriteAdded.OnFavoriteRemoved(path, group, child); } diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java index 4e59632..2e1d5c0 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java @@ -730,8 +730,9 @@ public void onSelectTypeVideo() { File[] files = getCheckedFiles(); for (int i = 0; i < files.length; i++) { - ExpandableBaseArrayAdapter.Child child = new ExpandableBaseArrayAdapter.Child(ExpandableDrawerListAdapter. - FAVORITE_INDEX, ExpandableDrawerListAdapter.ITEM_NEW, + ExpandableBaseArrayAdapter.Child child = new ExpandableBaseArrayAdapter.Child( + ExpandableDrawerListAdapter.FAVORITE_INDEX, + ExpandableDrawerListAdapter.ITEM_NEW, files[i].getName(), files[i].toString()); diff --git a/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java b/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java index 36d382f..d0251a2 100644 --- a/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java +++ b/src/main/java/org/linuxmotion/filemanager/utils/Alerts.java @@ -357,4 +357,32 @@ public void onClick(DialogInterface arg0, int arg1) { rename.create().show(); } + public interface FavoriteRemoveListener { + public void OnFavoriteRemoved(String favorite); + } + public static void FavoriteRemoveAlertBox(Context context, final FavoriteRemoveListener listener,final String favorite){ + + + String[] dialogs = {"Text","Music", "Video", "Picture"}; + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCancelable(true); + builder.setNegativeButton("Cancel", new OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + + } + }); + builder.setPositiveButton("Delete", new OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + listener.OnFavoriteRemoved(favorite); + } + }); + + builder.show(); + + } + + } From e88aa8b8feb97f1f9cea11eefb12a4c4a3faff22 Mon Sep 17 00:00:00 2001 From: John Weyrauch Date: Wed, 24 Jul 2013 16:37:05 -0700 Subject: [PATCH 3/6] Add core feature set home directory preference Sdcard path obtained by using enviroment rather than hard string --- README | 2 +- .../models/fragments/SingleViewFragment.java | 12 +++++++++++- .../filemanager/preferences/PreferenceUtils.java | 8 ++++---- .../org/linuxmotion/filemanager/utils/Constants.java | 5 +++-- src/main/res/menu/menu_context_actions.xml | 6 ++++++ src/main/res/values/strings.xml | 1 + 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/README b/README index 0d6eb03..92a6b0e 100644 --- a/README +++ b/README @@ -25,7 +25,7 @@ --Delete file/folder --New file/folder --Add/remove favorites - Set home directory(Needs a preference to set/read from) + --Set home directory Forward/Back directory switching(Needs the logic) The application consists of two activities. The main file manager activity and the settings menu. diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java index 2e1d5c0..cc45c2e 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java @@ -685,6 +685,7 @@ public void onSelectPositiveButton(String newFile) { } return true; case R.id.menu_open_as: { + LogWrapper.Logi(TAG, "Calling menu item OPEN_AS"); // need to show an alert dialog // to manully set the type // of intent that should be sent @@ -725,6 +726,7 @@ public void onSelectTypeVideo() { } return true; case R.id.menu_favorite: { + LogWrapper.Logi(TAG, "Calling menu item FAVORITE"); File[] files = getCheckedFiles(); @@ -744,6 +746,14 @@ public void onSelectTypeVideo() { mode.finish(); // Action picked, so close the CAB + } + return true; + case R.id.menu_home:{ + LogWrapper.Logi(TAG, "Calling menu item HOME"); + PreferenceUtils.putHomeDirectory(getActivity(), getCheckedFiles()[0].getPath()); + Toast.makeText(getActivity(), "Changed home directory to " + + getCheckedFiles()[0].getPath(), Toast.LENGTH_SHORT).show(); + mode.finish(); } return true; default: @@ -872,7 +882,7 @@ public void selectDrawerItem(int position) { LogWrapper.Logv(TAG, "Selecting drawer position" + position); switch (position) { case 0: { - mCurrentPath = Constants.SDCARD_DIR; + mCurrentPath = PreferenceUtils.getHomeDirectory(getActivity()); } break; case 1: { diff --git a/src/main/java/org/linuxmotion/filemanager/preferences/PreferenceUtils.java b/src/main/java/org/linuxmotion/filemanager/preferences/PreferenceUtils.java index 9bc76a8..a2807f9 100644 --- a/src/main/java/org/linuxmotion/filemanager/preferences/PreferenceUtils.java +++ b/src/main/java/org/linuxmotion/filemanager/preferences/PreferenceUtils.java @@ -150,16 +150,16 @@ public static void putHasCompletedRightCutPasteTutorial(Context context, boolean } - public static void putFavorite(Context context, int favoriteNumber, String favorite){ + public static void putHomeDirectory(Context context, String favorite){ SharedPreferences prefs = context.getSharedPreferences(Constants.OPEN_FILE_MANAGER_PREFERENCES, 0); SharedPreferences.Editor edit = prefs.edit(); - edit.putString(Constants.FAVORITE_BASE_PREF + favoriteNumber, favorite); + edit.putString(Constants.HOME_DIRECTORY_PREF, favorite); edit.commit(); } - public static String getFavorite(Context context, int favoriteNumber) { + public static String getHomeDirectory(Context context) { SharedPreferences prefs = context.getSharedPreferences(Constants.OPEN_FILE_MANAGER_PREFERENCES, 0); - return prefs.getString(Constants.FAVORITE_BASE_PREF + favoriteNumber, ""); + return prefs.getString(Constants.HOME_DIRECTORY_PREF, Constants.SDCARD_DIR); } diff --git a/src/main/java/org/linuxmotion/filemanager/utils/Constants.java b/src/main/java/org/linuxmotion/filemanager/utils/Constants.java index 940ec30..776c579 100644 --- a/src/main/java/org/linuxmotion/filemanager/utils/Constants.java +++ b/src/main/java/org/linuxmotion/filemanager/utils/Constants.java @@ -17,6 +17,7 @@ */ package org.linuxmotion.filemanager.utils; +import android.os.Environment; import android.webkit.MimeTypeMap; public class Constants { @@ -27,7 +28,7 @@ public class Constants { public static final String RESOURCE_VIEW_INTENT = "org.linuxmotion.intent.HANDLE_VIEW_RESOURCE"; - public static final String SDCARD_DIR = "/sdcard"; + public static final String SDCARD_DIR = Environment.getExternalStorageDirectory().getPath(); public static final int REFRESH_UI = 1; @@ -51,7 +52,7 @@ public class Constants { public static final String RIGHT_CUT_PASTE_TUTORIAL_PREF = "right_cut_paste_tutorial"; - public static final String FAVORITE_BASE_PREF = "favorite_base_pref_"; + public static final String HOME_DIRECTORY_PREF = "favorite_base_pref_"; public static MimeTypeMap MIME = MimeTypeMap.getSingleton(); diff --git a/src/main/res/menu/menu_context_actions.xml b/src/main/res/menu/menu_context_actions.xml index cd756cf..e884406 100644 --- a/src/main/res/menu/menu_context_actions.xml +++ b/src/main/res/menu/menu_context_actions.xml @@ -35,4 +35,10 @@ android:icon="@drawable/ic_menu_rating_not_important" android:showAsAction="ifRoom"/> + + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b42cf6d..936dbf5 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -42,5 +42,6 @@ File Folder Favorite + Home From 23a6ea9cfc82f71a08effb27ef94c40bf05b5151 Mon Sep 17 00:00:00 2001 From: John Weyrauch Date: Thu, 25 Jul 2013 10:40:36 -0700 Subject: [PATCH 4/6] Add tablet support Supports large screen sizes Needs cleanup in terms of visual space usage and UX --- .../filemanager/OpenFileManagerActivity.java | 93 +++++++++++++------ .../fragments/SideNavigationFragment.java | 2 + .../models/fragments/SingleViewFragment.java | 6 +- .../res/layout-large/layout_main_content.xml | 30 ++++++ src/main/res/layout/layout_main_content.xml | 11 +++ src/main/res/layout/layout_single_main.xml | 1 - 6 files changed, 114 insertions(+), 29 deletions(-) create mode 100644 src/main/res/layout-large/layout_main_content.xml create mode 100644 src/main/res/layout/layout_main_content.xml diff --git a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java index 9093145..424f630 100644 --- a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java +++ b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java @@ -18,6 +18,8 @@ package org.linuxmotion.filemanager; +import android.app.Activity; +import android.app.Fragment; import android.app.FragmentTransaction; import android.app.ListActivity; import android.content.Context; @@ -47,7 +49,7 @@ -public class OpenFileManagerActivity extends ListActivity implements Alerts.GPLAlertClickDispatcher, +public class OpenFileManagerActivity extends Activity implements Alerts.GPLAlertClickDispatcher, SingleViewFragment.ContextualActionBarMenu, CutPasteFragment.onPasteListener, SideNavigationFragment.GroupClickCallback, SideNavigationFragment.ChildClickCallback, SideNavigationFragment.OnFavoritesCallback, DataBaseHelper.onDatabaseTransactionFinished { @@ -61,7 +63,7 @@ public class OpenFileManagerActivity extends ListActivity implements Alerts.GPLA private SingleViewFragment mSingleView; private CutPasteFragment mCutPasteFragment; private SideNavigationFragment mSideNavigationFragment; - private boolean mDualPane; + private boolean mTabletMode = false; private SlidingMenu mSlidingMenu; private boolean mAttached = false; DataBaseHelper mHelper= new DataBaseHelper(); @@ -74,13 +76,33 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LogWrapper.Logi(TAG, "onCreate called"); - mDualPane = false; + if(findViewById(R.id.sidenavigation_fragment_container) == null){ + mTabletMode = true; + LogWrapper.Logd(TAG, "Starting app in tablet mode"); + } + //mTabletMode = true; + + mHelper.initDatabase(this, this); mHelper.open(); - if (mDualPane) { + if (mTabletMode) { + + setContentView(R.layout.layout_main_content); + + mSingleView = (SingleViewFragment) getFragmentManager().findFragmentById(R.id.main_fragment_container); + mCutPasteFragment = new CutPasteFragment(); + mSideNavigationFragment = new SideNavigationFragment(); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(R.id.main_fragment_container, mSingleView); + ft.replace(R.id.sidenavigation_fragment_container, mSideNavigationFragment); + ft.replace(R.id.cut_paste_fragment_container, mCutPasteFragment); + ft.commit(); + showHideFragment(mCutPasteFragment, false); + // + mSingleView.setContextualActionBarMenuInterface(this); } else { @@ -90,15 +112,15 @@ public void onCreate(Bundle savedInstanceState) { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(android.R.id.content, mSingleView); ft.commit(); - mSingleView.setContextualActionBarMenuInterface(this); } setupSlidingMenu(); - setupFragments(); + } + setupFragments(); setupEULA(this); //always setup the action bar @@ -132,7 +154,8 @@ public void onStop() { public void onBackPressed() { LogWrapper.Logi(TAG, "onBackPressed called"); - if (mDualPane) { + if (mTabletMode) { + mSingleView.onBackPressed(); } else { @@ -141,17 +164,18 @@ public void onBackPressed() { if (mSlidingMenu.isMenuShowing()) { // if a menu is open it need to closed. mSlidingMenu.showContent(); - return; + } else { mSingleView.onBackPressed(); - return; + } } + return; } @@ -285,18 +309,19 @@ private void setupSlidingMenu() { PreferenceUtils.putHasCompletedLeftNavigationTutorial(this, true); } - + // Find the fragments that are now in the view hierarchy + mCutPasteFragment = + (CutPasteFragment) getFragmentManager().findFragmentById(R.id.fragment_cut_paste); + mSideNavigationFragment = (SideNavigationFragment) + getFragmentManager().findFragmentById(R.id.fragment_side_navigation); // mSlidingMenu.setOnClosedListener(this); // mSlidingMenu.setOnOpenedListener(this); } private void setupFragments() { - mCutPasteFragment = - (CutPasteFragment) getFragmentManager().findFragmentById(R.id.fragment_cut_paste); + // Both tablet and phone have the same callbacks mCutPasteFragment.setPasteListener(this); - mSideNavigationFragment = (SideNavigationFragment) - getFragmentManager().findFragmentById(R.id.fragment_side_navigation); mSideNavigationFragment.setChildCallback(this); mSideNavigationFragment.setGroupCallback(this); mSideNavigationFragment.setOnFavoriteAddedCallback(this); @@ -306,9 +331,11 @@ private void setupFragments() { @Override public void OnCutCallback(File[] files) { - if (mDualPane) { + if (mTabletMode) { + + + showHideFragment(mCutPasteFragment, true); - return; } else { mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT); } @@ -329,7 +356,7 @@ public void OnCutCallback(File[] files) { @Override public void OnFirstTimeCutCallback() { - if (mDualPane) { + if (mTabletMode) { return; } @@ -338,8 +365,8 @@ public void OnFirstTimeCutCallback() { @Override public void onPaste(File[] files) { - if (mDualPane) { - + if (mTabletMode) { + showHideFragment(mCutPasteFragment, false); return; } else { mSlidingMenu.setMode(SlidingMenu.LEFT); @@ -351,11 +378,25 @@ public void onPaste(File[] files) { mSingleView.updateAdapter(mSingleView.getCurrentPath()); } + private void showHideFragment(Fragment frag, boolean show) { + FragmentTransaction ft = getFragmentManager().beginTransaction(); + if(show){ + ft.show(frag); + findViewById(R.id.cut_paste_fragment_container).setVisibility(View.VISIBLE); + }else{ + + ft.hide(frag); + findViewById(R.id.cut_paste_fragment_container).setVisibility(View.GONE); + } + + ft.commit(); + } + @Override public void onCancelPaste() { - if (mDualPane) { - + if (mTabletMode) { + showHideFragment(mCutPasteFragment, false); return; } else { mSlidingMenu.setMode(SlidingMenu.LEFT); @@ -369,7 +410,7 @@ public void onCancelPaste() { @Override public boolean OnGroupClick(int groupPosition) { - if (mDualPane) { + if (mTabletMode) { return false; } else { @@ -382,7 +423,7 @@ public boolean OnGroupClick(int groupPosition) { @Override public boolean OnChildClick(String childFilePath, int groupPosition, int childInGroup) { - if (mDualPane) { + if (mTabletMode) { return false; } else { @@ -401,7 +442,7 @@ public void OnChildItemLongClicked(int childPosition) { @Override public void OnFavoriteAdded(String path, int child) { - if (mDualPane) { + if (mTabletMode) { return; } else { @@ -416,7 +457,7 @@ public void OnFavoriteAdded(String path, int child) { @Override public void OnFavoriteRemoved(String path, int group, int child) { LogWrapper.Logi(TAG, "OnFavoriteRemoved() called"); - if (mDualPane) { + if (mTabletMode) { return; } else { @@ -439,7 +480,7 @@ public void OnMenuFavoriteCallback(ExpandableBaseArrayAdapter.Child child) { @Override public boolean OnRenameCallback() { - if (mDualPane) { + if (mTabletMode) { } else { diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java index a588825..7001bcb 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SideNavigationFragment.java @@ -54,6 +54,8 @@ private void setupDrawerListView() { String[] groups = {"Home", "SdCard", "Favorites"}; + if(mOnFavoriteAdded == null) + throw new NullPointerException("Class must implement interface OnFavoriteAdded"); String[] favs = mOnFavoriteAdded.OnFavoritesInitialized(); String[][] children = {{}, {}, favs}; diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java index cc45c2e..7d98d75 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java @@ -3,6 +3,7 @@ import android.app.ActionBar; import android.app.Activity; import android.app.Fragment; +import android.app.ListFragment; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -52,7 +53,7 @@ /** * Created by john on 6/26/13. */ -public class SingleViewFragment extends Fragment implements Alerts.deleteAlertClickDispatcher, openFileManagerBroadcastReceiver.openFileManagerReceiverDispatcher { +public class SingleViewFragment extends ListFragment implements Alerts.deleteAlertClickDispatcher, openFileManagerBroadcastReceiver.openFileManagerReceiverDispatcher { private static final String TAG = SingleViewFragment.class.getSimpleName(); @@ -498,7 +499,7 @@ private void unknown() { protected FileArrayAdapter createAdapter(String path) { // Instatitate a adapter object - return new FileArrayAdapter(this.getActivity(), new File(path)); + return new FileArrayAdapter(getActivity(), new File(path)); } @@ -531,6 +532,7 @@ public interface ContextualActionBarMenu{ } private void setupMainListView() { + LogWrapper.Logi(TAG, "setupMainListView() called"); ListAdapter adapter = createAdapter(mCurrentPath); if (adapter != null) { diff --git a/src/main/res/layout-large/layout_main_content.xml b/src/main/res/layout-large/layout_main_content.xml new file mode 100644 index 0000000..4eae1f3 --- /dev/null +++ b/src/main/res/layout-large/layout_main_content.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/layout_main_content.xml b/src/main/res/layout/layout_main_content.xml new file mode 100644 index 0000000..b9a51eb --- /dev/null +++ b/src/main/res/layout/layout_main_content.xml @@ -0,0 +1,11 @@ + + + + diff --git a/src/main/res/layout/layout_single_main.xml b/src/main/res/layout/layout_single_main.xml index 3687f1c..4fb9beb 100644 --- a/src/main/res/layout/layout_single_main.xml +++ b/src/main/res/layout/layout_single_main.xml @@ -6,7 +6,6 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingLeft="8dp" android:paddingRight="8dp"> From 6186fcb6b5608f920b47f6241c60557b25bd235d Mon Sep 17 00:00:00 2001 From: John Weyrauch Date: Mon, 12 Aug 2013 11:06:52 -0700 Subject: [PATCH 5/6] Fixed layout instantiation logic. Move to new layout qaulifiers. --- .../filemanager/OpenFileManagerActivity.java | 38 ++++++++++++------- .../models/adapters/FileArrayAdapter.java | 1 + .../layout_main_content.xml | 0 3 files changed, 26 insertions(+), 13 deletions(-) rename src/main/res/{layout-large => layout-sw600dp}/layout_main_content.xml (100%) diff --git a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java index 424f630..588fc32 100644 --- a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java +++ b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java @@ -76,10 +76,17 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LogWrapper.Logi(TAG, "onCreate called"); - if(findViewById(R.id.sidenavigation_fragment_container) == null){ + // Setting the content view + setContentView(R.layout.layout_main_content); + mSingleView = (SingleViewFragment) getFragmentManager().findFragmentById(R.id.main_fragment_container); + + if(findViewById(R.id.sidenavigation_fragment_container) != null){ mTabletMode = true; LogWrapper.Logd(TAG, "Starting app in tablet mode"); } + else{ + LogWrapper.Logd(TAG, "Starting app in phone mode"); + } //mTabletMode = true; @@ -88,11 +95,13 @@ public void onCreate(Bundle savedInstanceState) { mHelper.initDatabase(this, this); mHelper.open(); + + if (mTabletMode) { - setContentView(R.layout.layout_main_content); - mSingleView = (SingleViewFragment) getFragmentManager().findFragmentById(R.id.main_fragment_container); + + // mSingleView = (SingleViewFragment) getFragmentManager().findFragmentById(R.id.main_fragment_container); mCutPasteFragment = new CutPasteFragment(); mSideNavigationFragment = new SideNavigationFragment(); FragmentTransaction ft = getFragmentManager().beginTransaction(); @@ -102,17 +111,17 @@ public void onCreate(Bundle savedInstanceState) { ft.commit(); showHideFragment(mCutPasteFragment, false); // - mSingleView.setContextualActionBarMenuInterface(this); + } else { if (savedInstanceState == null) { - mSingleView = new SingleViewFragment(); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(android.R.id.content, mSingleView); - ft.commit(); - mSingleView.setContextualActionBarMenuInterface(this); + // mSingleView = new SingleViewFragment(); + // FragmentTransaction ft = getFragmentManager().beginTransaction(); + // ft.replace(android.R.id.content, mSingleView); + // ft.commit(); + // mSingleView.setContextualActionBarMenuInterface(this); } @@ -120,11 +129,12 @@ public void onCreate(Bundle savedInstanceState) { } + mSingleView.setContextualActionBarMenuInterface(this); setupFragments(); setupEULA(this); //always setup the action bar - setupActionBar(); + setupActionBar(mTabletMode); } @@ -245,10 +255,12 @@ public void onDestroy() { } - private void setupActionBar() { + private void setupActionBar(boolean tabletMode) { - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); + if(!tabletMode){ + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + } getActionBar().setTitle(mSingleView.getCurrentPath()); diff --git a/src/main/java/org/linuxmotion/filemanager/models/adapters/FileArrayAdapter.java b/src/main/java/org/linuxmotion/filemanager/models/adapters/FileArrayAdapter.java index 3ed65fb..01c9b3a 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/adapters/FileArrayAdapter.java +++ b/src/main/java/org/linuxmotion/filemanager/models/adapters/FileArrayAdapter.java @@ -52,6 +52,7 @@ public class FileArrayAdapter extends BaseArrayAdapter { public FileArrayAdapter(Context context, File[] files) { super(context, 0, files); + mImageLoader = new ImageLoader(context, R.drawable.ic_menu_gallery); setupBGImages(context); diff --git a/src/main/res/layout-large/layout_main_content.xml b/src/main/res/layout-sw600dp/layout_main_content.xml similarity index 100% rename from src/main/res/layout-large/layout_main_content.xml rename to src/main/res/layout-sw600dp/layout_main_content.xml From ed0c1ffa09141492d0375346b908f303772f8a46 Mon Sep 17 00:00:00 2001 From: John Weyrauch Date: Thu, 29 Aug 2013 15:50:57 -0700 Subject: [PATCH 6/6] Update project for new module Parchment *Adds integration of Parchment module. This module provides functionality to edit txt based documents --- build.gradle | 3 +- src/main/AndroidManifest.xml | 4 ++- .../filemanager/OpenFileManagerActivity.java | 4 +-- .../models/fragments/SingleViewFragment.java | 31 +++++++++++++------ .../filemanager/utils/Constants.java | 11 ++++++- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index dad5dab..9a2f4c0 100644 --- a/build.gradle +++ b/build.gradle @@ -9,9 +9,10 @@ buildscript { apply plugin: 'android' dependencies { - compile 'com.android.support:support-v4:13.0.0' + compile 'com.android.support:support-v4:18.0.0' compile project(':AsyncLoaders') compile project(':slidingmenu') + compile project(':parchment') } android { diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 2a1cb63..08b3c9f 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -21,7 +21,6 @@ > - @@ -29,6 +28,9 @@ android:name="org.linuxmotion.filemanager.preferences.ApplicationSettings" android:label="@string/app_name"> + + + \ No newline at end of file diff --git a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java index 588fc32..3cb7ec5 100644 --- a/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java +++ b/src/main/java/org/linuxmotion/filemanager/OpenFileManagerActivity.java @@ -217,7 +217,7 @@ public boolean onOptionsItemSelected(MenuItem item) { break; case R.id.menu_left: { sendBroadcast(SingleViewFragment.prepareBroadcast(null, Constants.UPDATE_INTENT, - new MenuAction(MenuAction.ACTION_BACK))); + new MenuAction(MenuAction.ACTION_BACK), null)); } break; @@ -227,7 +227,7 @@ public boolean onOptionsItemSelected(MenuItem item) { break; case R.id.menu_forward: { sendBroadcast(SingleViewFragment.prepareBroadcast(null, Constants.UPDATE_INTENT, - new MenuAction(MenuAction.ACTION_FORWARD))); + new MenuAction(MenuAction.ACTION_FORWARD), null)); } break; diff --git a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java index 7d98d75..a2603df 100644 --- a/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java +++ b/src/main/java/org/linuxmotion/filemanager/models/fragments/SingleViewFragment.java @@ -34,6 +34,7 @@ import org.linuxmotion.asyncloaders.LogWrapper; import org.linuxmotion.filemanager.R; +import org.linuxmotion.filemanager.models.ExtendedMimeTypeMap; import org.linuxmotion.filemanager.models.MenuAction; import org.linuxmotion.filemanager.models.adapters.ExpandableDrawerListAdapter; import org.linuxmotion.filemanager.models.adapters.FileArrayAdapter; @@ -87,7 +88,7 @@ public void handleMessage(Message msg) { switch (msg.what) { case Constants.REFRESH_UI: - getActivity().sendBroadcast(prepareBroadcast(mCurrentPath, Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_FORWARD))); + getActivity().sendBroadcast(prepareBroadcast(mCurrentPath, Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_FORWARD), null)); //createBroadCast(mCurrentPath); case Constants.UNKNOWN_FILE_TYPE: @@ -195,7 +196,7 @@ public void onBackPressed() { // navigate up - sendBroadcast(prepareBroadcast(null, Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_UP))); + sendBroadcast(prepareBroadcast(null, Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_UP), null)); } @@ -901,16 +902,16 @@ public void selectDrawerItem(int position) { } // Tell the UI to update - sendBroadcast(prepareBroadcast(mCurrentPath, Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_FORWARD))); + sendBroadcast(prepareBroadcast(mCurrentPath, Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_FORWARD), null)); // Close the drawer //mDrawerLayout.closeDrawer(mDrawerList); } - public static Intent prepareBroadcast(String f, String type, MenuAction action) { + public static Intent prepareBroadcast(String f, String type, MenuAction action, Context context) { - Intent intent = new Intent(Constants.RESOURCE_VIEW_INTENT); + Intent intent = new Intent(type); if (type.equals(Constants.UPDATE_INTENT)) { intent = new Intent(Constants.UPDATE_INTENT); @@ -918,7 +919,14 @@ public static Intent prepareBroadcast(String f, String type, MenuAction action) intent.putExtra("ACTION", action.getCurrentAction()); } else if (type.equals(Constants.RESOURCE_VIEW_INTENT)) { - intent.putExtra("RESOURCE", f); + Intent i = new Intent(Intent.ACTION_VIEW); + i.putExtra("RESOURCE", f); + String ext = ExtendedMimeTypeMap.getFileExtensionFromUrl(f); + String itype = Constants.MIME.getMimeTypeFromExtension(ext); + LogWrapper.Logd(TAG, "ext = " + ext); + LogWrapper.Logd(TAG, "File = " + f); + i.setType(itype); + intent = i; } return intent; @@ -932,10 +940,10 @@ public void performClick(File f) { Log.d(TAG, "Sending UI refresh broadcast [dir=" + f.toString() + "]"); PreferenceUtils.resetExitStatus(this.getActivity()); - sendBroadcast(prepareBroadcast(f.getPath(), Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_FORWARD))); + sendBroadcast(prepareBroadcast(f.getPath(), Constants.UPDATE_INTENT, new MenuAction(MenuAction.ACTION_FORWARD), null)); } else { Log.d(TAG, "Sending media broadcast"); - sendBroadcast(prepareBroadcast(f.toString(), Constants.RESOURCE_VIEW_INTENT, null)); + sendBroadcast(prepareBroadcast(f.toString(), Constants.RESOURCE_VIEW_INTENT, null, getActivity())); } @@ -948,7 +956,12 @@ private ActionBar getActionBar() { } private void sendBroadcast(Intent i) { - this.getActivity().sendBroadcast(i); + if (i.hasExtra("RESOURCE")){ + LogWrapper.Logd(TAG, "Starting an activity rather than sending a broadcast"); + getActivity().startActivity(i); + } + + getActivity().sendBroadcast(i); } diff --git a/src/main/java/org/linuxmotion/filemanager/utils/Constants.java b/src/main/java/org/linuxmotion/filemanager/utils/Constants.java index 776c579..5c87e32 100644 --- a/src/main/java/org/linuxmotion/filemanager/utils/Constants.java +++ b/src/main/java/org/linuxmotion/filemanager/utils/Constants.java @@ -17,9 +17,16 @@ */ package org.linuxmotion.filemanager.utils; +import android.content.ContentResolver; +import android.content.Context; +import android.net.Uri; import android.os.Environment; import android.webkit.MimeTypeMap; +import org.linuxmotion.filemanager.models.ExtendedMimeTypeMap; + +import java.io.File; + public class Constants { public static final boolean FULL_DBG = false; @@ -55,7 +62,9 @@ public class Constants { public static final String HOME_DIRECTORY_PREF = "favorite_base_pref_"; - public static MimeTypeMap MIME = MimeTypeMap.getSingleton(); + public static ExtendedMimeTypeMap MIME = ExtendedMimeTypeMap.getSingleton(); + + }