Commit 81b83c31 authored by Nevin Chen's avatar Nevin Chen
Browse files

Bug 1365868 - Add basic context menu: Open in Firefox. r=maliu

MozReview-Commit-ID: BxjFKKNcCiQ

--HG--
extra : rebase_source : fb28b1366219a56e695c7faad56d931cd330fcd7
parent 814f44a0
Loading
Loading
Loading
Loading
+67 −1
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
package org.mozilla.gecko.customtabs;

import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
@@ -17,6 +18,7 @@ import android.os.Bundle;
import android.provider.Browser;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.util.SparseArrayCompat;
import android.support.v7.app.ActionBar;
@@ -28,9 +30,11 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;

import org.mozilla.gecko.ActivityHandlerHelper;
import org.mozilla.gecko.BrowserApp;
import org.mozilla.gecko.DoorHangerPopup;
import org.mozilla.gecko.EventDispatcher;
import org.mozilla.gecko.GeckoView;
@@ -43,12 +47,16 @@ import org.mozilla.gecko.menu.GeckoMenu;
import org.mozilla.gecko.menu.GeckoMenuInflater;
import org.mozilla.gecko.mozglue.SafeIntent;
import org.mozilla.gecko.permissions.Permissions;
import org.mozilla.gecko.prompts.Prompt;
import org.mozilla.gecko.prompts.PromptListItem;
import org.mozilla.gecko.prompts.PromptService;
import org.mozilla.gecko.util.ActivityUtils;
import org.mozilla.gecko.util.Clipboard;
import org.mozilla.gecko.util.ColorUtil;
import org.mozilla.gecko.util.GeckoBundle;
import org.mozilla.gecko.util.IntentUtils;
import org.mozilla.gecko.util.ThreadUtils;
import org.mozilla.gecko.util.URIUtils;
import org.mozilla.gecko.widget.GeckoPopupMenu;

import java.util.List;
@@ -597,5 +605,63 @@ public class CustomTabsActivity extends AppCompatActivity

    @Override
    public void onContextMenu(GeckoView view, int screenX, int screenY,
                              String uri, String elementSrc) {}
                              final String uri, final String elementSrc) {

        final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
        final Uri validUri = getValidURL(content);
        if (validUri == null) {
            return;
        }

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                openInFennec(validUri, CustomTabsActivity.this);
            }
        });
    }

    void openInFennec(final Uri uri, final Context context) {
        ThreadUtils.assertOnUiThread();

        final Prompt prompt = new Prompt(context, new Prompt.PromptCallback() {
            @Override
            public void onPromptFinished(final GeckoBundle result) {

                final int itemId = result.getInt("button", -1);

                if (itemId == -1) {
                    // this is the error case, we shouldn't have this situation.
                    return;
                }
                Intent intent = new Intent(context, BrowserApp.class);
                // BrowserApp's onNewIntent will check action so below is required
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(uri);
                intent.setPackage(context.getPackageName());
                context.startActivity(intent);

            }
        });

        final PromptListItem[] items = new PromptListItem[1];
        items[0] = new PromptListItem(context.getResources().getString(R.string.overlay_share_open_browser_btn_label));
        prompt.show("", "", items, ListView.CHOICE_MODE_NONE);

    }

    @Nullable
    Uri getValidURL(@NonNull String urlString) {
        final Uri uri = Uri.parse(urlString);
        if (uri == null) {
            return null;
        }
        final String scheme = uri.getScheme();
        // currently we only support http and https to open in Firefox
        if (scheme.equals("http") || scheme.equals("https")) {
            return uri;
        } else {
            return null;
        }
    }
}