Files
tubestation/mobile/android/base/tabqueue/TabQueueDispatcher.java
2015-08-13 14:31:10 +01:00

103 lines
3.9 KiB
Java

/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.tabqueue;
import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.Locales;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.mozglue.ContextUtils;
import org.mozilla.gecko.preferences.GeckoPreferences;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
/**
* This class takes over external url loads (Intent.VIEW) from the BrowserApp class. It determines if
* the tab queue functionality is enabled and forwards the intent to the TabQueueService to process if it is.
*
* If the tab queue functionality is not enabled then it forwards the intent to BrowserApp to handle as normal.
*/
public class TabQueueDispatcher extends Locales.LocaleAwareActivity {
private static final String LOGTAG = "Gecko" + TabQueueDispatcher.class.getSimpleName();
public static final String SKIP_TAB_QUEUE_FLAG = "skip_tab_queue";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeckoAppShell.ensureCrashHandling();
// The EXCLUDE_FROM_RECENTS flag is sticky
// (see http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.0_r1/com/android/server/am/ActivityRecord.java/#468)
// So let's remove this whilst keeping all other flags the same, otherwise BrowserApp will vanish from Recents!
Intent intent = getIntent();
int flags = intent.getFlags() & ~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
intent.setFlags(flags);
ContextUtils.SafeIntent safeIntent = new ContextUtils.SafeIntent(intent);
// For the moment lets exit early and start fennec as normal if we're not in nightly with
// the tab queue build flag.
if (!AppConstants.MOZ_ANDROID_TAB_QUEUE) {
loadNormally(safeIntent.getUnsafe());
return;
}
// Skip the Tab Queue if instructed.
boolean shouldSkipTabQueue = safeIntent.getBooleanExtra(SKIP_TAB_QUEUE_FLAG, false);
if (shouldSkipTabQueue) {
loadNormally(safeIntent.getUnsafe());
return;
}
// The URL is usually hiding somewhere in the extra text. Extract it.
final String dataString = safeIntent.getDataString();
if (TextUtils.isEmpty(dataString)) {
abortDueToNoURL(dataString);
return;
}
boolean shouldShowOpenInBackgroundToast = TabQueueHelper.isTabQueueEnabled(this);
if (shouldShowOpenInBackgroundToast) {
showToast(safeIntent.getUnsafe());
} else {
loadNormally(safeIntent.getUnsafe());
}
}
private void showToast(Intent intent) {
intent.setClass(getApplicationContext(), TabQueueService.class);
startService(intent);
finish();
}
/**
* Start fennec with the supplied intent.
*/
private void loadNormally(Intent intent) {
intent.setClassName(getApplicationContext(), AppConstants.MOZ_ANDROID_BROWSER_INTENT_CLASS);
startActivity(intent);
Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.INTENT, "");
finish();
}
/**
* Abort as we were started with no URL.
* @param dataString
*/
private void abortDueToNoURL(String dataString) {
// TODO: Lets decide what to do here in bug 1134148
Log.w(LOGTAG, "Unable to process tab queue insertion. No URL found! - passed data string: " + dataString);
finish();
}
}