/* * Copyright 2012 GitHub Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.mobile.ui.issue; import static android.app.SearchManager.APP_DATA; import static com.github.mobile.Intents.EXTRA_REPOSITORY; import static org.eclipse.egit.github.core.service.IssueService.STATE_CLOSED; import static org.eclipse.egit.github.core.service.IssueService.STATE_OPEN; import android.os.Bundle; import android.support.v4.content.Loader; import android.view.View; import android.widget.ListView; import com.github.kevinsawicki.wishlist.SingleTypeAdapter; import com.github.mobile.R.string; import com.github.mobile.ThrowableLoader; import com.github.mobile.ui.ItemListFragment; import com.github.mobile.util.AvatarLoader; import com.google.inject.Inject; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.egit.github.core.Issue; import org.eclipse.egit.github.core.Repository; import org.eclipse.egit.github.core.SearchIssue; import org.eclipse.egit.github.core.service.IssueService; /** * Fragment to display a list of {@link SearchIssue} instances */ public class SearchIssueListFragment extends ItemListFragment<SearchIssue> implements Comparator<SearchIssue> { @Inject private IssueService service; @Inject private AvatarLoader avatars; private Repository repository; private String query; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle appData = getActivity().getIntent().getBundleExtra(APP_DATA); if (appData != null) repository = (Repository) appData.getSerializable(EXTRA_REPOSITORY); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setEmptyText(string.no_issues); } /** * @param query * @return this fragment */ public SearchIssueListFragment setQuery(final String query) { this.query = query; return this; } @Override public void onListItemClick(ListView l, View v, int position, long id) { final SearchIssue searchIssue = (SearchIssue) l .getItemAtPosition(position); Issue issue = new Issue().setNumber(searchIssue.getNumber()); startActivity(IssuesViewActivity.createIntent(issue, repository)); } @Override public Loader<List<SearchIssue>> onCreateLoader(int id, Bundle args) { return new ThrowableLoader<List<SearchIssue>>(getActivity(), items) { public List<SearchIssue> loadData() throws Exception { if (repository == null) return Collections.emptyList(); List<SearchIssue> matches = new ArrayList<SearchIssue>(); matches.addAll(service.searchIssues(repository, STATE_OPEN, query)); matches.addAll(service.searchIssues(repository, STATE_CLOSED, query)); Collections.sort(matches, SearchIssueListFragment.this); return matches; } }; } @Override protected int getErrorMessage(Exception exception) { return string.error_issues_load; } @Override protected SingleTypeAdapter<SearchIssue> createAdapter( List<SearchIssue> items) { return new SearchIssueListAdapter(getActivity().getLayoutInflater(), items.toArray(new SearchIssue[items.size()]), avatars); } @Override public int compare(SearchIssue lhs, SearchIssue rhs) { return rhs.getNumber() - lhs.getNumber(); } }