[Demonstration 1]

[Buggy Method]
@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    boolean needsInvalidate = false;
    final int overScrollMode = ViewCompat.getOverScrollMode(this);
    if (overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS || (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && mAdapter != null && mAdapter.getCount() > 1)) {
        if (!mLeftEdge.isFinished()) {
            final int restoreCount = canvas.save();
            final int width = getWidth();
            final int height = getHeight() - getPaddingTop() - getPaddingBottom();
            canvas.rotate(270);
            canvas.translate(-height + getPaddingTop(), mFirstOffset);
            mLeftEdge.setSize(height, width);
            needsInvalidate |= mLeftEdge.draw(canvas);
            canvas.restoreToCount(restoreCount);
        }
        if (!mRightEdge.isFinished()) {
            final int restoreCount = canvas.save();
            final int width = getWidth();
            final int height = getHeight() - getPaddingTop() - getPaddingBottom();
            canvas.rotate(90);
            canvas.translate(-getPaddingTop(), -(mLastOffset + (getPageWidth() * getColumns())));
            mRightEdge.setSize(height, width);
            needsInvalidate |= mRightEdge.draw(canvas);
            canvas.restoreToCount(restoreCount);
        }
    } else {
        mLeftEdge.finish();
        mRightEdge.finish();
    }
    if (needsInvalidate) {
        // Keep animating
        ViewCompat.postInvalidateOnAnimation(this);
    }
}

[Buggy Hunk]
canvas.translate(-getPaddingTop(), -(mLastOffset + (getPageWidth() * getColumns())));

[Patch]
canvas.translate(-getPaddingTop(), -(mLastOffset + (mPageWidth * getColumns())));

[Demonstration 2]

[Buggy Method]
public static Result service(String ownerName, String projectName, String service, boolean isAdvertise) throws IOException, UnsupportedOperationException, ServletException {
    if (!isSupportedService(service)) {
        return forbidden(String.format("Unsupported service: '%s'", service));
    }
    Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
    if (project == null) {
        return notFound();
    }
    models.User user = UserApp.currentUser();
    if (!isAllowed(project, service)) {
        if (user.isAnonymous()) {
            return BasicAuthAction.unauthorized(response());
        } else {
            // If you want the Git client showing your custom message to
            // the user, the Content-Type should be exact "text/plain"
            // without any parameter. For more details, see the code at
            // https://github.com/git/git/commit/426e70d4a11ce3b4f70636d57c6a0ab16ae08a00#diff-eea0ad565ec5903a11b6023755d491cfR154
            response().setHeader("Content-Type", "text/plain");
            return forbidden(String.format("'%s' has no permission to '%s/%s'.", user.name, ownerName, projectName));
        }
    }
    if (isAdvertise) {
        return ok(RepositoryService.gitAdvertise(project, service, response()));
    } else {
        if (request().body().isMaxSizeExceeded()) {
            return status(REQUEST_ENTITY_TOO_LARGE);
        } else {
            user.visits(project);
            return ok(RepositoryService.gitRpc(project, service, request(), response()));
        }
    }
}

[Buggy Hunk]
user.name, ownerName, projectName));

[Patch]
user.loginId, ownerName, projectName));

[Demonstration 3]

[Buggy Method]
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_main, container, false);
    spinnerMethod = (Spinner) view.findViewById(R.id.spinnerMethods);
    spinnerHttp = (Spinner) view.findViewById(R.id.spinnerHttp);
    editTextUrl = (EditText) view.findViewById(R.id.editTextUrl);
    AutofitHelper.create(editTextUrl).setMinTextSize(TypedValue.COMPLEX_UNIT_SP, 14).setPrecision(0.1f);
    final Button buttonSend = (Button) view.findViewById(R.id.buttonSend);
    editTextUrl.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.length() > 0 && s.toString().matches("^" + // user:pass authentication
            "(?:\\S+(?::\\S*)?@)?" + "(?:" + // IP address exclusion
            // private & local networks
            "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" + // IP address dotted notation octets
            // excludes loopback network 0.0.0.0
            // excludes reserved space >= 224.0.0.0
            // excludes network & broacast addresses
            // (first & last IP address of each class)
            "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + // host name
            "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" + // domain name
            "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" + // TLD identifier
            "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" + // TLD may end with dot
            "\\.?" + ")" + // port number
            "(?::\\d{2,5})?" + // resource path
            "(?:[/?#]\\S*)?" + "$"))
                buttonSend.setEnabled(true);
            else
                buttonSend.setEnabled(false);
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    stickyHeader = (MyStickyHeader) view.findViewById(R.id.stickyHeader);
    //create our adapters
    adapter = new FastItemAdapter<>();
    //configure our fastAdapter
    //as we provide id's for the items we want the hasStableIds enabled to speed up things
    adapter.setHasStableIds(true);
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    // use this setting to improve performance if you know that changes
    // in content do not change the layout size of the RecyclerView
    recyclerView.setHasFixedSize(true);
    recyclerView.setItemViewCacheSize(50);
    // use a linear layout manager
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);
    if (savedInstanceState == null) {
        adapter.add(new RequestSettingListStickTitle(RequestSettingType.header), new RequestSettingListKVItem(RequestSettingType.header), new RequestSettingListStickTitle(RequestSettingType.parameter), new RequestSettingListKVItem(RequestSettingType.parameter), new RequestSettingListStickTitle(RequestSettingType.body), new RequestSettingListBodyItem());
    } else {
        body = savedInstanceState.getString("body");
        restoreAdapter(savedInstanceState);
    }
    adapter.withEventHook(new RequestSettingListStickTitle.AddEvent()).withEventHook(new RequestSettingListKVItem.RemoveEvent());
    adapter.withOnClickListener(new FastAdapter.OnClickListener<IItem>() {

        @Override
        public boolean onClick(View v, IAdapter<IItem> adapter, IItem item, int position) {
            if (item instanceof RequestSettingListBodyItem) {
                DialogFragment newFragment = new RequestRawBodyDialog();
                newFragment.setTargetFragment(MainFragment.this, 0);
                newFragment.show(getFragmentManager(), "dialog");
                return true;
            }
            return false;
        }
    });
    stickyHeader.setButtonOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            RequestSettingType type = stickyHeader.getType();
            if (type == RequestSettingType.body)
                return;
            adapter.add(RequestSettingDataUtils.lastIndexOf(adapter.getAdapterItems(), type) + 1, new RequestSettingListKVItem(type));
        }
    });
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                InputMethodManager keyboard = (InputMethodManager) recyclerView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.hideSoftInputFromWindow(recyclerView.getWindowToken(), 0);
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            int position = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
            if (position <= 0)
                return;
            stickyHeader.setType(RequestSettingDataUtils.findTitleTypeBeforeIndex(adapter.getAdapterItems(), position));
            if (adapter.getAdapterItems().get(position) instanceof RequestSettingListStickTitle) {
                View title = recyclerView.getLayoutManager().findViewByPosition(position);
                float distance = title.getY() - stickyHeader.getY();
                int stickyHeaderHeight = stickyHeader.getHeight();
                float stickyHeaderTranslationY = stickyHeader.getTranslationY();
                if (distance < stickyHeaderHeight || stickyHeaderTranslationY < 0)
                    stickyHeader.setTranslationY(Math.min(stickyHeaderTranslationY + distance - stickyHeaderHeight, 0));
            } else
                stickyHeader.setTranslationY(0);
        }
    });
    buttonSend.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            RequestRecord requestRecord = new RequestRecord();
            requestRecord.setCreateAt(System.currentTimeMillis());
            requestRecord.setMethod(spinnerMethod.getSelectedItem().toString());
            requestRecord.setHttp(spinnerHttp.getSelectedItem().toString());
            requestRecord.setUrl(editTextUrl.getText().toString());
            requestRecord.setHeaders(pairListToJSONArray(getHeaders()).toString());
            requestRecord.setParameters(pairListToJSONArray(getParameters()).toString());
            requestRecord.setBody(body);
            requestRecordDao.insert(requestRecord);
            Intent intent = new Intent(getContext(), ResultActivity.class);
            intent.putExtra("method", spinnerMethod.getSelectedItem().toString());
            intent.putExtra("http", spinnerHttp.getSelectedItem().toString());
            intent.putExtra("url", editTextUrl.getText().toString());
            intent.putExtra("header", getHeaders());
            intent.putExtra("parameter", getParameters());
            intent.putExtra("body", body);
            startActivity(intent);
        }
    });
    final Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    toolbar.inflateMenu(R.menu.menu_main_fragment);
    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            if (item.getItemId() == R.id.menuHistory) {
                startActivityForResult(new Intent(getContext(), RequestHistoryActivity.class), HISTORY_CODE);
                return true;
            } else if (item.getItemId() == R.id.menuClear) {
                DialogFragment newFragment = new ClearRequestDialog();
                newFragment.setTargetFragment(MainFragment.this, 0);
                newFragment.show(getFragmentManager(), "dialog");
                return true;
            }
            return false;
        }
    });
    return view;
}

[Buggy Hunk]
if (position <= 0) return;

[Patch]
if (position < 0) return;