{"action":"created","comment":{"url":"https://api.github.com/repos/projectbuendia/client/pulls/comments/46243912","id":46243912,"diff_hunk":"@@ -0,0 +1,436 @@\n+// Copyright 2015 The Project Buendia Authors\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n+// use this file except in compliance with the License.  You may obtain a copy\n+// of the License at: http://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software distributed\n+// under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES\n+// OR CONDITIONS OF ANY KIND, either express or implied.  See the License for\n+// specific language governing permissions and limitations under the License.\n+\n+package org.projectbuendia.client.ui;\n+\n+import android.content.Context;\n+import android.graphics.drawable.Drawable;\n+import android.os.CountDownTimer;\n+import android.support.annotation.NonNull;\n+import android.view.View;\n+import android.view.ViewGroup;\n+import android.view.animation.TranslateAnimation;\n+import android.widget.ExpandableListView;\n+import android.widget.ImageView;\n+import android.widget.SimpleExpandableListAdapter;\n+import android.widget.TextView;\n+\n+import org.projectbuendia.client.R;\n+import org.projectbuendia.client.utils.Utils;\n+\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.TreeMap;\n+\n+/**\n+ * Snackbars provide lightweight feedback about an operation by showing a brief message at the\n+ * bottom of the screen. Snackbars can contain an action button with an OnClickListener.\n+ * Can be auto dismissed by a time out values in seconds and can be prioritized.\n+ */\n+public class SnackBar {\n+\n+    private final ViewGroup mTargetParent;\n+    private final Context mContext;\n+    private ExpandableListView mList;\n+    private SnackBarListAdapter adapter;\n+    private ArrayList<HashMap<String, String>> groups;\n+    private ArrayList<ArrayList<HashMap<String, String>>> children;\n+    private int mMessageId;\n+    private TreeMap<MessageKey, Message> mMessagesList;\n+\n+\n+    public SnackBar(ViewGroup parent) {\n+        mTargetParent = parent;\n+        mContext = parent.getContext();\n+\n+        mMessagesList= new TreeMap<>();\n+        children = new ArrayList<>();\n+        buildList();\n+    }\n+\n+    /**\n+     * Show the SnackBar with an slide up animation if hidden.\n+     */\n+    public void show() {\n+        // TODO: discover why does not animate on the first time\n+        if (mList.getVisibility() != View.VISIBLE) {\n+            animate(View.VISIBLE);\n+        }\n+    }\n+\n+    /**\n+     * Hide the SnackBar with a slide down animation if visible.\n+     */\n+    public void hide() {\n+        animate(View.GONE);\n+    }\n+\n+    /**\n+     * Play the slide up / down animation depending on the list current visibility.\n+     * @param visibility Defines which of the animations will be executed (up or down). Possible\n+     *                   values are {@code View.VISIBLE} or {@code View.GONE}\n+     */\n+    private void animate(int visibility) {\n+        TranslateAnimation animate = new TranslateAnimation(0, 0,\n+            visibility == View.VISIBLE ? mList.getHeight() : 0,\n+            visibility == View.GONE ? mList.getHeight() : 0\n+        );\n+        animate.setDuration(700);\n+        animate.setFillAfter(true);\n+        mList.startAnimation(animate);\n+        mList.setVisibility(visibility);\n+    }\n+\n+    /**\n+     * Wrapper to the full message method {@link #message(String, String, View.OnClickListener, int,\n+     * boolean, int)}.\n+     * The message won't have action button, it's priority will be 999, will be dismissible and\n+     * won't have timer.\n+     * @param message The message String.\n+     * @return the id of the message.\n+     */\n+    public int message(String message) {\n+        return message(message, null, null, 999, true, 0);\n+    }\n+\n+    /**\n+     * Wrapper to the full message method {@link #message(String, String, View.OnClickListener, int,\n+     * boolean, int)}.\n+     * The message won't have action button, will be dismissible and won't have timer.\n+     * @param message The message String.\n+     * @param priority The priority of the message. The param is a int and the lower the number the\n+     *                 higher priority the message has. 0 is the highest.\n+     * @return the id of the message.\n+     */\n+    public int message(String message, int priority) {\n+        return message(message, null, null, priority, true, 0);\n+    }\n+\n+    /**\n+     * Wrapper to the full message method {@link #message(String, String, View.OnClickListener, int,\n+     * boolean, int)}.\n+     * The message will be dismissible and won't have timer.\n+     * @param message The message String.\n+     * @param actionMessage The label for the action button.\n+     * @param actionOnClick The View.OnClickListener for the action button.\n+     * @param priority The priority of the message. The param is a int and the lower the number the\n+     *                 higher priority the message has. 0 is the highest.\n+     * @return the id of the message\n+     */\n+    public int message(String message, String actionMessage, View.OnClickListener actionOnClick,\n+                       int priority){\n+        return message(message, actionMessage, actionOnClick, priority, true, 0);\n+    }\n+\n+    /**\n+     * Add to the list and display a new message. This is the method that should be used to\n+     * display messages and it's being called by {@link BaseActivity#snackBar}.\n+     * @param message The message String.\n+     * @param actionMessage The label for the action button.\n+     * @param actionOnClick The View.OnClickListener for the action button.\n+     * @param priority The priority of the message. The param is a int and the lower the number the\n+     *                 higher priority the message has. 0 is the highest.\n+     * @param isDismissible if true the message will have a X button to remove it self from the\n+     *                      list.\n+     * @param secondsToTimeOut Number of seconds to message auto dismiss. 0 to never.\n+     * @return the id of the message.\n+     */\n+    public int message(String message, String actionMessage, View.OnClickListener actionOnClick,\n+                        int priority, boolean isDismissible, int secondsToTimeOut){\n+        mMessageId++;\n+        MessageKey key = new MessageKey(mMessageId, priority);\n+        Message value = new Message(key, message, actionMessage, actionOnClick, isDismissible);\n+        mMessagesList.put(key, value);\n+        updateList();\n+        setTimer(key, secondsToTimeOut);\n+        if (mMessagesList.size() == 0) {\n+            hide();\n+        } else {\n+            show();\n+        }\n+        return mMessageId;\n+    }\n+\n+    /**\n+     * Sets the auto-dismiss timer to the message given it's key and seconds to dismiss.\n+     * @param key The message key.\n+     * @param seconds Seconds until dismiss.\n+     */\n+    private void setTimer(final MessageKey key, int seconds) {\n+        if(seconds > 0) {\n+            int limit = seconds*1000;\n+            new CountDownTimer(limit, 1000) {\n+                @Override public void onTick(long millisUntilFinished) {\n+                }\n+\n+                @Override public void onFinish() {\n+                    mMessagesList.remove(key);\n+                    updateList();\n+                }\n+            }.start();\n+        }\n+    }\n+\n+    /**\n+     * Programmatically dismiss a message by it's id.\n+     * @param id The message id.\n+     */\n+    public void dismiss(int id) {\n+        dismiss(getKey(id));\n+    }\n+\n+    /**\n+     * Programmatically dismiss a message by a MessageKey Object\n+     * @param key The message Key.\n+     */\n+    public void dismiss(MessageKey key) {\n+        mMessagesList.remove(key);\n+        updateList();\n+    }\n+\n+    /**\n+     * Find message Key by it's id value.\n+     * @param id The id of the message.\n+     * @return The MessageKey of the message.\n+     */\n+    private MessageKey getKey(int id) {\n+        MessageKey theKey = null;\n+        for(Map.Entry<MessageKey, Message> entry : mMessagesList.entrySet()) {\n+            MessageKey key = entry.getKey();\n+            if (key.id == id) {\n+                theKey = key;\n+                break;\n+            }\n+        }\n+        return theKey;\n+    }\n+\n+    /**\n+     * Rearrange the message data and notify the change to the adapter so it can redraw the\n+     * ExpandableListView.\n+     */\n+    private void updateList() {\n+        groups.clear();\n+        children.clear();\n+        children.add(new ArrayList<HashMap<String, String>>());\n+        for(Map.Entry<MessageKey, Message> entry : mMessagesList.entrySet()) {\n+            Message value = entry.getValue();\n+\n+            if (groups.size() == 0) {\n+                addToHashMap(value, groups);\n+            } else {\n+                addToHashMap(value, children.get(0));\n+            }\n+        }\n+        adapter.notifyDataSetChanged();\n+    }\n+\n+    /**\n+     * The main message list {@code mMessagesList} values are added to ArrayLists to be used by the\n+     * SnackBarListAdapter.\n+     * @param m The message to be stored.\n+     * @param a The group or children ArrayList.\n+     */\n+    private void addToHashMap(Message m, ArrayList<HashMap<String, String>> a) {\n+        HashMap<String, String> newMessage = new HashMap<>();\n+        newMessage.put(\"id\", Integer.toString(m.key.id));\n+        newMessage.put(\"priority\", Integer.toString(m.key.priority));\n+        newMessage.put(\"messages\", m.message);\n+        if (m.actionString != null) {\n+            newMessage.put(\"actions\", m.actionString);\n+        }\n+        a.add(newMessage);\n+    }\n+\n+    /**\n+     * Initiates the SnackBar ExpandableListView.\n+     */\n+    private void buildList() {\n+        mList = new ExpandableListView(mContext);\n+        mList.setId(R.id.snackbar);\n+        setListAppearance();\n+        mList.setAdapter(generateAdapter());\n+        mTargetParent.addView(mList);\n+        hide();\n+    }\n+\n+    /**\n+     * Sets the SnackBar ExpandableListView appearance.\n+     */\n+    private void setListAppearance() {\n+        mList.setDivider(null);\n+        mList.setChildDivider(null);\n+        Drawable icon = mContext.getResources().getDrawable(R.drawable.snackbar_group_indicator);\n+        mList.setGroupIndicator(icon);\n+        mList.setIndicatorBounds(\n+            1200 - Utils.getPixelFromDips(60),\n+            1200 - Utils.getPixelFromDips(32)\n+        );\n+    }\n+\n+    /**\n+     * Instantiates the SnackBarListAdapter with no messages.\n+     * @return SnackBarListAdapter\n+     */\n+    private SnackBarListAdapter generateAdapter() {\n+        groups = new ArrayList<>();\n+        children = new ArrayList<>();\n+        children.add(new ArrayList<HashMap<String, String>>());\n+\n+        adapter = new SnackBarListAdapter(\n+            mContext,\n+            groups,                                                   // Creating group List.\n+            R.layout.snackbar_group,                                  // Group item layout XML.\n+            new String[] {\"id\", \"priority\", \"messages\", \"actions\"},   // the key of group item.\n+            new int[] {                                               // Data under the key goes into this TextView.\n+                R.id.snackbar_id,\n+                R.id.snackbar_priority,\n+                R.id.snackbar_message,\n+                R.id.snackbar_action\n+            },\n+            children,                                                 // childData describes second-level entries.\n+            R.layout.snackbar_item,                                   // Layout for sub-level entries(second level).\n+            new String[] {\"id\", \"priority\", \"messages\", \"actions\"},   // Keys in childData maps to display.\n+            new int[] {                                               // Data under the keys above go into these TextViews.\n+                R.id.snackbar_id,\n+                R.id.snackbar_priority,\n+                R.id.snackbar_message,\n+                R.id.snackbar_action\n+            }\n+        );\n+        return adapter;\n+    }\n+\n+    /**\n+     * The SnackBar ExpandableListView Adapter responsible to handling the message data.\n+     */\n+    private final class SnackBarListAdapter extends SimpleExpandableListAdapter {\n+\n+        public SnackBarListAdapter(Context context, List<? extends Map<String, ?>> groupData, int\n+            groupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends\n+            Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo) {\n+            super(context, groupData, groupLayout, groupFrom, groupTo, childData, childLayout,\n+                childFrom, childTo);\n+        }\n+\n+        @Override\n+        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,\n+                                 View convertView, ViewGroup parent) {\n+            View newView = super.getChildView(groupPosition, childPosition, isLastChild,\n+                convertView, parent);\n+            addHandlers(newView);\n+            return newView;\n+        }\n+\n+        @Override\n+        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,\n+                                ViewGroup parent) {\n+            View newView = super.getGroupView(groupPosition, isExpanded, convertView, parent);\n+            addHandlers(newView);\n+            return newView;\n+        }\n+\n+        /**\n+         * This method is being called by {@code #getChildView} and {@code #getGroupView} to\n+         * customize the list items depending on the message specifications.\n+         * It add the click handlers to the buttons or hide them if they aren't being used.\n+         * @param newView the inflated view by {@code #getChildView} and {@code #getGroupView}\n+         */\n+        private void addHandlers(View newView) {\n+            TextView idView = (TextView) newView.findViewById(R.id.snackbar_id);\n+            final String id = idView.getText().toString();\n+            TextView priorityView = (TextView) newView.findViewById(R.id.snackbar_priority);\n+            final String priority = priorityView.getText().toString();\n+            Message m = mMessagesList.get(new MessageKey(Integer.parseInt(id), Integer.parseInt(priority)));\n+\n+            // Set action handler\n+            TextView actionButton = (TextView) newView.findViewById(R.id.snackbar_action);\n+            if ((m.actionHandler != null) && (!m.actionString.isEmpty())) {\n+                actionButton.setOnClickListener(m.actionHandler);\n+                actionButton.setVisibility(View.VISIBLE);\n+            } else {\n+                actionButton.setVisibility(View.GONE);\n+            }\n+\n+            // Set Dismiss handler\n+            ImageView dismissButton = (ImageView) newView.findViewById(R.id.snackbar_dismiss);\n+            if (m.isDismissible) {\n+                dismissButton.setOnClickListener(new View.OnClickListener() {\n+                    @Override public void onClick(View v) {\n+                        dismiss(\n+                            new MessageKey(Integer.parseInt(id), Integer.parseInt(priority))\n+                        );\n+                    }\n+                });\n+                dismissButton.setVisibility(View.VISIBLE);\n+            } else {\n+                dismissButton.setVisibility(View.GONE);\n+            }\n+        }\n+    }\n+\n+    /**\n+     * The key of the {@code TreeMap} used to storing the messages.\n+     * Helps the {@code TreeMap} maintain it's balance using priority as a parameter.\n+     */\n+    private class MessageKey implements Comparable<MessageKey> {\n+\n+        protected int id;\n+        protected int priority;\n+\n+        public MessageKey(int id, int priority){\n+            this.id = id;\n+            this.priority = priority;\n+        }\n+\n+        @Override public int compareTo(@NonNull MessageKey another) {","path":"app/src/main/java/org/projectbuendia/client/ui/SnackBar.java","position":396,"original_position":396,"commit_id":"0dc1bf60c98fe28d18f8a8075e7996a8fc24f231","original_commit_id":"0dc1bf60c98fe28d18f8a8075e7996a8fc24f231","user":{"login":"llvasconcellos","id":1710823,"avatar_url":"https://avatars.githubusercontent.com/u/1710823?v=3","gravatar_id":"","url":"https://api.github.com/users/llvasconcellos","html_url":"https://github.com/llvasconcellos","followers_url":"https://api.github.com/users/llvasconcellos/followers","following_url":"https://api.github.com/users/llvasconcellos/following{/other_user}","gists_url":"https://api.github.com/users/llvasconcellos/gists{/gist_id}","starred_url":"https://api.github.com/users/llvasconcellos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/llvasconcellos/subscriptions","organizations_url":"https://api.github.com/users/llvasconcellos/orgs","repos_url":"https://api.github.com/users/llvasconcellos/repos","events_url":"https://api.github.com/users/llvasconcellos/events{/privacy}","received_events_url":"https://api.github.com/users/llvasconcellos/received_events","type":"User","site_admin":false},"body":"Comment added.","created_at":"2015-12-01T06:24:48Z","updated_at":"2015-12-01T06:24:48Z","html_url":"https://github.com/projectbuendia/client/pull/155#discussion_r46243912","pull_request_url":"https://api.github.com/repos/projectbuendia/client/pulls/155","_links":{"self":{"href":"https://api.github.com/repos/projectbuendia/client/pulls/comments/46243912"},"html":{"href":"https://github.com/projectbuendia/client/pull/155#discussion_r46243912"},"pull_request":{"href":"https://api.github.com/repos/projectbuendia/client/pulls/155"}}},"pull_request":{"url":"https://api.github.com/repos/projectbuendia/client/pulls/155","id":51698859,"html_url":"https://github.com/projectbuendia/client/pull/155","diff_url":"https://github.com/projectbuendia/client/pull/155.diff","patch_url":"https://github.com/projectbuendia/client/pull/155.patch","issue_url":"https://api.github.com/repos/projectbuendia/client/issues/155","number":155,"state":"open","locked":false,"title":"SnackBar","user":{"login":"llvasconcellos","id":1710823,"avatar_url":"https://avatars.githubusercontent.com/u/1710823?v=3","gravatar_id":"","url":"https://api.github.com/users/llvasconcellos","html_url":"https://github.com/llvasconcellos","followers_url":"https://api.github.com/users/llvasconcellos/followers","following_url":"https://api.github.com/users/llvasconcellos/following{/other_user}","gists_url":"https://api.github.com/users/llvasconcellos/gists{/gist_id}","starred_url":"https://api.github.com/users/llvasconcellos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/llvasconcellos/subscriptions","organizations_url":"https://api.github.com/users/llvasconcellos/orgs","repos_url":"https://api.github.com/users/llvasconcellos/repos","events_url":"https://api.github.com/users/llvasconcellos/events{/privacy}","received_events_url":"https://api.github.com/users/llvasconcellos/received_events","type":"User","site_admin":false},"body":"**Disregard the changes made to LoginActivity.java, login.xml. (this will be gone when snackbar is ready to final code review)** \r\n\r\nDO NOT MERGE! I need to remove the code from LoginActivity and login.xml.\r\n\r\nTo test it switch to the branch, run the app and tap on the “SnackBar ...”options next to the settings button.\r\n\r\n![buendia-snackbar](https://cloud.githubusercontent.com/assets/1710823/11476988/bebe6104-976c-11e5-8ced-2a39a6ebdbf0.png)\r\n\r\n","created_at":"2015-11-24T18:36:06Z","updated_at":"2015-12-01T06:24:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c0830dc8fd86240149a9311db431aa555f0b95c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/projectbuendia/client/pulls/155/commits","review_comments_url":"https://api.github.com/repos/projectbuendia/client/pulls/155/comments","review_comment_url":"https://api.github.com/repos/projectbuendia/client/pulls/comments{/number}","comments_url":"https://api.github.com/repos/projectbuendia/client/issues/155/comments","statuses_url":"https://api.github.com/repos/projectbuendia/client/statuses/0dc1bf60c98fe28d18f8a8075e7996a8fc24f231","head":{"label":"projectbuendia:feature/llvasconcellos-snackbar","ref":"feature/llvasconcellos-snackbar","sha":"0dc1bf60c98fe28d18f8a8075e7996a8fc24f231","user":{"login":"projectbuendia","id":13339011,"avatar_url":"https://avatars.githubusercontent.com/u/13339011?v=3","gravatar_id":"","url":"https://api.github.com/users/projectbuendia","html_url":"https://github.com/projectbuendia","followers_url":"https://api.github.com/users/projectbuendia/followers","following_url":"https://api.github.com/users/projectbuendia/following{/other_user}","gists_url":"https://api.github.com/users/projectbuendia/gists{/gist_id}","starred_url":"https://api.github.com/users/projectbuendia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectbuendia/subscriptions","organizations_url":"https://api.github.com/users/projectbuendia/orgs","repos_url":"https://api.github.com/users/projectbuendia/repos","events_url":"https://api.github.com/users/projectbuendia/events{/privacy}","received_events_url":"https://api.github.com/users/projectbuendia/received_events","type":"Organization","site_admin":false},"repo":{"id":33972326,"name":"client","full_name":"projectbuendia/client","owner":{"login":"projectbuendia","id":13339011,"avatar_url":"https://avatars.githubusercontent.com/u/13339011?v=3","gravatar_id":"","url":"https://api.github.com/users/projectbuendia","html_url":"https://github.com/projectbuendia","followers_url":"https://api.github.com/users/projectbuendia/followers","following_url":"https://api.github.com/users/projectbuendia/following{/other_user}","gists_url":"https://api.github.com/users/projectbuendia/gists{/gist_id}","starred_url":"https://api.github.com/users/projectbuendia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectbuendia/subscriptions","organizations_url":"https://api.github.com/users/projectbuendia/orgs","repos_url":"https://api.github.com/users/projectbuendia/repos","events_url":"https://api.github.com/users/projectbuendia/events{/privacy}","received_events_url":"https://api.github.com/users/projectbuendia/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/projectbuendia/client","description":"Android client app","fork":false,"url":"https://api.github.com/repos/projectbuendia/client","forks_url":"https://api.github.com/repos/projectbuendia/client/forks","keys_url":"https://api.github.com/repos/projectbuendia/client/keys{/key_id}","collaborators_url":"https://api.github.com/repos/projectbuendia/client/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/projectbuendia/client/teams","hooks_url":"https://api.github.com/repos/projectbuendia/client/hooks","issue_events_url":"https://api.github.com/repos/projectbuendia/client/issues/events{/number}","events_url":"https://api.github.com/repos/projectbuendia/client/events","assignees_url":"https://api.github.com/repos/projectbuendia/client/assignees{/user}","branches_url":"https://api.github.com/repos/projectbuendia/client/branches{/branch}","tags_url":"https://api.github.com/repos/projectbuendia/client/tags","blobs_url":"https://api.github.com/repos/projectbuendia/client/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/projectbuendia/client/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/projectbuendia/client/git/refs{/sha}","trees_url":"https://api.github.com/repos/projectbuendia/client/git/trees{/sha}","statuses_url":"https://api.github.com/repos/projectbuendia/client/statuses/{sha}","languages_url":"https://api.github.com/repos/projectbuendia/client/languages","stargazers_url":"https://api.github.com/repos/projectbuendia/client/stargazers","contributors_url":"https://api.github.com/repos/projectbuendia/client/contributors","subscribers_url":"https://api.github.com/repos/projectbuendia/client/subscribers","subscription_url":"https://api.github.com/repos/projectbuendia/client/subscription","commits_url":"https://api.github.com/repos/projectbuendia/client/commits{/sha}","git_commits_url":"https://api.github.com/repos/projectbuendia/client/git/commits{/sha}","comments_url":"https://api.github.com/repos/projectbuendia/client/comments{/number}","issue_comment_url":"https://api.github.com/repos/projectbuendia/client/issues/comments{/number}","contents_url":"https://api.github.com/repos/projectbuendia/client/contents/{+path}","compare_url":"https://api.github.com/repos/projectbuendia/client/compare/{base}...{head}","merges_url":"https://api.github.com/repos/projectbuendia/client/merges","archive_url":"https://api.github.com/repos/projectbuendia/client/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/projectbuendia/client/downloads","issues_url":"https://api.github.com/repos/projectbuendia/client/issues{/number}","pulls_url":"https://api.github.com/repos/projectbuendia/client/pulls{/number}","milestones_url":"https://api.github.com/repos/projectbuendia/client/milestones{/number}","notifications_url":"https://api.github.com/repos/projectbuendia/client/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/projectbuendia/client/labels{/name}","releases_url":"https://api.github.com/repos/projectbuendia/client/releases{/id}","created_at":"2015-04-15T04:01:52Z","updated_at":"2015-11-11T16:17:46Z","pushed_at":"2015-12-01T05:54:22Z","git_url":"git://github.com/projectbuendia/client.git","ssh_url":"git@github.com:projectbuendia/client.git","clone_url":"https://github.com/projectbuendia/client.git","svn_url":"https://github.com/projectbuendia/client","homepage":null,"size":6067,"stargazers_count":35,"watchers_count":35,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":27,"forks":24,"open_issues":27,"watchers":35,"default_branch":"dev"}},"base":{"label":"projectbuendia:dev","ref":"dev","sha":"7ce3dccff3f1bd006bbb71428d22c3b21d54a5cc","user":{"login":"projectbuendia","id":13339011,"avatar_url":"https://avatars.githubusercontent.com/u/13339011?v=3","gravatar_id":"","url":"https://api.github.com/users/projectbuendia","html_url":"https://github.com/projectbuendia","followers_url":"https://api.github.com/users/projectbuendia/followers","following_url":"https://api.github.com/users/projectbuendia/following{/other_user}","gists_url":"https://api.github.com/users/projectbuendia/gists{/gist_id}","starred_url":"https://api.github.com/users/projectbuendia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectbuendia/subscriptions","organizations_url":"https://api.github.com/users/projectbuendia/orgs","repos_url":"https://api.github.com/users/projectbuendia/repos","events_url":"https://api.github.com/users/projectbuendia/events{/privacy}","received_events_url":"https://api.github.com/users/projectbuendia/received_events","type":"Organization","site_admin":false},"repo":{"id":33972326,"name":"client","full_name":"projectbuendia/client","owner":{"login":"projectbuendia","id":13339011,"avatar_url":"https://avatars.githubusercontent.com/u/13339011?v=3","gravatar_id":"","url":"https://api.github.com/users/projectbuendia","html_url":"https://github.com/projectbuendia","followers_url":"https://api.github.com/users/projectbuendia/followers","following_url":"https://api.github.com/users/projectbuendia/following{/other_user}","gists_url":"https://api.github.com/users/projectbuendia/gists{/gist_id}","starred_url":"https://api.github.com/users/projectbuendia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectbuendia/subscriptions","organizations_url":"https://api.github.com/users/projectbuendia/orgs","repos_url":"https://api.github.com/users/projectbuendia/repos","events_url":"https://api.github.com/users/projectbuendia/events{/privacy}","received_events_url":"https://api.github.com/users/projectbuendia/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/projectbuendia/client","description":"Android client app","fork":false,"url":"https://api.github.com/repos/projectbuendia/client","forks_url":"https://api.github.com/repos/projectbuendia/client/forks","keys_url":"https://api.github.com/repos/projectbuendia/client/keys{/key_id}","collaborators_url":"https://api.github.com/repos/projectbuendia/client/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/projectbuendia/client/teams","hooks_url":"https://api.github.com/repos/projectbuendia/client/hooks","issue_events_url":"https://api.github.com/repos/projectbuendia/client/issues/events{/number}","events_url":"https://api.github.com/repos/projectbuendia/client/events","assignees_url":"https://api.github.com/repos/projectbuendia/client/assignees{/user}","branches_url":"https://api.github.com/repos/projectbuendia/client/branches{/branch}","tags_url":"https://api.github.com/repos/projectbuendia/client/tags","blobs_url":"https://api.github.com/repos/projectbuendia/client/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/projectbuendia/client/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/projectbuendia/client/git/refs{/sha}","trees_url":"https://api.github.com/repos/projectbuendia/client/git/trees{/sha}","statuses_url":"https://api.github.com/repos/projectbuendia/client/statuses/{sha}","languages_url":"https://api.github.com/repos/projectbuendia/client/languages","stargazers_url":"https://api.github.com/repos/projectbuendia/client/stargazers","contributors_url":"https://api.github.com/repos/projectbuendia/client/contributors","subscribers_url":"https://api.github.com/repos/projectbuendia/client/subscribers","subscription_url":"https://api.github.com/repos/projectbuendia/client/subscription","commits_url":"https://api.github.com/repos/projectbuendia/client/commits{/sha}","git_commits_url":"https://api.github.com/repos/projectbuendia/client/git/commits{/sha}","comments_url":"https://api.github.com/repos/projectbuendia/client/comments{/number}","issue_comment_url":"https://api.github.com/repos/projectbuendia/client/issues/comments{/number}","contents_url":"https://api.github.com/repos/projectbuendia/client/contents/{+path}","compare_url":"https://api.github.com/repos/projectbuendia/client/compare/{base}...{head}","merges_url":"https://api.github.com/repos/projectbuendia/client/merges","archive_url":"https://api.github.com/repos/projectbuendia/client/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/projectbuendia/client/downloads","issues_url":"https://api.github.com/repos/projectbuendia/client/issues{/number}","pulls_url":"https://api.github.com/repos/projectbuendia/client/pulls{/number}","milestones_url":"https://api.github.com/repos/projectbuendia/client/milestones{/number}","notifications_url":"https://api.github.com/repos/projectbuendia/client/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/projectbuendia/client/labels{/name}","releases_url":"https://api.github.com/repos/projectbuendia/client/releases{/id}","created_at":"2015-04-15T04:01:52Z","updated_at":"2015-11-11T16:17:46Z","pushed_at":"2015-12-01T05:54:22Z","git_url":"git://github.com/projectbuendia/client.git","ssh_url":"git@github.com:projectbuendia/client.git","clone_url":"https://github.com/projectbuendia/client.git","svn_url":"https://github.com/projectbuendia/client","homepage":null,"size":6067,"stargazers_count":35,"watchers_count":35,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":27,"forks":24,"open_issues":27,"watchers":35,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/projectbuendia/client/pulls/155"},"html":{"href":"https://github.com/projectbuendia/client/pull/155"},"issue":{"href":"https://api.github.com/repos/projectbuendia/client/issues/155"},"comments":{"href":"https://api.github.com/repos/projectbuendia/client/issues/155/comments"},"review_comments":{"href":"https://api.github.com/repos/projectbuendia/client/pulls/155/comments"},"review_comment":{"href":"https://api.github.com/repos/projectbuendia/client/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/projectbuendia/client/pulls/155/commits"},"statuses":{"href":"https://api.github.com/repos/projectbuendia/client/statuses/0dc1bf60c98fe28d18f8a8075e7996a8fc24f231"}}}}