Commit 9dd16811 authored by Tanya Gupta's avatar Tanya Gupta Committed by Commit Bot

[QrCode] Restructured code so that tabs are created in the dialog.

This prevents the app from crashing when the user navigates to the
setting page.

Change-Id: I4c48d8996694a681d27bf423e5212eaf82de29ba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2046711
Commit-Queue: Tanya Gupta <tgupta@chromium.org>
Reviewed-by: default avatarGayane Petrosyan <gayane@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743178}
parent 4f601867
...@@ -437,9 +437,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -437,9 +437,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
mManualFillingComponent.getKeyboardExtensionViewResizer()); mManualFillingComponent.getKeyboardExtensionViewResizer());
// Should be called after TabModels are initialized. // Should be called after TabModels are initialized.
ShareDelegate shareDelegate = new ShareDelegateImpl( ShareDelegate shareDelegate =
mRootUiCoordinator.getBottomSheetController(), getActivityTabProvider(), new ShareDelegateImpl(mRootUiCoordinator.getBottomSheetController(),
new ShareDelegateImpl.ShareSheetDelegate(), getCurrentTabCreator()); getActivityTabProvider(), new ShareDelegateImpl.ShareSheetDelegate());
mShareDelegateSupplier.set(shareDelegate); mShareDelegateSupplier.set(shareDelegate);
// If onStart was called before postLayoutInflation (because inflation was done in a // If onStart was called before postLayoutInflation (because inflation was done in a
......
...@@ -24,7 +24,7 @@ import org.chromium.chrome.browser.share.qrcode.QrCodeShareActivity; ...@@ -24,7 +24,7 @@ import org.chromium.chrome.browser.share.qrcode.QrCodeShareActivity;
import org.chromium.chrome.browser.tab.SadTab; import org.chromium.chrome.browser.tab.SadTab;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabImpl; import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.util.ChromeFileProvider; import org.chromium.chrome.browser.util.ChromeFileProvider;
import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
...@@ -45,7 +45,6 @@ public class ShareDelegateImpl implements ShareDelegate { ...@@ -45,7 +45,6 @@ public class ShareDelegateImpl implements ShareDelegate {
private final BottomSheetController mBottomSheetController; private final BottomSheetController mBottomSheetController;
private final ShareSheetDelegate mDelegate; private final ShareSheetDelegate mDelegate;
private final ActivityTabProvider mActivityTabProvider; private final ActivityTabProvider mActivityTabProvider;
private final TabCreatorManager.TabCreator mTabCreator;
private long mShareStartTime; private long mShareStartTime;
private static boolean sScreenshotCaptureSkippedForTesting; private static boolean sScreenshotCaptureSkippedForTesting;
...@@ -58,11 +57,10 @@ public class ShareDelegateImpl implements ShareDelegate { ...@@ -58,11 +57,10 @@ public class ShareDelegateImpl implements ShareDelegate {
* @param tabCreator The TabCreator for the current selected {@link TabModel}. * @param tabCreator The TabCreator for the current selected {@link TabModel}.
*/ */
public ShareDelegateImpl(BottomSheetController controller, ActivityTabProvider tabProvider, public ShareDelegateImpl(BottomSheetController controller, ActivityTabProvider tabProvider,
ShareSheetDelegate delegate, TabCreatorManager.TabCreator tabCreator) { ShareSheetDelegate delegate) {
mBottomSheetController = controller; mBottomSheetController = controller;
mDelegate = delegate; mDelegate = delegate;
mActivityTabProvider = tabProvider; mActivityTabProvider = tabProvider;
mTabCreator = tabCreator;
} }
// ShareDelegate implementation. // ShareDelegate implementation.
...@@ -71,8 +69,7 @@ public class ShareDelegateImpl implements ShareDelegate { ...@@ -71,8 +69,7 @@ public class ShareDelegateImpl implements ShareDelegate {
if (mShareStartTime == 0L) { if (mShareStartTime == 0L) {
mShareStartTime = System.currentTimeMillis(); mShareStartTime = System.currentTimeMillis();
} }
mDelegate.share( mDelegate.share(params, mBottomSheetController, mActivityTabProvider, mShareStartTime);
params, mBottomSheetController, mActivityTabProvider, mTabCreator, mShareStartTime);
mShareStartTime = 0; mShareStartTime = 0;
} }
...@@ -261,13 +258,12 @@ public class ShareDelegateImpl implements ShareDelegate { ...@@ -261,13 +258,12 @@ public class ShareDelegateImpl implements ShareDelegate {
* Trigger the share action for the specified params. * Trigger the share action for the specified params.
*/ */
void share(ShareParams params, BottomSheetController controller, void share(ShareParams params, BottomSheetController controller,
ActivityTabProvider tabProvider, TabCreatorManager.TabCreator tabCreator, ActivityTabProvider tabProvider, long shareStartTime) {
long shareStartTime) {
if (params.shareDirectly()) { if (params.shareDirectly()) {
ShareHelper.shareDirectly(params); ShareHelper.shareDirectly(params);
} else if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB)) { } else if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB)) {
ShareSheetCoordinator coordinator = ShareSheetCoordinator coordinator =
new ShareSheetCoordinator(controller, tabProvider, tabCreator, new ShareSheetCoordinator(controller, tabProvider,
new ShareSheetPropertyModelBuilder(controller, new ShareSheetPropertyModelBuilder(controller,
ContextUtils.getApplicationContext().getPackageManager())); ContextUtils.getApplicationContext().getPackageManager()));
// TODO(crbug/1009124): open custom share sheet. // TODO(crbug/1009124): open custom share sheet.
......
...@@ -20,10 +20,7 @@ import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity; ...@@ -20,10 +20,7 @@ import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity;
import org.chromium.chrome.browser.share.qrcode.QrCodeCoordinator; import org.chromium.chrome.browser.share.qrcode.QrCodeCoordinator;
import org.chromium.chrome.browser.share.screenshot.ScreenshotCoordinator; import org.chromium.chrome.browser.share.screenshot.ScreenshotCoordinator;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.NavigationEntry; import org.chromium.content_public.browser.NavigationEntry;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.widget.Toast; import org.chromium.ui.widget.Toast;
...@@ -36,20 +33,17 @@ import java.util.ArrayList; ...@@ -36,20 +33,17 @@ import java.util.ArrayList;
public class ShareSheetCoordinator { public class ShareSheetCoordinator {
private final BottomSheetController mBottomSheetController; private final BottomSheetController mBottomSheetController;
private final ActivityTabProvider mActivityTabProvider; private final ActivityTabProvider mActivityTabProvider;
private final TabCreatorManager.TabCreator mTabCreator;
private final ShareSheetPropertyModelBuilder mPropertyModelBuilder; private final ShareSheetPropertyModelBuilder mPropertyModelBuilder;
/** /**
* Constructs a new ShareSheetCoordinator. * Constructs a new ShareSheetCoordinator.
* @param controller The BottomSheetController for the current activity. * @param controller The BottomSheetController for the current activity.
* @param provider The ActivityTabProvider for the current visible tab. * @param provider The ActivityTabProvider for the current visible tab.
* @param tabCreator The TabCreator for the current selected {@link TabModel}.
*/ */
public ShareSheetCoordinator(BottomSheetController controller, ActivityTabProvider provider, public ShareSheetCoordinator(BottomSheetController controller, ActivityTabProvider provider,
TabCreatorManager.TabCreator tabCreator, ShareSheetPropertyModelBuilder modelBuilder) { ShareSheetPropertyModelBuilder modelBuilder) {
mBottomSheetController = controller; mBottomSheetController = controller;
mActivityTabProvider = provider; mActivityTabProvider = provider;
mTabCreator = tabCreator;
mPropertyModelBuilder = modelBuilder; mPropertyModelBuilder = modelBuilder;
} }
...@@ -86,8 +80,7 @@ public class ShareSheetCoordinator { ...@@ -86,8 +80,7 @@ public class ShareSheetCoordinator {
(currentActivity) (currentActivity)
-> { -> {
mBottomSheetController.hideContent(bottomSheet, true); mBottomSheetController.hideContent(bottomSheet, true);
QrCodeCoordinator qrCodeCoordinator = QrCodeCoordinator qrCodeCoordinator = new QrCodeCoordinator(activity);
new QrCodeCoordinator(activity, this::createNewTab);
qrCodeCoordinator.show(); qrCodeCoordinator.show();
}, },
/*isFirstParty=*/true); /*isFirstParty=*/true);
...@@ -171,9 +164,4 @@ public class ShareSheetCoordinator { ...@@ -171,9 +164,4 @@ public class ShareSheetCoordinator {
return models; return models;
} }
private void createNewTab(String url) {
mTabCreator.createNewTab(
new LoadUrlParams(url), TabLaunchType.FROM_LINK, mActivityTabProvider.get());
}
} }
...@@ -20,7 +20,6 @@ import org.chromium.chrome.browser.ActivityTabProvider; ...@@ -20,7 +20,6 @@ import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.share.ShareDelegateImpl.ShareSheetDelegate; import org.chromium.chrome.browser.share.ShareDelegateImpl.ShareSheetDelegate;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
...@@ -115,16 +114,14 @@ public class ShareDelegateImplIntegrationTest { ...@@ -115,16 +114,14 @@ public class ShareDelegateImplIntegrationTest {
ShareSheetDelegate delegate = new ShareSheetDelegate() { ShareSheetDelegate delegate = new ShareSheetDelegate() {
@Override @Override
void share(ShareParams params, BottomSheetController controller, void share(ShareParams params, BottomSheetController controller,
ActivityTabProvider tabProvider, TabCreatorManager.TabCreator tabCreator, ActivityTabProvider tabProvider, long shareStartTime) {
long shareStartTime) {
paramsRef.set(params); paramsRef.set(params);
helper.notifyCalled(); helper.notifyCalled();
} }
}; };
new ShareDelegateImpl(mActivityTestRule.getActivity().getBottomSheetController(), new ShareDelegateImpl(mActivityTestRule.getActivity().getBottomSheetController(),
mActivityTestRule.getActivity().getActivityTabProvider(), delegate, mActivityTestRule.getActivity().getActivityTabProvider(), delegate)
mActivityTestRule.getActivity().getCurrentTabCreator())
.share(mActivityTestRule.getActivity().getActivityTab(), false); .share(mActivityTestRule.getActivity().getActivityTab(), false);
}); });
helper.waitForCallback(0); helper.waitForCallback(0);
......
...@@ -78,7 +78,7 @@ public final class ShareSheetCoordinatorTest { ...@@ -78,7 +78,7 @@ public final class ShareSheetCoordinatorTest {
@Features.DisableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT}) @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT})
public void testCreateTopRowPropertyModelsScreenshotsDisabled() { public void testCreateTopRowPropertyModelsScreenshotsDisabled() {
ShareSheetCoordinator coordinator = ShareSheetCoordinator coordinator =
new ShareSheetCoordinator(null, null, null, mPropertyModelBuilder); new ShareSheetCoordinator(null, null, mPropertyModelBuilder);
Activity activity = mActivityTestRule.getActivity(); Activity activity = mActivityTestRule.getActivity();
ShareSheetBottomSheetContent bottomSheet = new ShareSheetBottomSheetContent(activity); ShareSheetBottomSheetContent bottomSheet = new ShareSheetBottomSheetContent(activity);
...@@ -108,7 +108,7 @@ public final class ShareSheetCoordinatorTest { ...@@ -108,7 +108,7 @@ public final class ShareSheetCoordinatorTest {
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT}) @Features.EnableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT})
public void testCreateTopRowPropertyModelsScreenshotsEnabled() { public void testCreateTopRowPropertyModelsScreenshotsEnabled() {
ShareSheetCoordinator coordinator = ShareSheetCoordinator coordinator =
new ShareSheetCoordinator(null, null, null, mPropertyModelBuilder); new ShareSheetCoordinator(null, null, mPropertyModelBuilder);
Activity activity = mActivityTestRule.getActivity(); Activity activity = mActivityTestRule.getActivity();
ShareSheetBottomSheetContent bottomSheet = new ShareSheetBottomSheetContent(activity); ShareSheetBottomSheetContent bottomSheet = new ShareSheetBottomSheetContent(activity);
...@@ -141,7 +141,7 @@ public final class ShareSheetCoordinatorTest { ...@@ -141,7 +141,7 @@ public final class ShareSheetCoordinatorTest {
@MediumTest @MediumTest
public void testCreateBottomRowPropertyModels() { public void testCreateBottomRowPropertyModels() {
ShareSheetCoordinator coordinator = ShareSheetCoordinator coordinator =
new ShareSheetCoordinator(null, null, null, mPropertyModelBuilder); new ShareSheetCoordinator(null, null, mPropertyModelBuilder);
Activity activity = mActivityTestRule.getActivity(); Activity activity = mActivityTestRule.getActivity();
ShareSheetBottomSheetContent bottomSheet = new ShareSheetBottomSheetContent(activity); ShareSheetBottomSheetContent bottomSheet = new ShareSheetBottomSheetContent(activity);
......
...@@ -2,11 +2,10 @@ include_rules = [ ...@@ -2,11 +2,10 @@ include_rules = [
# TODO(crbug/1022172): Remove this dependency when ShareActivity is moved to # TODO(crbug/1022172): Remove this dependency when ShareActivity is moved to
# chrome/browser/share. # chrome/browser/share.
"+chrome/android/java/src/org/chromium/chrome/browser/share", "+chrome/android/java/src/org/chromium/chrome/browser/share",
"+chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java",
"+chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java", "+chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java",
"+chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java",
"+chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java",
"+chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java",
"+chrome/android/java/src/org/chromium/chrome/browser/modules/ModuleInstallUi.java", "+chrome/android/java/src/org/chromium/chrome/browser/modules/ModuleInstallUi.java",
"+chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java", "+chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java",
"+chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreatorManager.java",
"+content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java",
] ]
...@@ -7,12 +7,6 @@ package org.chromium.chrome.browser.share.qrcode; ...@@ -7,12 +7,6 @@ package org.chromium.chrome.browser.share.qrcode;
import android.app.Activity; import android.app.Activity;
import android.app.FragmentManager; import android.app.FragmentManager;
import org.chromium.chrome.browser.share.qrcode.scan_tab.QrCodeScanCoordinator;
import org.chromium.chrome.browser.share.qrcode.scan_tab.QrCodeScanMediator;
import org.chromium.chrome.browser.share.qrcode.share_tab.QrCodeShareCoordinator;
import java.util.ArrayList;
/** /**
* Creates and represents the QrCode main UI. * Creates and represents the QrCode main UI.
*/ */
...@@ -20,16 +14,8 @@ public class QrCodeCoordinator { ...@@ -20,16 +14,8 @@ public class QrCodeCoordinator {
private final QrCodeDialog mDialog; private final QrCodeDialog mDialog;
private final FragmentManager mFragmentManager; private final FragmentManager mFragmentManager;
public QrCodeCoordinator(Activity activity, QrCodeScanMediator.TabCreator tabCreator) { public QrCodeCoordinator(Activity activity) {
QrCodeShareCoordinator shareCoordinator = new QrCodeShareCoordinator(activity); mDialog = new QrCodeDialog();
QrCodeScanCoordinator scanCoordinator =
new QrCodeScanCoordinator(activity, this::dismiss, tabCreator);
ArrayList<QrCodeDialogTab> tabs = new ArrayList<QrCodeDialogTab>();
tabs.add(shareCoordinator);
tabs.add(scanCoordinator);
mDialog = new QrCodeDialog(tabs);
mFragmentManager = activity.getFragmentManager(); mFragmentManager = activity.getFragmentManager();
} }
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
package org.chromium.chrome.browser.share.qrcode; package org.chromium.chrome.browser.share.qrcode;
import android.annotation.SuppressLint;
import android.app.Dialog; import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.TabLayout; import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
...@@ -14,6 +14,8 @@ import android.support.v7.app.AlertDialog; ...@@ -14,6 +14,8 @@ import android.support.v7.app.AlertDialog;
import android.view.View; import android.view.View;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.share.qrcode.scan_tab.QrCodeScanCoordinator;
import org.chromium.chrome.browser.share.qrcode.share_tab.QrCodeShareCoordinator;
import org.chromium.ui.widget.ChromeImageButton; import org.chromium.ui.widget.ChromeImageButton;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -23,25 +25,25 @@ import java.util.ArrayList; ...@@ -23,25 +25,25 @@ import java.util.ArrayList;
*/ */
public class QrCodeDialog extends DialogFragment { public class QrCodeDialog extends DialogFragment {
private ArrayList<QrCodeDialogTab> mTabs; private ArrayList<QrCodeDialogTab> mTabs;
private Context mContext;
/** /**
* The QrCodeDialog constructor. * The QrCodeDialog constructor.
* TODO(tgupta): This causes an NPE when the user moves away from Chrome
* and comes back. Fix this issue.
*/ */
public QrCodeDialog() {} public QrCodeDialog() {
mTabs = new ArrayList<QrCodeDialogTab>();
}
/** @Override
* The QrCodeDialog constructor. public void onAttach(Context context) {
* @param tabs The array of tabs for the tab layout. super.onAttach(context);
*/ mContext = context;
/**
* TODO(gayane): Resolve lint warning. Per warning, tabs should be passed through Bundle, but I QrCodeShareCoordinator shareCoordinator = new QrCodeShareCoordinator(context);
* don't want to make all the classes parcelable. QrCodeScanCoordinator scanCoordinator = new QrCodeScanCoordinator(context, this::dismiss);
*/
@SuppressLint("ValidFragment") mTabs.add(shareCoordinator);
public QrCodeDialog(ArrayList<QrCodeDialogTab> tabs) { mTabs.add(scanCoordinator);
mTabs = tabs;
} }
@Override @Override
...@@ -67,6 +69,16 @@ public class QrCodeDialog extends DialogFragment { ...@@ -67,6 +69,16 @@ public class QrCodeDialog extends DialogFragment {
} }
} }
@Override
public void onDestroy() {
super.onDestroy();
mContext = null;
for (QrCodeDialogTab tab : mTabs) {
tab.onDestroy();
}
mTabs.clear();
}
private View getDialogView() { private View getDialogView() {
View dialogView = (View) getActivity().getLayoutInflater().inflate( View dialogView = (View) getActivity().getLayoutInflater().inflate(
org.chromium.chrome.browser.share.qrcode.R.layout.qrcode_dialog, null); org.chromium.chrome.browser.share.qrcode.R.layout.qrcode_dialog, null);
......
...@@ -15,4 +15,6 @@ public interface QrCodeDialogTab { ...@@ -15,4 +15,6 @@ public interface QrCodeDialogTab {
public void onResume(); public void onResume();
public void onPause(); public void onPause();
public void onDestroy();
} }
\ No newline at end of file
...@@ -4,37 +4,22 @@ ...@@ -4,37 +4,22 @@
package org.chromium.chrome.browser.share.qrcode; package org.chromium.chrome.browser.share.qrcode;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.share.ShareActivity; import org.chromium.chrome.browser.share.ShareActivity;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.content_public.browser.LoadUrlParams;
/** /**
* A simple activity that shows sharing QR code option in share menu. * A simple activity that shows sharing QR code option in share menu.
*/ */
public class QrCodeShareActivity extends ShareActivity { public class QrCodeShareActivity extends ShareActivity {
private ActivityTabProvider mActivityTabProvider;
private TabCreatorManager.TabCreator mTabCreator;
@Override @Override
protected void handleShareAction(ChromeActivity triggeringActivity) { protected void handleShareAction(ChromeActivity triggeringActivity) {
mActivityTabProvider = triggeringActivity.getActivityTabProvider(); QrCodeCoordinator qrCodeCoordinator = new QrCodeCoordinator(triggeringActivity);
mTabCreator = triggeringActivity.getCurrentTabCreator();
QrCodeCoordinator qrCodeCoordinator =
new QrCodeCoordinator(triggeringActivity, this::createNewTab);
qrCodeCoordinator.show(); qrCodeCoordinator.show();
} }
public static boolean featureIsAvailable() { public static boolean featureIsAvailable() {
return ChromeFeatureList.isEnabled(ChromeFeatureList.SHARING_QR_CODE_ANDROID); return ChromeFeatureList.isEnabled(ChromeFeatureList.SHARING_QR_CODE_ANDROID);
} }
private void createNewTab(String url) {
mTabCreator.createNewTab(
new LoadUrlParams(url), TabLaunchType.FROM_LINK, mActivityTabProvider.get());
}
} }
\ No newline at end of file
...@@ -23,10 +23,9 @@ public class QrCodeScanCoordinator implements QrCodeDialogTab { ...@@ -23,10 +23,9 @@ public class QrCodeScanCoordinator implements QrCodeDialogTab {
* *
* @param context The context to use for user permissions. * @param context The context to use for user permissions.
*/ */
public QrCodeScanCoordinator(Context context, QrCodeScanMediator.NavigationObserver observer, public QrCodeScanCoordinator(Context context, QrCodeScanMediator.NavigationObserver observer) {
QrCodeScanMediator.TabCreator tabCreator) {
PropertyModel scanViewModel = new PropertyModel(QrCodeScanViewProperties.ALL_KEYS); PropertyModel scanViewModel = new PropertyModel(QrCodeScanViewProperties.ALL_KEYS);
mMediator = new QrCodeScanMediator(context, scanViewModel, observer, tabCreator); mMediator = new QrCodeScanMediator(context, scanViewModel, observer);
mScanView = new QrCodeScanView( mScanView = new QrCodeScanView(
context, mMediator::onPreviewFrame, mMediator::promptForCameraPermission); context, mMediator::onPreviewFrame, mMediator::promptForCameraPermission);
...@@ -48,4 +47,9 @@ public class QrCodeScanCoordinator implements QrCodeDialogTab { ...@@ -48,4 +47,9 @@ public class QrCodeScanCoordinator implements QrCodeDialogTab {
public void onPause() { public void onPause() {
mMediator.setIsOnForeground(false); mMediator.setIsOnForeground(false);
} }
@Override
public void onDestroy() {
mScanView.stopCamera();
}
} }
...@@ -7,12 +7,15 @@ package org.chromium.chrome.browser.share.qrcode.scan_tab; ...@@ -7,12 +7,15 @@ package org.chromium.chrome.browser.share.qrcode.scan_tab;
import android.Manifest.permission; import android.Manifest.permission;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.ImageFormat; import android.graphics.ImageFormat;
import android.hardware.Camera; import android.hardware.Camera;
import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Process; import android.os.Process;
import android.provider.Browser;
import android.util.SparseArray; import android.util.SparseArray;
import android.webkit.URLUtil; import android.webkit.URLUtil;
...@@ -20,6 +23,9 @@ import com.google.android.gms.vision.Frame; ...@@ -20,6 +23,9 @@ import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.barcode.Barcode; import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector; import com.google.android.gms.vision.barcode.BarcodeDetector;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.ui.base.ActivityAndroidPermissionDelegate; import org.chromium.ui.base.ActivityAndroidPermissionDelegate;
import org.chromium.ui.base.AndroidPermissionDelegate; import org.chromium.ui.base.AndroidPermissionDelegate;
import org.chromium.ui.base.PermissionCallback; import org.chromium.ui.base.PermissionCallback;
...@@ -43,7 +49,6 @@ public class QrCodeScanMediator implements Camera.PreviewCallback { ...@@ -43,7 +49,6 @@ public class QrCodeScanMediator implements Camera.PreviewCallback {
private final PropertyModel mPropertyModel; private final PropertyModel mPropertyModel;
private final BarcodeDetector mDetector; private final BarcodeDetector mDetector;
private final NavigationObserver mNavigationObserver; private final NavigationObserver mNavigationObserver;
private final TabCreator mTabCreator;
private final Handler mMainThreadHandler; private final Handler mMainThreadHandler;
private final AndroidPermissionDelegate mPermissionDelegate; private final AndroidPermissionDelegate mPermissionDelegate;
...@@ -54,8 +59,7 @@ public class QrCodeScanMediator implements Camera.PreviewCallback { ...@@ -54,8 +59,7 @@ public class QrCodeScanMediator implements Camera.PreviewCallback {
* @param propertyModel The property modelto use to communicate with views. * @param propertyModel The property modelto use to communicate with views.
* @param observer The observer for navigation event. * @param observer The observer for navigation event.
*/ */
QrCodeScanMediator(Context context, PropertyModel propertyModel, NavigationObserver observer, QrCodeScanMediator(Context context, PropertyModel propertyModel, NavigationObserver observer) {
TabCreator tabCreator) {
mContext = context; mContext = context;
mPropertyModel = propertyModel; mPropertyModel = propertyModel;
mPermissionDelegate = new ActivityAndroidPermissionDelegate( mPermissionDelegate = new ActivityAndroidPermissionDelegate(
...@@ -63,7 +67,6 @@ public class QrCodeScanMediator implements Camera.PreviewCallback { ...@@ -63,7 +67,6 @@ public class QrCodeScanMediator implements Camera.PreviewCallback {
updatePermissionSettings(); updatePermissionSettings();
mDetector = new BarcodeDetector.Builder(context).build(); mDetector = new BarcodeDetector.Builder(context).build();
mNavigationObserver = observer; mNavigationObserver = observer;
mTabCreator = tabCreator;
mMainThreadHandler = new Handler(Looper.getMainLooper()); mMainThreadHandler = new Handler(Looper.getMainLooper());
} }
...@@ -160,8 +163,21 @@ public class QrCodeScanMediator implements Camera.PreviewCallback { ...@@ -160,8 +163,21 @@ public class QrCodeScanMediator implements Camera.PreviewCallback {
/** Tab creation should happen on the main thread. */ /** Tab creation should happen on the main thread. */
mMainThreadHandler.post(() -> { mMainThreadHandler.post(() -> {
mTabCreator.createNewTab(firstCode.rawValue); openUrl(firstCode.rawValue);
mNavigationObserver.onNavigation(); mNavigationObserver.onNavigation();
}); });
} }
private void openUrl(String url) {
Intent intent =
new Intent()
.setAction(Intent.ACTION_VIEW)
.setData(Uri.parse(url))
.setClass(mContext, ChromeLauncherActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName())
.putExtra(ShortcutHelper.REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB, true);
IntentHandler.addTrustedIntentExtras(intent);
mContext.startActivity(intent);
}
} }
...@@ -203,10 +203,7 @@ class QrCodeScanView { ...@@ -203,10 +203,7 @@ class QrCodeScanView {
/** Creates and sets the camera preview. */ /** Creates and sets the camera preview. */
private void setCameraPreview() { private void setCameraPreview() {
mView.removeAllViews(); mView.removeAllViews();
if (mCameraPreview != null) { stopCamera();
mCameraPreview.stopCamera();
mCameraPreview = null;
}
if (mHasCameraPermission) { if (mHasCameraPermission) {
mCameraPreview = mCameraPreview =
...@@ -250,6 +247,15 @@ class QrCodeScanView { ...@@ -250,6 +247,15 @@ class QrCodeScanView {
mView.addView(mCameraErrorView); mView.addView(mCameraErrorView);
} }
/**
* Returns an Intent to show the App Info page for the current app.
*/
private Intent getAppInfoIntent(String packageName) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(new Uri.Builder().scheme("package").opaquePart(packageName).build());
return intent;
}
/** /**
* Displays the open settings dialog. * Displays the open settings dialog.
*/ */
...@@ -257,12 +263,14 @@ class QrCodeScanView { ...@@ -257,12 +263,14 @@ class QrCodeScanView {
mView.removeAllViews(); mView.removeAllViews();
mView.addView(mOpenSettingsView); mView.addView(mOpenSettingsView);
} }
/** /**
* Returns an Intent to show the App Info page for the current app. * Stop the camera.
*/ */
private Intent getAppInfoIntent(String packageName) { public void stopCamera() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); if (mCameraPreview != null) {
intent.setData(new Uri.Builder().scheme("package").opaquePart(packageName).build()); mCameraPreview.stopCamera();
return intent; mCameraPreview = null;
}
} }
} }
...@@ -30,4 +30,7 @@ public class QrCodeShareCoordinator implements QrCodeDialogTab { ...@@ -30,4 +30,7 @@ public class QrCodeShareCoordinator implements QrCodeDialogTab {
@Override @Override
public void onPause() {} public void onPause() {}
@Override
public void onDestroy() {}
} }
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment