From 25a1b863075dd005776d7c0dd4b7ee518ef1de2d Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Mon, 1 Sep 2014 21:01:18 -0400 Subject: [PATCH] Add BookmarkActivity that allows centralized management of bookmarks --- AndroidManifest.xml | 12 ++ res/layout/advanced_settings.xml | 41 ---- res/layout/bookmark_activity.xml | 91 +++++++++ res/layout/license_activity.xml | 4 +- res/layout/settings.xml | 26 +++ res/values/strings.xml | 6 + .../lightning/AdvancedSettingsActivity.java | 23 +-- .../browser/lightning/BookmarkActivity.java | 175 ++++++++++++++++++ .../browser/lightning/BookmarkManager.java | 54 +++++- .../browser/lightning/BrowserActivity.java | 4 +- .../browser/lightning/LicenseActivity.java | 8 +- src/acr/browser/lightning/SearchAdapter.java | 4 +- .../browser/lightning/SettingsActivity.java | 10 + 13 files changed, 380 insertions(+), 78 deletions(-) create mode 100644 res/layout/bookmark_activity.xml create mode 100644 src/acr/browser/lightning/BookmarkActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 68e4cb6..ea7b8bf 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -150,6 +150,18 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/advanced_settings.xml b/res/layout/advanced_settings.xml index 86908b1..d518a53 100644 --- a/res/layout/advanced_settings.xml +++ b/res/layout/advanced_settings.xml @@ -776,47 +776,6 @@ android:textAppearance="?android:attr/textAppearanceMedium" /> - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/license_activity.xml b/res/layout/license_activity.xml index 61a0bfa..dfc823f 100644 --- a/res/layout/license_activity.xml +++ b/res/layout/license_activity.xml @@ -5,7 +5,7 @@ android:orientation="vertical" > + + + + + + + File Chooser NetCipher GNU Lesser General Public License + Export bookmarks to backup + Import bookmarks from backup + Bookmarks exported to + Bookmark Settings + Could not import bookmarks from file + Choose a file diff --git a/src/acr/browser/lightning/AdvancedSettingsActivity.java b/src/acr/browser/lightning/AdvancedSettingsActivity.java index ff673c5..87c1eed 100644 --- a/src/acr/browser/lightning/AdvancedSettingsActivity.java +++ b/src/acr/browser/lightning/AdvancedSettingsActivity.java @@ -70,7 +70,7 @@ public class AdvancedSettingsActivity extends Activity { private void initialize() { - RelativeLayout r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, rIncognitoCookies, rClearCache, rSearchSuggestions, rClearHistoryExit, rClearCookiesExit; + RelativeLayout r1, r2, r3, r4, r5, r6, r7, r8, r10, r11, r12, r13, r14, r15, rIncognitoCookies, rClearCache, rSearchSuggestions, rClearHistoryExit, rClearCookiesExit; r1 = (RelativeLayout) findViewById(R.id.r1); r2 = (RelativeLayout) findViewById(R.id.r2); @@ -82,7 +82,6 @@ public class AdvancedSettingsActivity extends Activity { r6 = (RelativeLayout) findViewById(R.id.r6); r7 = (RelativeLayout) findViewById(R.id.r7); r8 = (RelativeLayout) findViewById(R.id.rClearHistory); - r9 = (RelativeLayout) findViewById(R.id.r9); r10 = (RelativeLayout) findViewById(R.id.r10); r11 = (RelativeLayout) findViewById(R.id.r11); r12 = (RelativeLayout) findViewById(R.id.r12); @@ -144,7 +143,6 @@ public class AdvancedSettingsActivity extends Activity { r6(r6); r7(r7); r8(r8); - r9(r9); r10(r10); r11(r11); r12(r12); @@ -170,7 +168,6 @@ public class AdvancedSettingsActivity extends Activity { cbIncognitoCookies(cbIncognitoCookies); cbSearchSuggestions(cbSearchSuggestions); - TextView importBookmarks = (TextView) findViewById(R.id.isImportAvailable); TextView syncHistory = (TextView) findViewById(R.id.isBrowserAvailable); RelativeLayout layoutSyncHistory = (RelativeLayout) findViewById(R.id.rBrowserHistory); @@ -195,13 +192,11 @@ public class AdvancedSettingsActivity extends Activity { if (!mSystemBrowser) { cbSyncHistory.setChecked(false); cbSyncHistory.setEnabled(false); - importBookmarks.setText(getResources().getString(R.string.stock_browser_unavailable)); syncHistory.setText(getResources().getString(R.string.stock_browser_unavailable)); } else { cbSyncHistory.setEnabled(true); cbSyncHistory.setChecked(mPreferences .getBoolean(PreferenceConstants.SYNC_HISTORY, true)); - importBookmarks.setText(getResources().getString(R.string.stock_browser_available)); syncHistory.setText(getResources().getString(R.string.stock_browser_available)); } @@ -726,22 +721,6 @@ public class AdvancedSettingsActivity extends Activity { messageHandler.sendEmptyMessage(2); } - private void r9(RelativeLayout view) { - - view.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - try { - importFromStockBrowser(); - } catch (Exception e) { - // ignored exception - // TODO add logging - } - } - }); - } - private void r10(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { diff --git a/src/acr/browser/lightning/BookmarkActivity.java b/src/acr/browser/lightning/BookmarkActivity.java new file mode 100644 index 0000000..ccdc71c --- /dev/null +++ b/src/acr/browser/lightning/BookmarkActivity.java @@ -0,0 +1,175 @@ +package acr.browser.lightning; + +import java.io.File; +import java.util.Arrays; +import java.util.Comparator; + +import android.app.ActionBar; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Environment; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class BookmarkActivity extends Activity implements OnClickListener { + + private BookmarkManager mBookmarkManager; + private boolean mSystemBrowser; + private SharedPreferences mPreferences; + private File[] mFileList; + private String[] mFileNameList; + private File mPath = new File(Environment.getExternalStorageDirectory().toString()); + private static final int DIALOG_LOAD_FILE = 1000; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.bookmark_activity); + + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + } + + LinearLayout exportBackup = (LinearLayout) findViewById(R.id.exportBackup); + LinearLayout importBackup = (LinearLayout) findViewById(R.id.importBackup); + LinearLayout importFromBrowser = (LinearLayout) findViewById(R.id.importFromBrowser); + + TextView importBookmarks = (TextView) findViewById(R.id.isImportBrowserAvailable); + + mBookmarkManager = new BookmarkManager(this); + + mPreferences = getSharedPreferences(PreferenceConstants.PREFERENCES, 0); + + mSystemBrowser = mPreferences.getBoolean(PreferenceConstants.SYSTEM_BROWSER_PRESENT, false); + + exportBackup.setOnClickListener(this); + importBackup.setOnClickListener(this); + importFromBrowser.setOnClickListener(this); + + if (mSystemBrowser) { + importBookmarks.setText(getResources().getString(R.string.stock_browser_available)); + } else { + importBookmarks.setText(getResources().getString(R.string.stock_browser_unavailable)); + } + + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.importBackup: + loadFileList(null); + onCreateDialog(DIALOG_LOAD_FILE); + break; + case R.id.importFromBrowser: + mBookmarkManager.importBookmarksFromBrowser(); + break; + case R.id.exportBackup: + mBookmarkManager.exportBookmarks(); + break; + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + finish(); + return true; + } + + private void loadFileList(File path) { + File file; + if (path != null) { + file = path; + } else { + file = mPath; + } + try { + file.mkdirs(); + } catch (SecurityException e) { + e.printStackTrace(); + } + if (file.exists()) { + mFileList = file.listFiles(); + } else { + mFileList = new File[0]; + } + + Arrays.sort(mFileList, new SortFileName()); + Arrays.sort(mFileList, new SortFolders()); + + if (mFileList == null) { + mFileNameList = new String[0]; + mFileList = new File[0]; + } else { + mFileNameList = new String[mFileList.length]; + } + for (int n = 0; n < mFileList.length; n++) { + mFileNameList[n] = mFileList[n].getName(); + } + } + + protected Dialog onCreateDialog(int id) { + Dialog dialog = null; + final AlertDialog.Builder builder = new Builder(this); + + switch (id) { + case DIALOG_LOAD_FILE: + builder.setTitle(R.string.title_chooser); + if (mFileList == null) { + dialog = builder.create(); + return dialog; + } + builder.setItems(mFileNameList, new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + if (mFileList[which].isDirectory()) { + loadFileList(mFileList[which]); + builder.setItems(mFileNameList, this); + builder.show(); + } else { + mBookmarkManager.importBookmarksFromFile(mFileList[which]); + } + } + + }); + break; + } + dialog = builder.show(); + return dialog; + } + + public class SortFileName implements Comparator { + + @Override + public int compare(File f1, File f2) { + return f1.getName().compareTo(f2.getName()); + } + + } + + public class SortFolders implements Comparator { + + @Override + public int compare(File f1, File f2) { + if (f1.isDirectory() == f2.isDirectory()) + return 0; + else if (f1.isDirectory() && !f2.isDirectory()) + return -1; + else + return 1; + } + } + +} diff --git a/src/acr/browser/lightning/BookmarkManager.java b/src/acr/browser/lightning/BookmarkManager.java index b4f77d3..536ee64 100644 --- a/src/acr/browser/lightning/BookmarkManager.java +++ b/src/acr/browser/lightning/BookmarkManager.java @@ -8,7 +8,10 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.SortedMap; import java.util.TreeMap; @@ -19,6 +22,7 @@ import android.content.Context; import android.database.Cursor; import android.os.Environment; import android.provider.Browser; +import android.widget.Toast; public class BookmarkManager { @@ -103,7 +107,7 @@ public class BookmarkManager { public synchronized boolean deleteBookmark(String url) { List list = new ArrayList(); mBookmarkMap.remove(url); - list = getBookmarks(); + list = getBookmarks(false); File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); boolean bookmarkDeleted = false; try { @@ -135,10 +139,17 @@ public class BookmarkManager { * external download directory */ public synchronized void exportBookmarks() { - List bookmarkList = getBookmarks(); + List bookmarkList = getBookmarks(true); File bookmarksExport = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "BookmarksExport.txt"); + int counter = 0; + while (bookmarksExport.exists()) { + counter++; + bookmarksExport = new File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + "BookmarksExport-" + counter + ".txt"); + } try { BufferedWriter bookmarkWriter = new BufferedWriter(new FileWriter(bookmarksExport, false)); @@ -152,11 +163,16 @@ public class BookmarkManager { bookmarkWriter.newLine(); } bookmarkWriter.close(); + Toast.makeText( + mContext, + mContext.getString(R.string.bookmark_export_path) + " " + + bookmarksExport.getPath(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } + } /** @@ -164,7 +180,7 @@ public class BookmarkManager { * * @return */ - public synchronized List getBookmarks() { + public synchronized List getBookmarks(boolean sort) { List bookmarks = new ArrayList(); File bookmarksFile = new File(mContext.getFilesDir(), FILE_BOOKMARKS); try { @@ -188,6 +204,9 @@ public class BookmarkManager { } catch (JSONException e) { e.printStackTrace(); } + if (sort) { + Collections.sort(bookmarks, new SortIgnoreCase()); + } return bookmarks; } @@ -335,12 +354,16 @@ public class BookmarkManager { * @param dir * @param file */ - public synchronized void importBookmarksFromFile(File dir, String file) { - File bookmarksImport = new File(dir, file); + public synchronized void importBookmarksFromFile(File file) { + if (file == null) { + return; + } + File bookmarksImport = file; List list = new ArrayList(); try { BufferedReader bookmarksReader = new BufferedReader(new FileReader(bookmarksImport)); String line; + int number = 0; while ((line = bookmarksReader.readLine()) != null) { JSONObject object = new JSONObject(line); HistoryItem item = new HistoryItem(); @@ -349,15 +372,27 @@ public class BookmarkManager { item.setFolder(object.getString(FOLDER)); item.setOrder(object.getInt(ORDER)); list.add(item); + number++; } bookmarksReader.close(); addBookmarkList(list); + Utils.showToast(mContext, + number + " " + mContext.getResources().getString(R.string.message_import)); } catch (FileNotFoundException e) { e.printStackTrace(); + Utils.createInformativeDialog(mContext, + mContext.getResources().getString(R.string.title_error), mContext + .getResources().getString(R.string.import_bookmark_error)); } catch (IOException e) { e.printStackTrace(); + Utils.createInformativeDialog(mContext, + mContext.getResources().getString(R.string.title_error), mContext + .getResources().getString(R.string.import_bookmark_error)); } catch (JSONException e) { e.printStackTrace(); + Utils.createInformativeDialog(mContext, + mContext.getResources().getString(R.string.title_error), mContext + .getResources().getString(R.string.import_bookmark_error)); } } @@ -388,4 +423,13 @@ public class BookmarkManager { e.printStackTrace(); } } + + private class SortIgnoreCase implements Comparator { + + public int compare(HistoryItem o1, HistoryItem o2) { + return o1.getTitle().toLowerCase(Locale.getDefault()) + .compareTo(o2.getTitle().toLowerCase(Locale.getDefault())); + } + + } } diff --git a/src/acr/browser/lightning/BrowserActivity.java b/src/acr/browser/lightning/BrowserActivity.java index d74eda1..9468f65 100644 --- a/src/acr/browser/lightning/BrowserActivity.java +++ b/src/acr/browser/lightning/BrowserActivity.java @@ -185,7 +185,7 @@ public class BrowserActivity extends Activity implements BrowserController { mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); mDrawerList.setOnItemLongClickListener(new DrawerItemLongClickListener()); - mBookmarkList = mBookmarkManager.getBookmarks(); + mBookmarkList = mBookmarkManager.getBookmarks(true); mBookmarkAdapter = new BookmarkViewAdapter(this, R.layout.bookmark_list_item, mBookmarkList); mDrawerListRight.setAdapter(mBookmarkAdapter); mDrawerListRight.setOnItemClickListener(new BookmarkItemClickListener()); @@ -1275,7 +1275,7 @@ public class BrowserActivity extends Activity implements BrowserController { } else if (!mHistoryHandler.isOpen()) { mHistoryHandler = new HistoryDatabaseHandler(this); } - mBookmarkList = mBookmarkManager.getBookmarks(); + mBookmarkList = mBookmarkManager.getBookmarks(true); notifyBookmarkDataSetChanged(); } else { initialize(); diff --git a/src/acr/browser/lightning/LicenseActivity.java b/src/acr/browser/lightning/LicenseActivity.java index fe38949..64eb222 100644 --- a/src/acr/browser/lightning/LicenseActivity.java +++ b/src/acr/browser/lightning/LicenseActivity.java @@ -23,8 +23,8 @@ public class LicenseActivity extends Activity implements View.OnClickListener { setContentView(R.layout.license_activity); getActionBar().setHomeButtonEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true); - findViewById(R.id.browserLicense).setOnClickListener(this); - findViewById(R.id.licenseAOSP).setOnClickListener(this); + findViewById(R.id.exportBackup).setOnClickListener(this); + findViewById(R.id.importBackup).setOnClickListener(this); findViewById(R.id.licenseHosts).setOnClickListener(this); findViewById(R.id.licenseOrbot).setOnClickListener(this); } @@ -32,10 +32,10 @@ public class LicenseActivity extends Activity implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { - case R.id.browserLicense: + case R.id.exportBackup: actionView("http://www.mozilla.org/MPL/2.0/"); break; - case R.id.licenseAOSP: + case R.id.importBackup: actionView("http://www.apache.org/licenses/LICENSE-2.0"); break; case R.id.licenseHosts: diff --git a/src/acr/browser/lightning/SearchAdapter.java b/src/acr/browser/lightning/SearchAdapter.java index 2b849ee..749fa26 100644 --- a/src/acr/browser/lightning/SearchAdapter.java +++ b/src/acr/browser/lightning/SearchAdapter.java @@ -46,7 +46,7 @@ public class SearchAdapter extends BaseAdapter implements Filterable { mBookmarks = new ArrayList(); mSuggestions = new ArrayList(); mBookmarkManager = new BookmarkManager(context); - mAllBookmarks = mBookmarkManager.getBookmarks(); + mAllBookmarks = mBookmarkManager.getBookmarks(true); mPreferences = context.getSharedPreferences(PreferenceConstants.PREFERENCES, 0); mUseGoogle = mPreferences.getBoolean(PreferenceConstants.GOOGLE_SEARCH_SUGGESTIONS, true); mContext = context; @@ -61,7 +61,7 @@ public class SearchAdapter extends BaseAdapter implements Filterable { } public void refreshBookmarks() { - mAllBookmarks = mBookmarkManager.getBookmarks(); + mAllBookmarks = mBookmarkManager.getBookmarks(true); } @Override diff --git a/src/acr/browser/lightning/SettingsActivity.java b/src/acr/browser/lightning/SettingsActivity.java index 966c5c0..532787c 100644 --- a/src/acr/browser/lightning/SettingsActivity.java +++ b/src/acr/browser/lightning/SettingsActivity.java @@ -85,6 +85,16 @@ public class SettingsActivity extends Activity { RelativeLayout layoutFlash = (RelativeLayout) findViewById(R.id.layoutFlash); RelativeLayout layoutBlockAds = (RelativeLayout) findViewById(R.id.layoutAdBlock); RelativeLayout layoutOrbot = (RelativeLayout) findViewById(R.id.layoutUseOrbot); + RelativeLayout layoutBookmarks = (RelativeLayout) findViewById(R.id.layoutBookmarks); + + layoutBookmarks.setOnClickListener(new OnClickListener(){ + + @Override + public void onClick(View v) { + startActivity(new Intent(mContext, BookmarkActivity.class)); + } + + }); mSearchText = (TextView) findViewById(R.id.searchText); mRenderText = (TextView) findViewById(R.id.renderText);