@@ -18,7 +18,7 @@ package com.duckduckgo.app.browser
1818
1919import android.annotation.SuppressLint
2020import android.app.DownloadManager
21- import android.app.DownloadManager.Request.*
21+ import android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED
2222import android.arch.lifecycle.Observer
2323import android.arch.lifecycle.ViewModelProviders
2424import android.content.Context
@@ -46,22 +46,25 @@ import com.duckduckgo.app.privacymonitor.renderer.icon
4646import com.duckduckgo.app.privacymonitor.ui.PrivacyDashboardActivity
4747import com.duckduckgo.app.settings.SettingsActivity
4848import kotlinx.android.synthetic.main.activity_browser.*
49+ import kotlinx.android.synthetic.main.popup_window_brower_menu.view.*
4950import org.jetbrains.anko.doAsync
5051import org.jetbrains.anko.toast
5152import org.jetbrains.anko.uiThread
5253import timber.log.Timber
5354import javax.inject.Inject
5455
56+
5557class BrowserActivity : DuckDuckGoActivity () {
5658
5759 @Inject lateinit var webViewClient: BrowserWebViewClient
5860 @Inject lateinit var webChromeClient: BrowserChromeClient
5961 @Inject lateinit var viewModelFactory: ViewModelFactory
6062
63+ private lateinit var popupMenu: BrowserPopupMenu
64+
6165 private lateinit var autoCompleteSuggestionsAdapter: BrowserAutoCompleteSuggestionsAdapter
6266
6367 private var acceptingRenderUpdates = true
64- private var addBookmarkMenuItem: MenuItem ? = null
6568
6669 private val viewModel: BrowserViewModel by lazy {
6770 ViewModelProviders .of(this , viewModelFactory).get(BrowserViewModel ::class .java)
@@ -76,6 +79,7 @@ class BrowserActivity : DuckDuckGoActivity() {
7679 override fun onCreate (savedInstanceState : Bundle ? ) {
7780 super .onCreate(savedInstanceState)
7881 setContentView(R .layout.activity_browser)
82+ popupMenu = BrowserPopupMenu (layoutInflater)
7983
8084 viewModel.viewState.observe(this , Observer <BrowserViewModel .ViewState > {
8185 it?.let { render(it) }
@@ -163,7 +167,6 @@ class BrowserActivity : DuckDuckGoActivity() {
163167 false -> pageLoadingIndicator.hide()
164168 }
165169
166- addBookmarkMenuItem?.setEnabled(viewState.canAddBookmarks)
167170 if (shouldUpdateOmnibarTextInput(viewState, viewState.omnibarText)) {
168171 omnibarTextInput.setText(viewState.omnibarText)
169172
@@ -181,6 +184,10 @@ class BrowserActivity : DuckDuckGoActivity() {
181184
182185 privacyGradeMenu?.isVisible = viewState.showPrivacyGrade
183186 fireMenu?.isVisible = viewState.showFireButton
187+ popupMenu.contentView.backPopupMenuItem.isEnabled = viewState.browserShowing && webView.canGoBack()
188+ popupMenu.contentView.forwardPopupMenuItem.isEnabled = viewState.browserShowing && webView.canGoForward()
189+ popupMenu.contentView.refreshPopupMenuItem.isEnabled = viewState.browserShowing
190+ popupMenu.contentView.addBookmarksPopupMenuItem?.isEnabled = viewState.canAddBookmarks
184191
185192 when (viewState.showAutoCompleteSuggestions) {
186193 false -> autoCompleteSuggestionsList.gone()
@@ -211,7 +218,6 @@ class BrowserActivity : DuckDuckGoActivity() {
211218
212219 private fun configureToolbar () {
213220 setSupportActionBar(toolbar)
214-
215221 supportActionBar?.let {
216222 it.title = null
217223 }
@@ -262,7 +268,7 @@ class BrowserActivity : DuckDuckGoActivity() {
262268 webView.setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
263269 val request = DownloadManager .Request (Uri .parse(url))
264270 request.allowScanningByMediaScanner()
265- request.setNotificationVisibility(VISIBILITY_VISIBLE_NOTIFY_COMPLETED )
271+ request.setNotificationVisibility(VISIBILITY_VISIBLE_NOTIFY_COMPLETED )
266272 val manager = getSystemService(Context .DOWNLOAD_SERVICE ) as DownloadManager
267273 manager.enqueue(request)
268274 Toast .makeText(applicationContext, getString(R .string.webviewDownload), Toast .LENGTH_LONG ).show()
@@ -306,8 +312,6 @@ class BrowserActivity : DuckDuckGoActivity() {
306312
307313 override fun onCreateOptionsMenu (menu : Menu ? ): Boolean {
308314 menuInflater.inflate(R .menu.menu_browser_activity, menu)
309- addBookmarkMenuItem = menu?.findItem(R .id.add_bookmark_menu_item)
310- addBookmarkMenuItem?.setEnabled(false )
311315 return true
312316 }
313317
@@ -321,50 +325,13 @@ class BrowserActivity : DuckDuckGoActivity() {
321325 launchFire()
322326 return true
323327 }
324- R .id.refresh_menu_item -> {
325- webView.reload()
326- return true
327- }
328- R .id.back_menu_item -> {
329- webView.goBack()
330- return true
331- }
332- R .id.forward_menu_item -> {
333- webView.goForward()
334- return true
335- }
336- R .id.add_bookmark_menu_item -> {
337- addBookmark()
338- return true
339- }
340- R .id.bookmarks_menu_item -> {
341- launchBookmarksView()
342- return true
343- }
344- R .id.settings_menu_item -> {
345- launchSettingsView()
346- return true
328+ R .id.browser_popup_menu_item -> {
329+ launchPopupMenu()
347330 }
348331 }
349332 return false
350333 }
351334
352- private fun addBookmark () {
353- val title = webView.title
354- val url = webView.url
355- doAsync {
356- viewModel.addBookmark(title, url)
357- uiThread {
358- toast(R .string.bookmarkAddedFeedback)
359- }
360- }
361- }
362-
363- private fun finishActivityAnimated () {
364- clearViewPriorToAnimation()
365- supportFinishAfterTransition()
366- }
367-
368335 private fun launchPrivacyDashboard () {
369336 startActivityForResult(PrivacyDashboardActivity .intent(this ), DASHBOARD_REQUEST_CODE )
370337 }
@@ -377,6 +344,52 @@ class BrowserActivity : DuckDuckGoActivity() {
377344 }).show()
378345 }
379346
347+ private fun launchPopupMenu () {
348+ val anchorView = findViewById<View >(R .id.browser_popup_menu_item)
349+ popupMenu.show(rootView, anchorView)
350+ }
351+
352+ fun onGoForwardClicked (view : View ) {
353+ webView.goForward()
354+ popupMenu.dismiss()
355+ }
356+
357+ fun onGoBackClicked (view : View ) {
358+ webView.goBack()
359+ popupMenu.dismiss()
360+ }
361+
362+ fun onRefreshClicked (view : View ) {
363+ webView.reload()
364+ popupMenu.dismiss()
365+ }
366+
367+ fun onBookmarksClicked (view : View ) {
368+ launchBookmarksView()
369+ popupMenu.dismiss()
370+ }
371+
372+ fun onAddBookmarkClicked (view : View ) {
373+ addBookmark()
374+ popupMenu.dismiss()
375+ }
376+
377+ fun onSettingsClicked (view : View ) {
378+ launchSettingsView()
379+ popupMenu.dismiss()
380+ }
381+
382+ private fun addBookmark () {
383+ val title = webView.title
384+ val url = webView.url
385+ doAsync {
386+ viewModel.addBookmark(title, url)
387+ uiThread {
388+ toast(R .string.bookmarkAddedFeedback)
389+ }
390+ }
391+ }
392+
380393 private fun launchSettingsView () {
381394 startActivityForResult(SettingsActivity .intent(this ), SETTINGS_REQUEST_CODE )
382395 }
@@ -403,6 +416,11 @@ class BrowserActivity : DuckDuckGoActivity() {
403416 super .onBackPressed()
404417 }
405418
419+ private fun finishActivityAnimated () {
420+ clearViewPriorToAnimation()
421+ supportFinishAfterTransition()
422+ }
423+
406424 private fun clearViewPriorToAnimation () {
407425 acceptingRenderUpdates = false
408426 omnibarTextInput.text.clear()
0 commit comments