/*
* Zirco Browser for Android
*
* Copyright (C) 2010 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 org.zirco.ui.activities;
import org.zirco.R;
import org.zirco.model.adapters.BookmarksCursorAdapter;
import org.zirco.model.items.BookmarkItem;
import org.zirco.providers.BookmarksProviderWrapper;
import org.zirco.utils.ApplicationUtils;
import org.zirco.utils.Constants;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Browser;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LayoutAnimationController;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
/**
* Bookmarks list activity.
*/
public class BookmarksListActivity extends Activity {
private static final int MENU_ADD_BOOKMARK = Menu.FIRST;
private static final int MENU_SORT_MODE = Menu.FIRST + 1;
private static final int MENU_OPEN_IN_TAB = Menu.FIRST + 10;
private static final int MENU_COPY_URL = Menu.FIRST + 11;
private static final int MENU_SHARE = Menu.FIRST + 12;
private static final int MENU_EDIT_BOOKMARK = Menu.FIRST + 13;
private static final int MENU_DELETE_BOOKMARK = Menu.FIRST + 14;
private static final int ACTIVITY_ADD_BOOKMARK = 0;
private static final int ACTIVITY_EDIT_BOOKMARK = 1;
private Cursor mCursor;
private BookmarksCursorAdapter mCursorAdapter;
private ListView mList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bookmarks_list_activity);
setTitle(R.string.BookmarksListActivity_Title);
View emptyView = findViewById(R.id.BookmarksListActivity_EmptyTextView);
mList = (ListView) findViewById(R.id.BookmarksListActivity_List);
mList.setEmptyView(emptyView);
mList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> l, View v, int position, long id) {
Intent result = new Intent();
result.putExtra(Constants.EXTRA_ID_NEW_TAB, false);
BookmarkItem item = BookmarksProviderWrapper.getStockBookmarkById(getContentResolver(), id);
if (item != null) {
result.putExtra(Constants.EXTRA_ID_URL, item.getUrl());
} else {
result.putExtra(Constants.EXTRA_ID_URL,
PreferenceManager.getDefaultSharedPreferences(BookmarksListActivity.this).getString(Constants.PREFERENCES_GENERAL_HOME_PAGE, Constants.URL_ABOUT_START));
}
if (getParent() != null) {
getParent().setResult(RESULT_OK, result);
} else {
setResult(RESULT_OK, result);
}
finish();
}
});
registerForContextMenu(mList);
fillData();
}
@Override
protected void onDestroy() {
mCursor.close();
super.onDestroy();
}
/**
* Fill the bookmark to the list UI.
*/
private void fillData() {
mCursor = BookmarksProviderWrapper.getStockBookmarks(getContentResolver(),
PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.PREFERENCES_BOOKMARKS_SORT_MODE, 0));
startManagingCursor(mCursor);
String[] from = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};
int[] to = new int[] {R.id.BookmarkRow_Title, R.id.BookmarkRow_Url};
mCursorAdapter = new BookmarksCursorAdapter(this,
R.layout.bookmark_row,
mCursor,
from,
to,
ApplicationUtils.getFaviconSizeForBookmarks(this));
mList.setAdapter(mCursorAdapter);
setAnimation();
}
/**
* Set the list loading animation.
*/
private void setAnimation() {
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(100);
set.addAnimation(animation);
animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f
);
animation.setDuration(100);
set.addAnimation(animation);
LayoutAnimationController controller =
new LayoutAnimationController(set, 0.5f);
mList.setLayoutAnimation(controller);
}
/**
* Display the add bookmark dialog.
*/
private void openAddBookmarkDialog() {
Intent i = new Intent(this, EditBookmarkActivity.class);
i.putExtra(Constants.EXTRA_ID_BOOKMARK_ID, (long) -1);
i.putExtra(Constants.EXTRA_ID_BOOKMARK_TITLE, "");
i.putExtra(Constants.EXTRA_ID_BOOKMARK_URL, "");
startActivityForResult(i, ACTIVITY_ADD_BOOKMARK);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem item;
item = menu.add(0, MENU_ADD_BOOKMARK, 0, R.string.BookmarksListActivity_MenuAddBookmark);
item.setIcon(R.drawable.ic_menu_add_bookmark);
item = menu.add(0, MENU_SORT_MODE, 0, R.string.BookmarksListActivity_MenuSortMode);
item.setIcon(R.drawable.ic_menu_sort);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case MENU_SORT_MODE:
changeSortMode();
return true;
case MENU_ADD_BOOKMARK:
openAddBookmarkDialog();
return true;
default: return super.onMenuItemSelected(featureId, item);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
long id = ((AdapterContextMenuInfo) menuInfo).id;
if (id != -1) {
BookmarkItem item = BookmarksProviderWrapper.getStockBookmarkById(getContentResolver(), id);
if (item != null) {
menu.setHeaderTitle(item.getTitle());
}
}
menu.add(0, MENU_OPEN_IN_TAB, 0, R.string.BookmarksListActivity_MenuOpenInTab);
menu.add(0, MENU_COPY_URL, 0, R.string.BookmarksHistoryActivity_MenuCopyLinkUrl);
menu.add(0, MENU_SHARE, 0, R.string.Main_MenuShareLinkUrl);
menu.add(0, MENU_EDIT_BOOKMARK, 0, R.string.BookmarksListActivity_MenuEditBookmark);
menu.add(0, MENU_DELETE_BOOKMARK, 0, R.string.BookmarksListActivity_MenuDeleteBookmark);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Intent i;
BookmarkItem bookmarkItem = BookmarksProviderWrapper.getStockBookmarkById(getContentResolver(), info.id);
switch (item.getItemId()) {
case MENU_OPEN_IN_TAB:
i = new Intent();
i.putExtra(Constants.EXTRA_ID_NEW_TAB, true);
if (bookmarkItem != null) {
i.putExtra(Constants.EXTRA_ID_URL, bookmarkItem.getUrl());
} else {
i.putExtra(Constants.EXTRA_ID_URL,
PreferenceManager.getDefaultSharedPreferences(BookmarksListActivity.this).getString(Constants.PREFERENCES_GENERAL_HOME_PAGE, Constants.URL_ABOUT_START));
}
if (getParent() != null) {
getParent().setResult(RESULT_OK, i);
} else {
setResult(RESULT_OK, i);
}
finish();
return true;
case MENU_EDIT_BOOKMARK:
if (bookmarkItem != null) {
i = new Intent(this, EditBookmarkActivity.class);
i.putExtra(Constants.EXTRA_ID_BOOKMARK_ID, info.id);
i.putExtra(Constants.EXTRA_ID_BOOKMARK_TITLE, bookmarkItem.getTitle());
i.putExtra(Constants.EXTRA_ID_BOOKMARK_URL, bookmarkItem.getUrl());
startActivityForResult(i, ACTIVITY_EDIT_BOOKMARK);
}
return true;
case MENU_COPY_URL:
if (bookmarkItem != null) {
ApplicationUtils.copyTextToClipboard(this, bookmarkItem.getUrl(), getString(R.string.Commons_UrlCopyToastMessage));
}
return true;
case MENU_SHARE:
if (bookmarkItem != null) {
ApplicationUtils.sharePage(this, bookmarkItem.getTitle(), bookmarkItem.getUrl());
}
return true;
case MENU_DELETE_BOOKMARK:
//mDbAdapter.deleteBookmark(info.id);
BookmarksProviderWrapper.deleteStockBookmark(getContentResolver(), info.id);
fillData();
return true;
default: return super.onContextItemSelected(item);
}
}
/**
* Change list sort mode. Update list.
* @param sortMode The new sort mode.
*/
private void doChangeSortMode(int sortMode) {
Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putInt(Constants.PREFERENCES_BOOKMARKS_SORT_MODE, sortMode);
editor.commit();
fillData();
}
/**
* Show a dialog for choosing the sort mode.
* Perform the change if required.
*/
private void changeSortMode() {
int currentSort = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.PREFERENCES_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.BookmarksListActivity_MenuSortMode));
builder.setSingleChoiceItems(new String[] {getResources().getString(R.string.BookmarksListActivity_MostUsedSortMode),
getResources().getString(R.string.BookmarksListActivity_AlphaSortMode),
getResources().getString(R.string.BookmarksListActivity_RecentSortMode) },
currentSort,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
doChangeSortMode(which);
dialog.dismiss();
}
});
builder.setCancelable(true);
builder.setNegativeButton(R.string.Commons_Cancel, null);
AlertDialog alert = builder.create();
alert.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case ACTIVITY_EDIT_BOOKMARK:
if (resultCode == RESULT_OK) {
fillData();
}
break;
case ACTIVITY_ADD_BOOKMARK:
if (resultCode == RESULT_OK) {
fillData();
}
break;
default:
break;
}
}
}