{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/comments/168320724","pull_request_review_id":96669745,"id":168320724,"diff_hunk":"@@ -0,0 +1,882 @@\n+package org.mozilla.focus.web;\n+\n+import android.app.Activity;\n+import android.app.AlertDialog;\n+import android.content.ActivityNotFoundException;\n+import android.content.ClipData;\n+import android.content.Context;\n+import android.content.DialogInterface;\n+import android.content.Intent;\n+import android.content.res.TypedArray;\n+import android.graphics.Color;\n+import android.graphics.PorterDuff;\n+import android.net.Uri;\n+import android.os.Build;\n+import android.text.InputType;\n+import android.text.format.DateFormat;\n+import android.util.Log;\n+import android.view.InflateException;\n+import android.view.LayoutInflater;\n+import android.view.View;\n+import android.view.ViewGroup;\n+import android.widget.AdapterView;\n+import android.widget.ArrayAdapter;\n+import android.widget.CheckBox;\n+import android.widget.CheckedTextView;\n+import android.widget.CompoundButton;\n+import android.widget.DatePicker;\n+import android.widget.EditText;\n+import android.widget.FrameLayout;\n+import android.widget.ImageView;\n+import android.widget.LinearLayout;\n+import android.widget.ListView;\n+import android.widget.ScrollView;\n+import android.widget.Spinner;\n+import android.widget.TextView;\n+import android.widget.TimePicker;\n+\n+import java.text.ParseException;\n+import java.text.SimpleDateFormat;\n+import java.util.ArrayList;\n+import java.util.Calendar;\n+import java.util.Date;\n+import java.util.Locale;\n+\n+import org.mozilla.focus.R;\n+import org.mozilla.gecko.GeckoSession;\n+import org.mozilla.gecko.util.GeckoBundle;\n+\n+final class GeckoViewPrompt implements GeckoSession.PromptDelegate {\n+    protected static final String LOGTAG = \"BasicGeckoViewPrompt\";\n+\n+    private final Activity mActivity;\n+    public int filePickerRequestCode = 1;\n+    private int mFileType;\n+    private FileCallback mFileCallback;\n+\n+    public GeckoViewPrompt(final Activity activity) {\n+        mActivity = activity;\n+    }\n+\n+    private AlertDialog.Builder addCheckbox(final AlertDialog.Builder builder,\n+                                            ViewGroup parent,\n+                                            final AlertCallback callback) {\n+        if (!callback.hasCheckbox()) {\n+            return builder;\n+        }\n+        final CheckBox checkbox = new CheckBox(builder.getContext());\n+        if (callback.getCheckboxMessage() != null) {\n+            checkbox.setText(callback.getCheckboxMessage());\n+        }\n+        checkbox.setChecked(callback.getCheckboxValue());\n+        checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n+            @Override\n+            public void onCheckedChanged(final CompoundButton button,\n+                                         final boolean checked) {\n+                callback.setCheckboxValue(checked);\n+            }\n+        });\n+        if (parent == null) {\n+            final int padding = getViewPadding(builder);\n+            parent = new FrameLayout(builder.getContext());\n+            parent.setPadding(/* left */ padding, /* top */ 0,\n+                              /* right */ padding, /* bottom */ 0);\n+            builder.setView(parent);\n+        }\n+        parent.addView(checkbox);\n+        return builder;\n+    }\n+\n+    public void alert(final GeckoSession session, final String title, final String msg,\n+                      final AlertCallback callback) {\n+        final Activity activity = mActivity;\n+        if (activity == null) {\n+            callback.dismiss();\n+            return;\n+        }\n+        final AlertDialog.Builder builder = new AlertDialog.Builder(activity)\n+                .setTitle(title)\n+                .setMessage(msg)\n+                .setPositiveButton(android.R.string.ok, /* onClickListener */ null);\n+        createStandardDialog(addCheckbox(builder, /* parent */ null, callback),\n+                callback).show();\n+    }\n+\n+    public void promptForButton(final GeckoSession session, final String title,\n+                                final String msg, final String[] btnMsg,\n+                                final ButtonCallback callback) {\n+        final Activity activity = mActivity;\n+        if (activity == null) {\n+            callback.dismiss();\n+            return;\n+        }\n+        final AlertDialog.Builder builder = new AlertDialog.Builder(activity)\n+                .setTitle(title)\n+                .setMessage(msg);\n+        final DialogInterface.OnClickListener listener =\n+                new DialogInterface.OnClickListener() {\n+                    @Override\n+                    public void onClick(final DialogInterface dialog, final int which) {\n+                        if (which == DialogInterface.BUTTON_POSITIVE) {\n+                            callback.confirm(BUTTON_TYPE_POSITIVE);\n+                        } else if (which == DialogInterface.BUTTON_NEUTRAL) {\n+                            callback.confirm(BUTTON_TYPE_NEUTRAL);\n+                        } else if (which == DialogInterface.BUTTON_NEGATIVE) {\n+                            callback.confirm(BUTTON_TYPE_NEGATIVE);\n+                        } else {\n+                            callback.dismiss();\n+                        }\n+                    }\n+                };\n+        if (btnMsg[BUTTON_TYPE_POSITIVE] != null) {\n+            builder.setPositiveButton(btnMsg[BUTTON_TYPE_POSITIVE], listener);\n+        }\n+        if (btnMsg[BUTTON_TYPE_NEUTRAL] != null) {\n+            builder.setNeutralButton(btnMsg[BUTTON_TYPE_NEUTRAL], listener);\n+        }\n+        if (btnMsg[BUTTON_TYPE_NEGATIVE] != null) {\n+            builder.setNegativeButton(btnMsg[BUTTON_TYPE_NEGATIVE], listener);\n+        }\n+        createStandardDialog(addCheckbox(builder, /* parent */ null, callback),\n+                callback).show();\n+    }\n+\n+    private int getViewPadding(final AlertDialog.Builder builder) {\n+        final TypedArray attr = builder.getContext().obtainStyledAttributes(\n+                new int[] { android.R.attr.listPreferredItemPaddingLeft });\n+        final int padding = attr.getDimensionPixelSize(0, 1);\n+        attr.recycle();\n+        return padding;\n+    }\n+\n+    private LinearLayout addStandardLayout(final AlertDialog.Builder builder,\n+                                           final String title, final String msg) {\n+        final ScrollView scrollView = new ScrollView(builder.getContext());\n+        final LinearLayout container = new LinearLayout(builder.getContext());\n+        final int horizontalPadding = getViewPadding(builder);\n+        final int verticalPadding = (msg == null || msg.isEmpty()) ? horizontalPadding : 0;\n+        container.setOrientation(LinearLayout.VERTICAL);\n+        container.setPadding(/* left */ horizontalPadding, /* top */ verticalPadding,\n+                             /* right */ horizontalPadding, /* bottom */ verticalPadding);\n+        scrollView.addView(container);\n+        builder.setTitle(title)\n+                .setMessage(msg)\n+                .setView(scrollView);\n+        return container;\n+    }\n+\n+    private AlertDialog createStandardDialog(final AlertDialog.Builder builder,\n+                                             final AlertCallback callback) {\n+        final AlertDialog dialog = builder.create();\n+        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {\n+            @Override\n+            public void onDismiss(final DialogInterface dialog) {\n+                callback.dismiss();\n+            }\n+        });\n+        return dialog;\n+    }\n+\n+    public void promptForText(final GeckoSession session, final String title,\n+                              final String msg, final String value,\n+                              final TextCallback callback) {\n+        final Activity activity = mActivity;\n+        if (activity == null) {\n+            callback.dismiss();\n+            return;\n+        }\n+        final AlertDialog.Builder builder = new AlertDialog.Builder(activity);\n+        final LinearLayout container = addStandardLayout(builder, title, msg);\n+        final EditText editText = new EditText(builder.getContext());\n+        editText.setText(value);\n+        container.addView(editText);\n+\n+        builder.setNegativeButton(android.R.string.cancel, /* listener */ null)\n+                .setPositiveButton(android.R.string.ok,\n+                        new DialogInterface.OnClickListener() {\n+                            @Override\n+                            public void onClick(final DialogInterface dialog, final int which) {\n+                                callback.confirm(editText.getText().toString());\n+                            }\n+                        });\n+\n+        createStandardDialog(addCheckbox(builder, container, callback), callback).show();\n+    }\n+\n+    public void promptForAuth(final GeckoSession session, final String title,\n+                              final String msg, final GeckoBundle options,\n+                              final AuthCallback callback) {\n+        final Activity activity = mActivity;\n+        if (activity == null) {\n+            callback.dismiss();\n+            return;\n+        }\n+        final AlertDialog.Builder builder = new AlertDialog.Builder(activity);\n+        final LinearLayout container = addStandardLayout(builder, title, msg);\n+\n+        final int flags = options.getInt(\"flags\");\n+        final int level = options.getInt(\"level\");\n+        final EditText username;\n+        if ((flags & AUTH_FLAG_ONLY_PASSWORD) == 0) {\n+            username = new EditText(builder.getContext());\n+            username.setHint(R.string.gv_prompt_username_hint);\n+            username.setText(options.getString(\"username\"));\n+            container.addView(username);\n+        } else {\n+            username = null;\n+        }\n+\n+        final EditText password = new EditText(builder.getContext());\n+        password.setHint(R.string.gv_prompt_password_hint);\n+        password.setText(options.getString(\"password\"));\n+        password.setInputType(InputType.TYPE_CLASS_TEXT |\n+                InputType.TYPE_TEXT_VARIATION_PASSWORD);\n+        container.addView(password);\n+\n+        if (level != AUTH_LEVEL_NONE) {\n+            final ImageView secure = new ImageView(builder.getContext());\n+            secure.setImageResource(android.R.drawable.ic_lock_lock);\n+            container.addView(secure);\n+        }\n+\n+        builder.setNegativeButton(android.R.string.cancel, /* listener */ null)\n+                .setPositiveButton(android.R.string.ok,\n+                        new DialogInterface.OnClickListener() {\n+                            @Override\n+                            public void onClick(final DialogInterface dialog, final int which) {\n+                                if ((flags & AUTH_FLAG_ONLY_PASSWORD) == 0) {\n+                                    callback.confirm(username.getText().toString(),\n+                                            password.getText().toString());\n+                                } else {\n+                                    callback.confirm(password.getText().toString());\n+                                }\n+                            }\n+                        });\n+        createStandardDialog(addCheckbox(builder, container, callback), callback).show();\n+    }\n+\n+    private void addChoiceItems(final int type, final ArrayAdapter<GeckoBundle> list,\n+                                final GeckoBundle[] items, final String indent) {\n+        if (type == CHOICE_TYPE_MENU) {\n+            list.addAll(items);\n+            return;\n+        }\n+\n+        for (final GeckoBundle item : items) {\n+            final GeckoBundle[] children = item.getBundleArray(\"items\");\n+            if (indent != null && children == null) {\n+                item.putString(\"label\", indent + item.getString(\"label\", \"\"));\n+            }\n+            list.add(item);\n+\n+            if (children != null) {\n+                final String newIndent;\n+                if (type == CHOICE_TYPE_SINGLE || type == CHOICE_TYPE_MULTIPLE) {\n+                    newIndent = (indent != null) ? indent + '\\t' : \"\\t\";\n+                } else {\n+                    newIndent = null;\n+                }\n+                addChoiceItems(type, list, children, newIndent);\n+            }\n+        }\n+    }\n+\n+    public void promptForChoice(final GeckoSession session, final String title,\n+                                final String msg, final int type,\n+                                final GeckoBundle[] choices, final ChoiceCallback callback) {\n+        final Activity activity = mActivity;\n+        if (activity == null) {\n+            callback.dismiss();\n+            return;\n+        }\n+        final AlertDialog.Builder builder = new AlertDialog.Builder(activity);\n+        addStandardLayout(builder, title, msg);\n+\n+        final ListView list = new ListView(builder.getContext());\n+        if (type == CHOICE_TYPE_MULTIPLE) {\n+            list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);\n+        }\n+\n+        final ArrayAdapter<GeckoBundle> adapter = new ArrayAdapter<GeckoBundle>(\n+                builder.getContext(), android.R.layout.simple_list_item_1) {\n+            private static final int TYPE_MENU_ITEM = 0;\n+            private static final int TYPE_MENU_CHECK = 1;\n+            private static final int TYPE_SEPARATOR = 2;\n+            private static final int TYPE_GROUP = 3;\n+            private static final int TYPE_SINGLE = 4;\n+            private static final int TYPE_MULTIPLE = 5;\n+            private static final int TYPE_COUNT = 6;\n+\n+            private LayoutInflater mInflater;\n+            private View mSeparator;\n+\n+            @Override\n+            public int getViewTypeCount() {\n+                return TYPE_COUNT;\n+            }\n+\n+            @Override\n+            public int getItemViewType(final int position) {\n+                final GeckoBundle item = getItem(position);\n+                if (item.getBoolean(\"separator\")) {\n+                    return TYPE_SEPARATOR;\n+                } else if (type == CHOICE_TYPE_MENU) {\n+                    return item.getBoolean(\"selected\") ? TYPE_MENU_CHECK : TYPE_MENU_ITEM;","path":"app/src/gecko/java/org/mozilla/focus/web/GeckoViewPrompt.java","position":324,"original_position":324,"commit_id":"6439bf07e0d87729e5f4198328ce1792bbde904f","original_commit_id":"6439bf07e0d87729e5f4198328ce1792bbde904f","user":{"login":"sputnikci","id":15047461,"avatar_url":"https://avatars2.githubusercontent.com/u/15047461?v=4","gravatar_id":"","url":"https://api.github.com/users/sputnikci","html_url":"https://github.com/sputnikci","followers_url":"https://api.github.com/users/sputnikci/followers","following_url":"https://api.github.com/users/sputnikci/following{/other_user}","gists_url":"https://api.github.com/users/sputnikci/gists{/gist_id}","starred_url":"https://api.github.com/users/sputnikci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sputnikci/subscriptions","organizations_url":"https://api.github.com/users/sputnikci/orgs","repos_url":"https://api.github.com/users/sputnikci/repos","events_url":"https://api.github.com/users/sputnikci/events{/privacy}","received_events_url":"https://api.github.com/users/sputnikci/received_events","type":"User","site_admin":false},"body":"\\[PMD\\] INFO: The String literal \"selected\" appears 4 times in this file; the first occurrence is on line 324","created_at":"2018-02-14T21:49:37Z","updated_at":"2018-02-14T21:49:37Z","html_url":"https://github.com/mozilla-mobile/focus-android/pull/2087#discussion_r168320724","pull_request_url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/comments/168320724"},"html":{"href":"https://github.com/mozilla-mobile/focus-android/pull/2087#discussion_r168320724"},"pull_request":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087","id":167549138,"html_url":"https://github.com/mozilla-mobile/focus-android/pull/2087","diff_url":"https://github.com/mozilla-mobile/focus-android/pull/2087.diff","patch_url":"https://github.com/mozilla-mobile/focus-android/pull/2087.patch","issue_url":"https://api.github.com/repos/mozilla-mobile/focus-android/issues/2087","number":2087,"state":"open","locked":false,"title":"WIP Improve Klar+GeckoView","user":{"login":"ekager","id":25442310,"avatar_url":"https://avatars2.githubusercontent.com/u/25442310?v=4","gravatar_id":"","url":"https://api.github.com/users/ekager","html_url":"https://github.com/ekager","followers_url":"https://api.github.com/users/ekager/followers","following_url":"https://api.github.com/users/ekager/following{/other_user}","gists_url":"https://api.github.com/users/ekager/gists{/gist_id}","starred_url":"https://api.github.com/users/ekager/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekager/subscriptions","organizations_url":"https://api.github.com/users/ekager/orgs","repos_url":"https://api.github.com/users/ekager/repos","events_url":"https://api.github.com/users/ekager/events{/privacy}","received_events_url":"https://api.github.com/users/ekager/received_events","type":"User","site_admin":false},"body":"Working off of #2067 ","created_at":"2018-02-06T22:37:13Z","updated_at":"2018-02-14T21:49:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f4d80b979dd8251cc0df418774816a1f0b7b7bbd","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":828094117,"url":"https://api.github.com/repos/mozilla-mobile/focus-android/labels/Klar+Geckoview","name":"Klar+Geckoview","color":"d6740c","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087/commits","review_comments_url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087/comments","review_comment_url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla-mobile/focus-android/issues/2087/comments","statuses_url":"https://api.github.com/repos/mozilla-mobile/focus-android/statuses/6439bf07e0d87729e5f4198328ce1792bbde904f","head":{"label":"ekager:gecko_hacking","ref":"gecko_hacking","sha":"6439bf07e0d87729e5f4198328ce1792bbde904f","user":{"login":"ekager","id":25442310,"avatar_url":"https://avatars2.githubusercontent.com/u/25442310?v=4","gravatar_id":"","url":"https://api.github.com/users/ekager","html_url":"https://github.com/ekager","followers_url":"https://api.github.com/users/ekager/followers","following_url":"https://api.github.com/users/ekager/following{/other_user}","gists_url":"https://api.github.com/users/ekager/gists{/gist_id}","starred_url":"https://api.github.com/users/ekager/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekager/subscriptions","organizations_url":"https://api.github.com/users/ekager/orgs","repos_url":"https://api.github.com/users/ekager/repos","events_url":"https://api.github.com/users/ekager/events{/privacy}","received_events_url":"https://api.github.com/users/ekager/received_events","type":"User","site_admin":false},"repo":{"id":93801164,"name":"focus-android","full_name":"ekager/focus-android","owner":{"login":"ekager","id":25442310,"avatar_url":"https://avatars2.githubusercontent.com/u/25442310?v=4","gravatar_id":"","url":"https://api.github.com/users/ekager","html_url":"https://github.com/ekager","followers_url":"https://api.github.com/users/ekager/followers","following_url":"https://api.github.com/users/ekager/following{/other_user}","gists_url":"https://api.github.com/users/ekager/gists{/gist_id}","starred_url":"https://api.github.com/users/ekager/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekager/subscriptions","organizations_url":"https://api.github.com/users/ekager/orgs","repos_url":"https://api.github.com/users/ekager/repos","events_url":"https://api.github.com/users/ekager/events{/privacy}","received_events_url":"https://api.github.com/users/ekager/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ekager/focus-android","description":"Firefox Focus: The privacy browser","fork":true,"url":"https://api.github.com/repos/ekager/focus-android","forks_url":"https://api.github.com/repos/ekager/focus-android/forks","keys_url":"https://api.github.com/repos/ekager/focus-android/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ekager/focus-android/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ekager/focus-android/teams","hooks_url":"https://api.github.com/repos/ekager/focus-android/hooks","issue_events_url":"https://api.github.com/repos/ekager/focus-android/issues/events{/number}","events_url":"https://api.github.com/repos/ekager/focus-android/events","assignees_url":"https://api.github.com/repos/ekager/focus-android/assignees{/user}","branches_url":"https://api.github.com/repos/ekager/focus-android/branches{/branch}","tags_url":"https://api.github.com/repos/ekager/focus-android/tags","blobs_url":"https://api.github.com/repos/ekager/focus-android/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ekager/focus-android/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ekager/focus-android/git/refs{/sha}","trees_url":"https://api.github.com/repos/ekager/focus-android/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ekager/focus-android/statuses/{sha}","languages_url":"https://api.github.com/repos/ekager/focus-android/languages","stargazers_url":"https://api.github.com/repos/ekager/focus-android/stargazers","contributors_url":"https://api.github.com/repos/ekager/focus-android/contributors","subscribers_url":"https://api.github.com/repos/ekager/focus-android/subscribers","subscription_url":"https://api.github.com/repos/ekager/focus-android/subscription","commits_url":"https://api.github.com/repos/ekager/focus-android/commits{/sha}","git_commits_url":"https://api.github.com/repos/ekager/focus-android/git/commits{/sha}","comments_url":"https://api.github.com/repos/ekager/focus-android/comments{/number}","issue_comment_url":"https://api.github.com/repos/ekager/focus-android/issues/comments{/number}","contents_url":"https://api.github.com/repos/ekager/focus-android/contents/{+path}","compare_url":"https://api.github.com/repos/ekager/focus-android/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ekager/focus-android/merges","archive_url":"https://api.github.com/repos/ekager/focus-android/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ekager/focus-android/downloads","issues_url":"https://api.github.com/repos/ekager/focus-android/issues{/number}","pulls_url":"https://api.github.com/repos/ekager/focus-android/pulls{/number}","milestones_url":"https://api.github.com/repos/ekager/focus-android/milestones{/number}","notifications_url":"https://api.github.com/repos/ekager/focus-android/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ekager/focus-android/labels{/name}","releases_url":"https://api.github.com/repos/ekager/focus-android/releases{/id}","deployments_url":"https://api.github.com/repos/ekager/focus-android/deployments","created_at":"2017-06-08T23:53:51Z","updated_at":"2018-02-12T20:59:31Z","pushed_at":"2018-02-14T21:29:59Z","git_url":"git://github.com/ekager/focus-android.git","ssh_url":"git@github.com:ekager/focus-android.git","clone_url":"https://github.com/ekager/focus-android.git","svn_url":"https://github.com/ekager/focus-android","homepage":"","size":158867,"stargazers_count":2,"watchers_count":2,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mpl-2.0","name":"Mozilla Public License 2.0","spdx_id":"MPL-2.0","url":"https://api.github.com/licenses/mpl-2.0"},"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"mozilla-mobile:master","ref":"master","sha":"086cb3be1297784366e722d1d374738201bf05dd","user":{"login":"mozilla-mobile","id":22351667,"avatar_url":"https://avatars3.githubusercontent.com/u/22351667?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla-mobile","html_url":"https://github.com/mozilla-mobile","followers_url":"https://api.github.com/users/mozilla-mobile/followers","following_url":"https://api.github.com/users/mozilla-mobile/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-mobile/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-mobile/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-mobile/subscriptions","organizations_url":"https://api.github.com/users/mozilla-mobile/orgs","repos_url":"https://api.github.com/users/mozilla-mobile/repos","events_url":"https://api.github.com/users/mozilla-mobile/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-mobile/received_events","type":"Organization","site_admin":false},"repo":{"id":75990052,"name":"focus-android","full_name":"mozilla-mobile/focus-android","owner":{"login":"mozilla-mobile","id":22351667,"avatar_url":"https://avatars3.githubusercontent.com/u/22351667?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla-mobile","html_url":"https://github.com/mozilla-mobile","followers_url":"https://api.github.com/users/mozilla-mobile/followers","following_url":"https://api.github.com/users/mozilla-mobile/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-mobile/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-mobile/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-mobile/subscriptions","organizations_url":"https://api.github.com/users/mozilla-mobile/orgs","repos_url":"https://api.github.com/users/mozilla-mobile/repos","events_url":"https://api.github.com/users/mozilla-mobile/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-mobile/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-mobile/focus-android","description":"Firefox Focus: The privacy browser - Browse like no one’s watching.","fork":false,"url":"https://api.github.com/repos/mozilla-mobile/focus-android","forks_url":"https://api.github.com/repos/mozilla-mobile/focus-android/forks","keys_url":"https://api.github.com/repos/mozilla-mobile/focus-android/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-mobile/focus-android/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-mobile/focus-android/teams","hooks_url":"https://api.github.com/repos/mozilla-mobile/focus-android/hooks","issue_events_url":"https://api.github.com/repos/mozilla-mobile/focus-android/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-mobile/focus-android/events","assignees_url":"https://api.github.com/repos/mozilla-mobile/focus-android/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-mobile/focus-android/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-mobile/focus-android/tags","blobs_url":"https://api.github.com/repos/mozilla-mobile/focus-android/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-mobile/focus-android/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-mobile/focus-android/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-mobile/focus-android/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-mobile/focus-android/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-mobile/focus-android/languages","stargazers_url":"https://api.github.com/repos/mozilla-mobile/focus-android/stargazers","contributors_url":"https://api.github.com/repos/mozilla-mobile/focus-android/contributors","subscribers_url":"https://api.github.com/repos/mozilla-mobile/focus-android/subscribers","subscription_url":"https://api.github.com/repos/mozilla-mobile/focus-android/subscription","commits_url":"https://api.github.com/repos/mozilla-mobile/focus-android/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-mobile/focus-android/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-mobile/focus-android/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-mobile/focus-android/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-mobile/focus-android/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-mobile/focus-android/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-mobile/focus-android/merges","archive_url":"https://api.github.com/repos/mozilla-mobile/focus-android/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-mobile/focus-android/downloads","issues_url":"https://api.github.com/repos/mozilla-mobile/focus-android/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-mobile/focus-android/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-mobile/focus-android/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-mobile/focus-android/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-mobile/focus-android/releases{/id}","deployments_url":"https://api.github.com/repos/mozilla-mobile/focus-android/deployments","created_at":"2016-12-09T01:31:11Z","updated_at":"2018-02-14T20:53:33Z","pushed_at":"2018-02-14T21:30:01Z","git_url":"git://github.com/mozilla-mobile/focus-android.git","ssh_url":"git@github.com:mozilla-mobile/focus-android.git","clone_url":"https://github.com/mozilla-mobile/focus-android.git","svn_url":"https://github.com/mozilla-mobile/focus-android","homepage":"","size":122685,"stargazers_count":629,"watchers_count":629,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":220,"mirror_url":null,"archived":false,"open_issues_count":412,"license":{"key":"mpl-2.0","name":"Mozilla Public License 2.0","spdx_id":"MPL-2.0","url":"https://api.github.com/licenses/mpl-2.0"},"forks":220,"open_issues":412,"watchers":629,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087"},"html":{"href":"https://github.com/mozilla-mobile/focus-android/pull/2087"},"issue":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/issues/2087"},"comments":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/issues/2087/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/pulls/2087/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla-mobile/focus-android/statuses/6439bf07e0d87729e5f4198328ce1792bbde904f"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"sputnikci"}}