package com.gh4a.loader;

import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.egit.github.core.Milestone;
import org.eclipse.egit.github.core.service.MilestoneService;

import android.content.Context;
import android.text.TextUtils;

import com.gh4a.Gh4Application;
import com.gh4a.utils.ApiHelpers;

public class MilestoneListLoader extends BaseLoader<List<Milestone>> {
    private final String mRepoOwner;
    private final String mRepoName;
    private final String mState;

    public MilestoneListLoader(Context context, String repoOwner, String repoName) {
        this(context, repoOwner, repoName, null);
    }

    public MilestoneListLoader(Context context, String repoOwner, String repoName, String state) {
        super(context);
        mRepoOwner = repoOwner;
        mRepoName = repoName;
        mState = state;
    }

    @Override
    public List<Milestone> doLoadInBackground() throws IOException {
        MilestoneService milestoneService = (MilestoneService)
                Gh4Application.get().getService(Gh4Application.MILESTONE_SERVICE);
        List<Milestone> milestones = milestoneService.getMilestones(mRepoOwner, mRepoName, null);

        if (milestones != null && mState == null) {
            Collections.sort(milestones, new Comparator<Milestone>() {
                @Override
                public int compare(Milestone lhs, Milestone rhs) {
                    String leftState = lhs.getState();
                    String rightState = rhs.getState();
                    if (TextUtils.equals(leftState, rightState)) {
                        return 0;
                    } else if (ApiHelpers.IssueState.CLOSED.equals(leftState)) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
            });
        }

        return milestones;
    }
}

package com.gh4a.loader;

import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.egit.github.core.Milestone;
import org.eclipse.egit.github.core.service.MilestoneService;

import android.content.Context;
import android.text.TextUtils;

import com.gh4a.Gh4Application;
import com.gh4a.utils.ApiHelpers;

public class MilestoneListLoader extends BaseLoader<List<Milestone>> {
    private final String mRepoOwner;
    private final String mRepoName;
    private final String mState;

    public MilestoneListLoader(Context context, String repoOwner, String repoName) {
        this(context, repoOwner, repoName, null);
    }

    public MilestoneListLoader(Context context, String repoOwner, String repoName, String state) {
        super(context);
        mRepoOwner = repoOwner;
        mRepoName = repoName;
        mState = state;
    }

    @Override
    public List<Milestone> doLoadInBackground() throws IOException {
        MilestoneService milestoneService = (MilestoneService)
                Gh4Application.get().getService(Gh4Application.MILESTONE_SERVICE);
        List<Milestone> milestones = milestoneService.getMilestones(mRepoOwner, mRepoName, null);

        if (milestones != null && mState == null) {
            Collections.sort(milestones, new Comparator<Milestone>() {
                @Override
                public int compare(Milestone lhs, Milestone rhs) {
                    String leftState = lhs.getState();
                    String rightState = rhs.getState();
                    if (TextUtils.equals(leftState, rightState)) {
                        return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
                    } else if (ApiHelpers.IssueState.CLOSED.equals(leftState)) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
            });
        }

        return milestones;
    }
}

Sort milestones by state first (open before closed), then by name.