OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.customtabs; | 5 package org.chromium.chrome.browser.customtabs; |
6 | 6 |
7 import android.app.PendingIntent; | 7 import android.app.PendingIntent; |
8 import android.content.Intent; | 8 import android.content.Intent; |
9 import android.graphics.Bitmap; | 9 import android.graphics.Bitmap; |
10 import android.net.Uri; | 10 import android.net.Uri; |
(...skipping 14 matching lines...) Expand all Loading... |
25 import android.widget.RemoteViews; | 25 import android.widget.RemoteViews; |
26 | 26 |
27 import org.chromium.base.ApiCompatibilityUtils; | 27 import org.chromium.base.ApiCompatibilityUtils; |
28 import org.chromium.base.Log; | 28 import org.chromium.base.Log; |
29 import org.chromium.base.ThreadUtils; | 29 import org.chromium.base.ThreadUtils; |
30 import org.chromium.base.VisibleForTesting; | 30 import org.chromium.base.VisibleForTesting; |
31 import org.chromium.base.metrics.RecordHistogram; | 31 import org.chromium.base.metrics.RecordHistogram; |
32 import org.chromium.base.metrics.RecordUserAction; | 32 import org.chromium.base.metrics.RecordUserAction; |
33 import org.chromium.chrome.R; | 33 import org.chromium.chrome.R; |
34 import org.chromium.chrome.browser.ChromeActivity; | 34 import org.chromium.chrome.browser.ChromeActivity; |
| 35 import org.chromium.chrome.browser.ChromeFeatureList; |
35 import org.chromium.chrome.browser.ChromeSwitches; | 36 import org.chromium.chrome.browser.ChromeSwitches; |
36 import org.chromium.chrome.browser.ChromeTabbedActivity; | 37 import org.chromium.chrome.browser.ChromeTabbedActivity; |
37 import org.chromium.chrome.browser.IntentHandler; | 38 import org.chromium.chrome.browser.IntentHandler; |
38 import org.chromium.chrome.browser.IntentHandler.ExternalAppId; | 39 import org.chromium.chrome.browser.IntentHandler.ExternalAppId; |
39 import org.chromium.chrome.browser.KeyboardShortcuts; | 40 import org.chromium.chrome.browser.KeyboardShortcuts; |
40 import org.chromium.chrome.browser.WebContentsFactory; | 41 import org.chromium.chrome.browser.WebContentsFactory; |
41 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; | 42 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; |
42 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChange
Reason; | 43 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChange
Reason; |
43 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; | 44 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; |
44 import org.chromium.chrome.browser.datausage.DataUseTabUIManager; | 45 import org.chromium.chrome.browser.datausage.DataUseTabUIManager; |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 params.getDescription(), | 591 params.getDescription(), |
591 new OnClickListener() { | 592 new OnClickListener() { |
592 @Override | 593 @Override |
593 public void onClick(View v) { | 594 public void onClick(View v) { |
594 String creatorPackage = | 595 String creatorPackage = |
595 ApiCompatibilityUtils.getCreatorPackage(params.g
etPendingIntent()); | 596 ApiCompatibilityUtils.getCreatorPackage(params.g
etPendingIntent()); |
596 if (mIntentDataProvider.isOpenedByChrome() | 597 if (mIntentDataProvider.isOpenedByChrome() |
597 && TextUtils.equals(getPackageName(), creatorPac
kage)) { | 598 && TextUtils.equals(getPackageName(), creatorPac
kage)) { |
598 RecordUserAction.record( | 599 RecordUserAction.record( |
599 "TaskManagement.OpenInChromeActionButtonClic
ked"); | 600 "TaskManagement.OpenInChromeActionButtonClic
ked"); |
600 if (openCurrentUrlInBrowser(false)) finishAndClose()
; | 601 if (openCurrentUrlInBrowser(false, true)) finishAndC
lose(); |
601 } else { | 602 } else { |
602 mIntentDataProvider.sendButtonPendingIntentWithUrl( | 603 mIntentDataProvider.sendButtonPendingIntentWithUrl( |
603 getApplicationContext(), getActivityTab().ge
tUrl()); | 604 getApplicationContext(), getActivityTab().ge
tUrl()); |
604 RecordUserAction.record("CustomTabsCustomActionButto
nClick"); | 605 RecordUserAction.record("CustomTabsCustomActionButto
nClick"); |
605 } | 606 } |
606 } | 607 } |
607 }); | 608 }); |
608 } | 609 } |
609 | 610 |
610 @Override | 611 @Override |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 // Disable creating new tabs, bookmark, history, print, help, focus_url,
etc. | 652 // Disable creating new tabs, bookmark, history, print, help, focus_url,
etc. |
652 if (id == R.id.focus_url_bar || id == R.id.all_bookmarks_menu_id | 653 if (id == R.id.focus_url_bar || id == R.id.all_bookmarks_menu_id |
653 || id == R.id.print_id || id == R.id.help_id | 654 || id == R.id.print_id || id == R.id.help_id |
654 || id == R.id.recent_tabs_menu_id || id == R.id.new_incognito_ta
b_menu_id | 655 || id == R.id.recent_tabs_menu_id || id == R.id.new_incognito_ta
b_menu_id |
655 || id == R.id.new_tab_menu_id || id == R.id.open_history_menu_id
) { | 656 || id == R.id.new_tab_menu_id || id == R.id.open_history_menu_id
) { |
656 return true; | 657 return true; |
657 } else if (id == R.id.bookmark_this_page_id | 658 } else if (id == R.id.bookmark_this_page_id |
658 && !mIntentDataProvider.shouldShowBookmarkMenuItem()) { | 659 && !mIntentDataProvider.shouldShowBookmarkMenuItem()) { |
659 return true; | 660 return true; |
660 } else if (id == R.id.open_in_browser_id) { | 661 } else if (id == R.id.open_in_browser_id) { |
661 openCurrentUrlInBrowser(false); | 662 openCurrentUrlInBrowser(false, true); |
662 RecordUserAction.record("CustomTabsMenuOpenInChrome"); | 663 RecordUserAction.record("CustomTabsMenuOpenInChrome"); |
663 return true; | 664 return true; |
| 665 } else if (id == R.id.read_it_later_id) { |
| 666 openCurrentUrlInBrowser(false, false); |
| 667 RecordUserAction.record("CustomTabsMenuReadItLater"); |
| 668 return true; |
664 } else if (id == R.id.find_in_page_id) { | 669 } else if (id == R.id.find_in_page_id) { |
665 mFindToolbarManager.showToolbar(); | 670 mFindToolbarManager.showToolbar(); |
666 if (getContextualSearchManager() != null) { | 671 if (getContextualSearchManager() != null) { |
667 getContextualSearchManager().hideContextualSearch(StateChangeRea
son.UNKNOWN); | 672 getContextualSearchManager().hideContextualSearch(StateChangeRea
son.UNKNOWN); |
668 } | 673 } |
669 if (fromMenu) { | 674 if (fromMenu) { |
670 RecordUserAction.record("MobileMenuFindInPage"); | 675 RecordUserAction.record("MobileMenuFindInPage"); |
671 } else { | 676 } else { |
672 RecordUserAction.record("MobileShortcutFindInPage"); | 677 RecordUserAction.record("MobileShortcutFindInPage"); |
673 } | 678 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 * purposes only. | 711 * purposes only. |
707 */ | 712 */ |
708 @VisibleForTesting | 713 @VisibleForTesting |
709 CustomTabIntentDataProvider getIntentDataProvider() { | 714 CustomTabIntentDataProvider getIntentDataProvider() { |
710 return mIntentDataProvider; | 715 return mIntentDataProvider; |
711 } | 716 } |
712 | 717 |
713 /** | 718 /** |
714 * Opens the URL currently being displayed in the Custom Tab in the regular
browser. | 719 * Opens the URL currently being displayed in the Custom Tab in the regular
browser. |
715 * @param forceReparenting Whether tab reparenting should be forced for test
ing. | 720 * @param forceReparenting Whether tab reparenting should be forced for test
ing. |
716 * | 721 * @param stayInChrome Whether the user stays in Chrome after the tab is
reparented. |
717 * @return Whether or not the tab was sent over successfully. | 722 * @return Whether or not the tab was sent over successfully. |
718 */ | 723 */ |
719 boolean openCurrentUrlInBrowser(boolean forceReparenting) { | 724 boolean openCurrentUrlInBrowser(boolean forceReparenting, boolean stayInChro
me) { |
720 Tab tab = getActivityTab(); | 725 Tab tab = getActivityTab(); |
721 if (tab == null) return false; | 726 if (tab == null) return false; |
722 | 727 |
723 String url = tab.getUrl(); | 728 String url = tab.getUrl(); |
724 if (DomDistillerUrlUtils.isDistilledPage(url)) { | 729 if (DomDistillerUrlUtils.isDistilledPage(url)) { |
725 url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url); | 730 url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url); |
726 } | 731 } |
727 if (TextUtils.isEmpty(url)) url = getUrlToLoad(); | 732 if (TextUtils.isEmpty(url)) url = getUrlToLoad(); |
728 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); | 733 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); |
729 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | 734 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
730 intent.putExtra(ChromeLauncherActivity.EXTRA_IS_ALLOWED_TO_RETURN_TO_PAR
ENT, false); | 735 intent.putExtra(ChromeLauncherActivity.EXTRA_IS_ALLOWED_TO_RETURN_TO_PAR
ENT, false); |
| 736 if (ChromeFeatureList.isEnabled("ReadItLaterInMenu")) { |
| 737 // In this trial both "open in chrome" and "read it later" should ta
rget Chrome. |
| 738 intent.setPackage(getPackageName()); |
| 739 } |
731 | 740 |
732 boolean willChromeHandleIntent = getIntentDataProvider().isOpenedByChrom
e(); | 741 boolean willChromeHandleIntent = getIntentDataProvider().isOpenedByChrom
e(); |
733 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); | 742 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); |
734 StrictMode.allowThreadDiskWrites(); | 743 StrictMode.allowThreadDiskWrites(); |
735 try { | 744 try { |
736 willChromeHandleIntent |= ExternalNavigationDelegateImpl | 745 willChromeHandleIntent |= ExternalNavigationDelegateImpl |
737 .willChromeHandleIntent(this, intent, true); | 746 .willChromeHandleIntent(this, intent, true); |
738 } finally { | 747 } finally { |
739 StrictMode.setThreadPolicy(oldPolicy); | 748 StrictMode.setThreadPolicy(oldPolicy); |
740 } | 749 } |
741 | 750 |
742 Bundle startActivityOptions = ActivityOptionsCompat.makeCustomAnimation( | 751 Bundle startActivityOptions = ActivityOptionsCompat.makeCustomAnimation( |
743 this, R.anim.abc_fade_in, R.anim.abc_fade_out).toBundle(); | 752 this, R.anim.abc_fade_in, R.anim.abc_fade_out).toBundle(); |
744 if (willChromeHandleIntent || forceReparenting) { | 753 if (willChromeHandleIntent || forceReparenting) { |
745 Runnable finalizeCallback = new Runnable() { | 754 Runnable finalizeCallback = new Runnable() { |
746 @Override | 755 @Override |
747 public void run() { | 756 public void run() { |
748 finishAndClose(); | 757 finishAndClose(); |
749 } | 758 } |
750 }; | 759 }; |
751 | 760 |
752 mMainTab = null; | 761 mMainTab = null; |
753 tab.detachAndStartReparenting(intent, startActivityOptions, finalize
Callback); | 762 tab.detachAndStartReparenting(intent, startActivityOptions, finalize
Callback, |
| 763 stayInChrome); |
754 } else { | 764 } else { |
755 // Temporarily allowing disk access while fixing. TODO: http://crbug
.com/581860 | 765 // Temporarily allowing disk access while fixing. TODO: http://crbug
.com/581860 |
756 StrictMode.allowThreadDiskReads(); | 766 StrictMode.allowThreadDiskReads(); |
757 StrictMode.allowThreadDiskWrites(); | 767 StrictMode.allowThreadDiskWrites(); |
758 try { | 768 try { |
759 startActivity(intent, startActivityOptions); | 769 startActivity(intent, startActivityOptions); |
760 } finally { | 770 } finally { |
761 StrictMode.setThreadPolicy(oldPolicy); | 771 StrictMode.setThreadPolicy(oldPolicy); |
762 } | 772 } |
763 } | 773 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 * overridden if the Data Reduction Proxy is using Lo-Fi previews. | 817 * overridden if the Data Reduction Proxy is using Lo-Fi previews. |
808 */ | 818 */ |
809 private String getUrlToLoad() { | 819 private String getUrlToLoad() { |
810 String url = IntentHandler.getUrlFromIntent(getIntent()); | 820 String url = IntentHandler.getUrlFromIntent(getIntent()); |
811 if (!TextUtils.isEmpty(url)) { | 821 if (!TextUtils.isEmpty(url)) { |
812 url = DataReductionProxySettings.getInstance().maybeRewriteWebliteUr
l(url); | 822 url = DataReductionProxySettings.getInstance().maybeRewriteWebliteUr
l(url); |
813 } | 823 } |
814 return url; | 824 return url; |
815 } | 825 } |
816 } | 826 } |
OLD | NEW |