diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java index 1fea005722ec..5c09d5153152 100644 --- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java @@ -144,6 +144,7 @@ public abstract class GeckoApp public static final String ACTION_LAUNCH_SETTINGS = "org.mozilla.gecko.SETTINGS"; public static final String ACTION_LOAD = "org.mozilla.gecko.LOAD"; public static final String ACTION_INIT_PW = "org.mozilla.gecko.INIT_PW"; + public static final String ACTION_SWITCH_TAB = "org.mozilla.gecko.SWITCH_TAB"; public static final String INTENT_REGISTER_STUMBLER_LISTENER = "org.mozilla.gecko.STUMBLER_REGISTER_LOCAL_LISTENER"; @@ -2077,6 +2078,9 @@ public abstract class GeckoApp // Copy extras. settingsIntent.putExtras(intent.getUnsafe()); startActivity(settingsIntent); + } else if (ACTION_SWITCH_TAB.equals(action)) { + final int tabId = intent.getIntExtra("TabId", -1); + Tabs.getInstance().selectTab(tabId); } recordStartupActionTelemetry(passedUri, action); diff --git a/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java b/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java index fd10b60d2d3d..d008d679ff26 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java @@ -19,6 +19,7 @@ import android.util.Log; import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.BrowserApp; +import org.mozilla.gecko.GeckoApp; import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.PrefsHelper; import org.mozilla.gecko.R; @@ -297,7 +298,7 @@ public class MediaControlService extends Service implements Tabs.OnTabsChangedLi .setLargeIcon(generateCoverArt(tab)) .setContentTitle(tab.getTitle()) .setContentText(tab.getURL()) - .setContentIntent(createContentIntent()) + .setContentIntent(createContentIntent(tab.getId())) .setDeleteIntent(createDeleteIntent()) .setStyle(style) .addAction(createNotificationAction(action)) @@ -330,9 +331,11 @@ public class MediaControlService extends Service implements Tabs.OnTabsChangedLi return new Notification.Action.Builder(icon, title, pendingIntent).build(); } - private PendingIntent createContentIntent() { + private PendingIntent createContentIntent(int tabId) { Intent intent = new Intent(getApplicationContext(), BrowserApp.class); - return PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); + intent.setAction(GeckoApp.ACTION_SWITCH_TAB); + intent.putExtra("TabId", tabId); + return PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } private PendingIntent createDeleteIntent() { diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/SafeIntent.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/SafeIntent.java index 76ad7ef4e2c9..da0d54f2adb3 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/SafeIntent.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/SafeIntent.java @@ -38,6 +38,18 @@ public class SafeIntent { } } + public int getIntExtra(final String name, final int defaultValue) { + try { + return intent.getIntExtra(name, defaultValue); + } catch (OutOfMemoryError e) { + Log.w(LOGTAG, "Couldn't get intent extras: OOM. Malformed?"); + return defaultValue; + } catch (RuntimeException e) { + Log.w(LOGTAG, "Couldn't get intent extras.", e); + return defaultValue; + } + } + public String getStringExtra(final String name) { try { return intent.getStringExtra(name);