/*
* Tint Browser for Android
*
* Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 3 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package com.seal.ui.activities;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import com.seal.R;
import com.seal.addons.AddonMenuItem;
import com.seal.controllers.Controller;
import com.seal.providers.BookmarksWrapper;
import com.seal.tasks.HistoryBookmarksExportTask;
import com.seal.tasks.HistoryBookmarksImportTask;
import com.seal.ui.fragments.BookmarksFragment;
import com.seal.ui.fragments.HistoryFragment;
import com.seal.ui.managers.UIManager;
import com.seal.ui.preferences.IHistoryBookmaksExportListener;
import com.seal.ui.preferences.IHistoryBookmaksImportListener;
import com.seal.ui.tabs.GenericTabListener;
import com.seal.utils.ApplicationUtils;
import com.seal.utils.Constants;
import com.seal.utils.IOUtils;
public class BookmarksActivity extends Activity implements IHistoryBookmaksExportListener, IHistoryBookmaksImportListener {
private static final String EXTRA_SELECTED_TAB_INDEX = "EXTRA_SELECTED_TAB_INDEX";
private UIManager mUIManager;
private ProgressDialog mProgress;
private HistoryBookmarksImportTask mImportTask;
private HistoryBookmarksExportTask mExportTask;
private static final AtomicReference<AsyncTask<String, Integer, String>> mImportSyncThread = new AtomicReference<AsyncTask<String, Integer, String>>();
private static final AtomicReference<AsyncTask<Cursor, Integer, String>> mExportSyncThread = new AtomicReference<AsyncTask<Cursor, Integer, String>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.BookmarksTitle);
mUIManager = Controller.getInstance().getUIManager();
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
Tab tab = actionBar.newTab();
tab.setText(R.string.BookmarksTabTitle);
tab.setTabListener(new GenericTabListener<BookmarksFragment>(this, "bookmarks", BookmarksFragment.class));
actionBar.addTab(tab);
tab = actionBar.newTab();
tab.setText(R.string.HistoryTabTitle);
tab.setTabListener(new GenericTabListener<HistoryFragment>(this, "history", HistoryFragment.class));
actionBar.addTab(tab);
if ((savedInstanceState != null) && (savedInstanceState.containsKey(EXTRA_SELECTED_TAB_INDEX))) {
int selectedIndex = savedInstanceState.getInt(EXTRA_SELECTED_TAB_INDEX);
if ((selectedIndex == 0) || (selectedIndex == 1)) {
actionBar.setSelectedNavigationItem(selectedIndex);
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_SELECTED_TAB_INDEX, getActionBar().getSelectedNavigationIndex());
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.bookmarks_activity_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (getActionBar().getSelectedNavigationIndex() == 0) {
menu.findItem(R.id.BookmarksActivityMenuSortBookmarks).setVisible(true);
} else {
menu.findItem(R.id.BookmarksActivityMenuSortBookmarks).setVisible(false);
}
menu.removeGroup(R.id.BookmarksActivity_AddonsMenuGroup);
List<AddonMenuItem> contributedMenuItems = Controller.getInstance().getAddonManager()
.getContributedHistoryBookmarksMenuItems(mUIManager.getCurrentWebView());
for (AddonMenuItem item : contributedMenuItems) {
menu.add(R.id.BookmarksActivity_AddonsMenuGroup, item.getAddon().getMenuId(), 0, item.getMenuItem());
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
setResult(RESULT_CANCELED);
finish();
return true;
case R.id.BookmarksActivityMenuAddBookmark:
Intent i = new Intent(this, EditBookmarkActivity.class);
i.putExtra(Constants.EXTRA_ID, -1);
startActivity(i);
return true;
case R.id.BookmarksActivityMenuSortBookmarks:
changeSortMode();
return true;
case R.id.BookmarksActivityMenuImportHistoryBookmarks:
importHistoryBookmarks();
return true;
case R.id.BookmarksActivityMenuExportHistoryBookmarks:
exportHistoryBookmarks();
return true;
case R.id.BookmarksActivityMenuClearHistoryBookmarks:
clearHistoryBookmarks();
return true;
default:
if (Controller.getInstance().getAddonManager()
.onContributedHistoryBookmarksMenuItemSelected(this, item.getItemId(), mUIManager.getCurrentWebView())) {
return true;
} else {
return super.onContextItemSelected(item);
}
}
}
@Override
public void onExportProgress(int step, int progress, int total) {
switch (step) {
case 0:
mProgress.setMessage(getString(R.string.HistoryBookmarksExportCheckCardMessage));
break;
case 1:
mProgress.setMessage(String.format(getString(R.string.HistoryBookmarksExportProgressMessage), progress, total));
break;
default:
break;
}
}
@Override
public void onExportDone(String message) {
mExportSyncThread.compareAndSet(mExportTask, null);
mProgress.dismiss();
if (message != null) {
ApplicationUtils.showErrorDialog(this, getString(R.string.HistoryBookmarksExportErrorTitle),
String.format(getString(R.string.HistoryBookmarksExportErrorMessage), message));
}
}
@Override
public void onImportProgress(int step, int progress, int total) {
switch (step) {
case 0:
mProgress.setMessage(getString(R.string.HistoryBookmarksImportReadingFile));
break;
case 1:
mProgress.setMessage(getString(R.string.HistoryBookmarksImportParsingFile));
break;
case 2:
mProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportProgressMessage), progress, total));
break;
case 3:
mProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportFoldersProgressMessage), progress, total));
break;
case 4:
mProgress.setMessage(getString(R.string.HistoryBookmarksImportFoldersLinkMessage));
break;
case 5:
mProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportBookmarksProgressMessage), progress, total));
break;
case 6:
mProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportHistoryProgressMessage), progress, total));
break;
case 7:
mProgress.setMessage(getString(R.string.HistoryBookmarksImportInsertMessage));
break;
default:
break;
}
}
@Override
public void onImportDone(String message) {
mImportSyncThread.compareAndSet(mImportTask, null);
mProgress.dismiss();
if (message != null) {
ApplicationUtils.showErrorDialog(this, getString(R.string.HistoryBookmarksImportErrorTitle),
String.format(getString(R.string.HistoryBookmarksImportErrorMessage), message));
}
}
private void importHistoryBookmarks() {
List<String> exportedFiles = IOUtils.getExportedBookmarksFileList();
final String[] choices = exportedFiles.toArray(new String[exportedFiles.size()]);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle(getResources().getString(R.string.HistoryBookmarksImportSourceTitle));
builder.setSingleChoiceItems(choices, 0, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mImportTask = new HistoryBookmarksImportTask(BookmarksActivity.this, BookmarksActivity.this);
mProgress = ProgressDialog.show(BookmarksActivity.this, getString(R.string.HistoryBookmarksImportTitle),
getString(R.string.HistoryBookmarksImportInitialMessage), true, false);
mProgress.show();
boolean retVal = mImportSyncThread.compareAndSet(null, mImportTask);
if (retVal) {
mImportTask.execute(choices[which]);
}
}
});
builder.setCancelable(true);
builder.setNegativeButton(R.string.Cancel, null);
AlertDialog alert = builder.create();
alert.show();
}
private void exportHistoryBookmarks() {
mExportTask = new HistoryBookmarksExportTask(this, this);
mProgress = ProgressDialog.show(this, getString(R.string.HistoryBookmarksExportTitle), getString(R.string.HistoryBookmarksExportInitialMessage), true,
false);
mProgress.show();
boolean retVal = mExportSyncThread.compareAndSet(null, mExportTask);
if (retVal) {
mExportTask.execute(BookmarksWrapper.getAllHistoryBookmarks(getContentResolver()));
}
}
private void clearHistoryBookmarks() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle(getResources().getString(R.string.HistoryBookmarksClearTitle));
builder.setSingleChoiceItems(getResources().getStringArray(R.array.ClearHistoryBookmarksChoice), 0, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch (which) {
case 0:
BookmarksWrapper.clearHistoryAndOrBookmarks(getContentResolver(), true, false);
break;
case 1:
BookmarksWrapper.clearHistoryAndOrBookmarks(getContentResolver(), false, true);
break;
case 2:
BookmarksWrapper.clearHistoryAndOrBookmarks(getContentResolver(), true, true);
break;
default:
break;
}
}
});
builder.setCancelable(true);
builder.setNegativeButton(R.string.Cancel, null);
AlertDialog alert = builder.create();
alert.show();
}
private void changeSortMode() {
int currentSort = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.PREFERENCE_BOOKMARKS_SORT_MODE, 0);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setInverseBackgroundForced(true);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle(getResources().getString(R.string.SortBookmarks));
builder.setSingleChoiceItems(new String[] { getResources().getString(R.string.MostUsedSortMode), getResources().getString(R.string.AlphaSortMode),
getResources().getString(R.string.RecentSortMode) }, currentSort, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Editor editor = PreferenceManager.getDefaultSharedPreferences(BookmarksActivity.this).edit();
editor.putInt(Constants.PREFERENCE_BOOKMARKS_SORT_MODE, which);
editor.commit();
dialog.dismiss();
}
});
builder.setCancelable(true);
builder.setNegativeButton(android.R.string.cancel, null);
AlertDialog alert = builder.create();
alert.show();
}
}