Browse Source

Merge pull request #326 from cliqz-oss/dev

Tab deletion logic moved to TabsManager
master
Anthony Restaino 9 years ago
parent
commit
8da11b4f08
  1. 123
      app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java
  2. 29
      app/src/main/java/acr/browser/lightning/activity/TabsManager.java
  3. 15
      app/src/main/java/acr/browser/lightning/bus/BookmarkEvents.java
  4. 9
      app/src/main/java/acr/browser/lightning/bus/BrowserEvents.java
  5. 21
      app/src/main/java/acr/browser/lightning/fragment/BookmarksFragment.java

123
app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java

@ -100,6 +100,7 @@ import acr.browser.lightning.constant.HistoryPage;
import acr.browser.lightning.controller.UIController; import acr.browser.lightning.controller.UIController;
import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.BookmarkManager;
import acr.browser.lightning.database.HistoryDatabase; import acr.browser.lightning.database.HistoryDatabase;
import acr.browser.lightning.database.HistoryItem;
import acr.browser.lightning.dialog.LightningDialogBuilder; import acr.browser.lightning.dialog.LightningDialogBuilder;
import acr.browser.lightning.fragment.BookmarksFragment; import acr.browser.lightning.fragment.BookmarksFragment;
import acr.browser.lightning.fragment.TabsFragment; import acr.browser.lightning.fragment.TabsFragment;
@ -667,6 +668,7 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
final LightningView currentView = mTabsManager.getCurrentTab(); final LightningView currentView = mTabsManager.getCurrentTab();
final String currentUrl = currentView != null ? currentView.getUrl() : null;
// Handle action buttons // Handle action buttons
switch (item.getItemId()) { switch (item.getItemId()) {
case android.R.id.home: case android.R.id.home:
@ -692,11 +694,11 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
overridePendingTransition(R.anim.slide_up_in, R.anim.fade_out_scale); overridePendingTransition(R.anim.slide_up_in, R.anim.fade_out_scale);
return true; return true;
case R.id.action_share: case R.id.action_share:
if (currentView != null && !UrlUtils.isSpecialUrl(currentView.getUrl())) { if (currentUrl != null && !UrlUtils.isSpecialUrl(currentUrl)) {
Intent shareIntent = new Intent(Intent.ACTION_SEND); Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain"); shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, currentView.getTitle()); shareIntent.putExtra(Intent.EXTRA_SUBJECT, currentView.getTitle());
shareIntent.putExtra(Intent.EXTRA_TEXT, currentView.getUrl()); shareIntent.putExtra(Intent.EXTRA_TEXT, currentUrl);
startActivity(Intent.createChooser(shareIntent, getResources().getString(R.string.dialog_title_share))); startActivity(Intent.createChooser(shareIntent, getResources().getString(R.string.dialog_title_share)));
} }
return true; return true;
@ -704,9 +706,9 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
openBookmarks(); openBookmarks();
return true; return true;
case R.id.action_copy: case R.id.action_copy:
if (currentView != null && !UrlUtils.isSpecialUrl(currentView.getUrl())) { if (currentUrl != null && !UrlUtils.isSpecialUrl(currentUrl)) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", currentView.getUrl()); ClipData clip = ClipData.newPlainText("label", currentUrl);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
Utils.showSnackbar(this, R.string.message_link_copied); Utils.showSnackbar(this, R.string.message_link_copied);
} }
@ -718,18 +720,17 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
openHistory(); openHistory();
return true; return true;
case R.id.action_add_bookmark: case R.id.action_add_bookmark:
if (currentView != null && !UrlUtils.isSpecialUrl(currentView.getUrl())) { if (currentUrl != null && !UrlUtils.isSpecialUrl(currentUrl)) {
mEventBus.post(new BrowserEvents.AddBookmark(currentView.getTitle(), addBookmark(currentView.getTitle(), currentUrl);
currentView.getUrl()));
} }
return true; return true;
case R.id.action_find: case R.id.action_find:
findInPage(); findInPage();
return true; return true;
case R.id.action_reading_mode: case R.id.action_reading_mode:
if (currentView != null) { if (currentUrl != null) {
Intent read = new Intent(this, ReadingActivity.class); Intent read = new Intent(this, ReadingActivity.class);
read.putExtra(Constants.LOAD_READING_URL, currentView.getUrl()); read.putExtra(Constants.LOAD_READING_URL, currentUrl);
startActivity(read); startActivity(read);
} }
return true; return true;
@ -738,6 +739,27 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
} }
} }
// By using a manager, adds a bookmark and notifies third parties about that
private void addBookmark(final String title, final String url) {
final HistoryItem item = !mBookmarkManager.isBookmark(url)
? new HistoryItem(url, title)
: null;
if (item != null && mBookmarkManager.addBookmark(item)) {
mSearchAdapter.refreshBookmarks();
mEventBus.post(new BrowserEvents.BookmarkAdded(title, url));
}
}
private void deleteBookmark(final String title, final String url) {
final HistoryItem item = mBookmarkManager.isBookmark(url)
? new HistoryItem(url, title)
: null;
if (item != null && mBookmarkManager.deleteBookmark(item)) {
mSearchAdapter.refreshBookmarks();
mEventBus.post(new BrowserEvents.CurrentPageUrl(url));
}
}
/** /**
* method that shows a dialog asking what string the user wishes to search * method that shows a dialog asking what string the user wishes to search
* for. It highlights the text entered. * for. It highlights the text entered.
@ -817,8 +839,14 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
*/ */
private synchronized void showTab(final int position) { private synchronized void showTab(final int position) {
final LightningView currentView = mTabsManager.getCurrentTab(); final LightningView currentView = mTabsManager.getCurrentTab();
final WebView currentWebView = currentView != null ? currentView.getWebView() : null;
final LightningView newView = mTabsManager.switchToTab(position); final LightningView newView = mTabsManager.switchToTab(position);
switchTabs(currentView, newView);
}
// This is commodity to breack the flow between regular tab management and the CLIQZ's search
// interface.
private void switchTabs(final LightningView currentView, final LightningView newView) {
final WebView currentWebView = currentView != null ? currentView.getWebView() : null;
final WebView newWebView = newView != null ? newView.getWebView() : null; final WebView newWebView = newView != null ? newView.getWebView() : null;
if (newView == null || newWebView == null) { if (newView == null || newWebView == null) {
return; return;
@ -1001,14 +1029,11 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
private synchronized void deleteTab(int position) { private synchronized void deleteTab(int position) {
final LightningView tabToDelete = mTabsManager.getTabAtPosition(position); final LightningView tabToDelete = mTabsManager.getTabAtPosition(position);
final LightningView currentTab = mTabsManager.getCurrentTab();
if (tabToDelete == null) { if (tabToDelete == null) {
return; return;
} }
int current = mTabsManager.positionOf(currentTab);
if (!UrlUtils.isSpecialUrl(tabToDelete.getUrl()) && !isIncognito()) { if (!UrlUtils.isSpecialUrl(tabToDelete.getUrl()) && !isIncognito()) {
mPreferences.setSavedUrl(tabToDelete.getUrl()); mPreferences.setSavedUrl(tabToDelete.getUrl());
} }
@ -1017,37 +1042,22 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
if (isShown) { if (isShown) {
mBrowserFrame.setBackgroundColor(mBackgroundColor); mBrowserFrame.setBackgroundColor(mBackgroundColor);
} }
if (current > position) { final LightningView currentTab = mTabsManager.getCurrentTab();
mTabsManager.deleteTab(position); mTabsManager.deleteTab(position);
mEventBus.post(new BrowserEvents.TabsChanged()); final LightningView afterTab = mTabsManager.getCurrentTab();
} else if (mTabsManager.size() > position + 1) { if (afterTab == null) {
if (current == position) { // if (currentTab != null && (UrlUtils.isSpecialUrl(currentTab.getUrl())
showTab(position + 1); // || currentTab.getUrl().equals(mPreferenceManager.getHomepage()))) {
mTabsManager.deleteTab(position); // closeActivity();
mEventBus.post(new BrowserEvents.TabsChanged()); // } else {
} else { performExitCleanUp();
mTabsManager.deleteTab(position); finish();
} // }
} else if (mTabsManager.size() > 1) { } else if (afterTab != currentTab) {
if (current == position) { switchTabs(currentTab, afterTab);
showTab(position - 1); currentTab.pauseTimers();
mTabsManager.deleteTab(position);
mEventBus.post(new BrowserEvents.TabsChanged());
} else {
mTabsManager.deleteTab(position);
}
} else {
if (currentTab != null && (UrlUtils.isSpecialUrl(currentTab.getUrl())
|| currentTab.getUrl().equals(mHomepage))) {
closeActivity();
} else {
mTabsManager.deleteTab(position);
performExitCleanUp();
tabToDelete.pauseTimers();
mEventBus.post(new BrowserEvents.TabsChanged());
finish();
}
} }
mEventBus.post(new BrowserEvents.TabsChanged()); mEventBus.post(new BrowserEvents.TabsChanged());
if (shouldClose) { if (shouldClose) {
@ -2007,29 +2017,26 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
} }
/** /**
* When receive a {@link acr.browser.lightning.bus.BookmarkEvents.WantToBookmarkCurrentPage} * When receive a {@link BookmarkEvents.ToggleBookmarkForCurrentPage}
* message this receiver answer firing the * message this receiver answer firing the
* {@link acr.browser.lightning.bus.BrowserEvents.AddBookmark} message * {@link BrowserEvents.BookmarkAdded} message
* *
* @param event an event that the user wishes to bookmark the current page * @param event an event that the user wishes to bookmark the current page
*/ */
@Subscribe @Subscribe
public void bookmarkCurrentPage(final BookmarkEvents.WantToBookmarkCurrentPage event) { public void bookmarkCurrentPage(final BookmarkEvents.ToggleBookmarkForCurrentPage event) {
final LightningView currentTab = mTabsManager.getCurrentTab(); final LightningView currentTab = mTabsManager.getCurrentTab();
if (currentTab != null) { final String url = currentTab != null ? currentTab.getUrl() : null;
mEventBus.post(new BrowserEvents.AddBookmark(currentTab.getTitle(), currentTab.getUrl())); final String title = currentTab != null ? currentTab.getTitle() : null;
if (url == null) {
return;
} }
}
/** if (!mBookmarkManager.isBookmark(url)) {
* This message is received when a bookmark was added by the addBookmark(title, url);
* {@link acr.browser.lightning.fragment.BookmarksFragment} } else {
* deleteBookmark(title, url);
* @param event the event that a bookmark has been added }
*/
@Subscribe
public void bookmarkAdded(final BookmarkEvents.Added event) {
mSearchAdapter.refreshBookmarks();
} }
/** /**

29
app/src/main/java/acr/browser/lightning/activity/TabsManager.java

@ -9,6 +9,8 @@ import android.support.v7.app.AlertDialog;
import android.util.Log; import android.util.Log;
import android.webkit.WebView; import android.webkit.WebView;
import com.squareup.otto.Bus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -16,8 +18,10 @@ import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import acr.browser.lightning.R; import acr.browser.lightning.R;
import acr.browser.lightning.bus.BrowserEvents;
import acr.browser.lightning.constant.Constants; import acr.browser.lightning.constant.Constants;
import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.preference.PreferenceManager;
import acr.browser.lightning.utils.UrlUtils;
import acr.browser.lightning.utils.Utils; import acr.browser.lightning.utils.Utils;
import acr.browser.lightning.view.LightningView; import acr.browser.lightning.view.LightningView;
@ -35,6 +39,9 @@ public class TabsManager {
@Inject @Inject
PreferenceManager mPreferenceManager; PreferenceManager mPreferenceManager;
@Inject
Bus mEventBus;
@Inject @Inject
public TabsManager() {} public TabsManager() {}
@ -182,7 +189,7 @@ public class TabsManager {
* @return The removed tab reference or null * @return The removed tab reference or null
*/ */
@Nullable @Nullable
public synchronized LightningView deleteTab(final int position) { private synchronized LightningView removeTab(final int position) {
if (position >= mWebViewList.size()) { if (position >= mWebViewList.size()) {
return null; return null;
} }
@ -191,9 +198,29 @@ public class TabsManager {
mCurrentTab = null; mCurrentTab = null;
} }
tab.onDestroy(); tab.onDestroy();
Log.d(Constants.TAG, tab.toString());
return tab; return tab;
} }
public synchronized void deleteTab(int position) {
final LightningView currentTab = getCurrentTab();
int current = positionOf(currentTab);
if (current == position) {
if (size() == 1) {
mCurrentTab = null;
} else if (current < size() - 1 ) {
// There is another tab after this one
mCurrentTab = getTabAtPosition(current + 1);
} else {
mCurrentTab = getTabAtPosition(current - 1);
}
removeTab(current);
} else {
removeTab(position);
}
}
/** /**
* Return the position of the given tab. * Return the position of the given tab.
* *

15
app/src/main/java/acr/browser/lightning/bus/BookmarkEvents.java

@ -23,20 +23,9 @@ public final class BookmarkEvents {
} }
/** /**
* The user ask to bookmark the currently displayed page * The user ask to add/del a bookmark to the currently displayed page
*/ */
public static class WantToBookmarkCurrentPage { public static class ToggleBookmarkForCurrentPage {
}
/**
* The bookmark was added
*/
public static class Added {
public final HistoryItem item;
public Added(final HistoryItem item) {
this.item = item;
}
} }
/** /**

9
app/src/main/java/acr/browser/lightning/bus/BrowserEvents.java

@ -12,14 +12,13 @@ public final class BrowserEvents {
} }
/** /**
* Used to reply to the {@link acr.browser.lightning.fragment.BookmarksFragment} message * The {@link acr.browser.lightning.activity.BrowserActivity} signal a new bookmark was added
* {@link acr.browser.lightning.bus.BookmarkEvents.WantToBookmarkCurrentPage}. The interaction * (mainly to the {@link acr.browser.lightning.fragment.BookmarksFragment}).
* result is a new bookmark added.
*/ */
public static class AddBookmark { public static class BookmarkAdded {
public final String title, url; public final String title, url;
public AddBookmark(final String title, final String url) { public BookmarkAdded(final String title, final String url) {
this.title = title; this.title = title;
this.url = url; this.url = url;
} }

21
app/src/main/java/acr/browser/lightning/fragment/BookmarksFragment.java

@ -30,7 +30,6 @@ import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
@ -49,7 +48,6 @@ import acr.browser.lightning.dialog.LightningDialogBuilder;
import acr.browser.lightning.preference.PreferenceManager; import acr.browser.lightning.preference.PreferenceManager;
import acr.browser.lightning.async.ImageDownloadTask; import acr.browser.lightning.async.ImageDownloadTask;
import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.ThemeUtils;
import acr.browser.lightning.utils.UrlUtils;
import acr.browser.lightning.view.LightningView; import acr.browser.lightning.view.LightningView;
/** /**
@ -192,22 +190,17 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener,
} }
@Subscribe @Subscribe
public void addBookmark(final BrowserEvents.AddBookmark event) { public void addBookmark(final BrowserEvents.BookmarkAdded event) {
final HistoryItem item = new HistoryItem(event.url, event.title); updateBookmarkIndicator(event.url);
if (!UrlUtils.isSpecialUrl(item.getUrl())) { String folder = mBookmarkManager.getCurrentFolder();
if (mBookmarkManager.addBookmark(item)) { setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(folder, true), false);
mBookmarks.add(item);
Collections.sort(mBookmarks, new BookmarkManager.SortIgnoreCase());
mBookmarkAdapter.notifyDataSetChanged();
mEventBus.post(new BookmarkEvents.Added(item));
updateBookmarkIndicator(event.url);
}
}
} }
@Subscribe @Subscribe
public void currentPageInfo(final BrowserEvents.CurrentPageUrl event) { public void currentPageInfo(final BrowserEvents.CurrentPageUrl event) {
updateBookmarkIndicator(event.url); updateBookmarkIndicator(event.url);
String folder = mBookmarkManager.getCurrentFolder();
setBookmarkDataSet(mBookmarkManager.getBookmarksFromFolder(folder, true), false);
} }
@Subscribe @Subscribe
@ -316,7 +309,7 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener,
public void onClick(View v) { public void onClick(View v) {
switch (v.getId()) { switch (v.getId()) {
case R.id.action_add_bookmark: case R.id.action_add_bookmark:
mEventBus.post(new BookmarkEvents.WantToBookmarkCurrentPage()); mEventBus.post(new BookmarkEvents.ToggleBookmarkForCurrentPage());
break; break;
case R.id.action_reading: case R.id.action_reading:
LightningView currentTab = mTabsManager.getCurrentTab(); LightningView currentTab = mTabsManager.getCurrentTab();

Loading…
Cancel
Save