Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'origin/master' into bug-date-crash
Browse files Browse the repository at this point in the history
Motoaleks committed Jan 26, 2018
2 parents 2bcf70e + 5f549cc commit aaeb72d
Showing 9 changed files with 444 additions and 6 deletions.
3 changes: 2 additions & 1 deletion app/src/main/java/com/github/mobile/api/model/Issue.java
Original file line number Diff line number Diff line change
@@ -15,10 +15,11 @@
*/
package com.github.mobile.api.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class Issue {
public class Issue implements Serializable {
public long id;

public Repository repository;
Original file line number Diff line number Diff line change
@@ -35,6 +35,13 @@ Call<Issue> getIssue(
@Path("repo") String repo,
@Path("number") long number);

@Headers("Accept: application/vnd.github.squirrel-girl-preview")
@GET("repos/{owner}/{repo}/issues")
Call<List<Issue>> getIssues(
@Path("owner") String owner,
@Path("repo") String repo,
@Query("milestone") String milestone);

@Headers({"Accept: application/vnd.github.v3.full+json",
"Accept: application/vnd.github.mockingbird-preview",
"Accept: application/vnd.github.squirrel-girl-preview"})
112 changes: 112 additions & 0 deletions app/src/main/java/com/github/mobile/core/milestone/AddIssueTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
* 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.core.milestone;

import android.accounts.Account;

import com.github.mobile.R;
import com.github.mobile.api.model.Issue;
import com.github.mobile.api.service.IssueService;
import com.github.mobile.api.service.MilestoneService;
import com.github.mobile.core.issue.IssueStore;
import com.github.mobile.ui.DialogFragmentActivity;
import com.github.mobile.ui.ProgressDialogTask;
import com.github.mobile.ui.milestone.IssueDialog;
import com.google.inject.Inject;

import org.eclipse.egit.github.core.IRepositoryIdProvider;
import org.eclipse.egit.github.core.Milestone;

import static com.github.mobile.RequestCodes.ISSUE_MILESTONE_UPDATE;

/**
* Task to add an issue to a milestone
*/
public class AddIssueTask extends ProgressDialogTask<com.github.mobile.api.model.Milestone> {

@Inject
private IssueService service;

@Inject
private MilestoneService milestoneService;

@Inject
private IssueStore store;

private final IssueDialog issueDialog;

private final IRepositoryIdProvider repositoryId;

private int issueNumber;

private final int milestoneNumber;

/**
* Create task to add an issue to a milestone
*
* @param activity
* @param repositoryId
* @param milestoneNumber
*/
public AddIssueTask(final DialogFragmentActivity activity,
final IRepositoryIdProvider repositoryId, final int milestoneNumber) {
super(activity);

this.repositoryId = repositoryId;
this.milestoneNumber = milestoneNumber;
issueDialog = new IssueDialog(activity, ISSUE_MILESTONE_UPDATE,
repositoryId, service);
}

@Override
protected com.github.mobile.api.model.Milestone run(Account account) throws Exception {
org.eclipse.egit.github.core.Issue editedIssue = new org.eclipse.egit.github.core.Issue();
editedIssue.setNumber(issueNumber);
editedIssue.setMilestone(new Milestone().setNumber(milestoneNumber));
store.editIssue(repositoryId, editedIssue);
String[] rep = repositoryId.generateId().split("/");
return milestoneService.getMilestone(rep[0], rep[1], milestoneNumber).execute().body();
}

/**
* Prompt for issue selection
*
* @return this task
*/
public AddIssueTask prompt() {
issueDialog.show();
return this;
}

/**
* Add issue to the milestone
*
* @param issue
* @return this task
*/
public AddIssueTask edit(Issue issue) {
if (issue != null)
issueNumber = issue.number;
else
issueNumber = -1;

showIndeterminate(R.string.updating_milestone);

super.execute();

return this;
}
}
Original file line number Diff line number Diff line change
@@ -195,7 +195,7 @@ public void onClick(View v) {
if (milestone.number > 0)
actionBar.setTitle(milestone.title);
else
actionBar.setTitle(R.string.new_milestone);
actionBar.setTitle(R.string.ms_new_milestone);
actionBar.setSubtitle(repositoryId.generateId());

titleText.addTextChangedListener(new TextWatcherAdapter() {
126 changes: 126 additions & 0 deletions app/src/main/java/com/github/mobile/ui/milestone/IssueDialog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
/*
* 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.milestone;

import android.accounts.Account;
import android.util.Log;

import com.github.mobile.R;
import com.github.mobile.api.model.Issue;
import com.github.mobile.api.service.IssueService;
import com.github.mobile.ui.DialogFragmentActivity;
import com.github.mobile.ui.ProgressDialogTask;
import com.github.mobile.util.ToastUtils;

import org.eclipse.egit.github.core.IRepositoryIdProvider;

import java.util.ArrayList;
import java.util.List;

/**
* Dialog helper to display a list of issues to select one from
*/
public class IssueDialog {

private static final String TAG = "IssueDialog";

private IssueService service;

private ArrayList<Issue> repositoryIssues;

private final int requestCode;

private final DialogFragmentActivity activity;

private final IRepositoryIdProvider repository;

/**
* Create dialog helper to display issue
*
* @param activity
* @param requestCode
* @param repository
* @param service
*/
public IssueDialog(final DialogFragmentActivity activity,
final int requestCode, final IRepositoryIdProvider repository,
final IssueService service) {
this.activity = activity;
this.requestCode = requestCode;
this.repository = repository;
this.service = service;
}

/**
* Get issues
*
* @return list of issues
*/
public List<Issue> getIssues() {
return repositoryIssues;
}

private void load() {
new ProgressDialogTask<ArrayList<Issue>>(activity) {

@Override
public ArrayList<Issue> run(Account account) throws Exception {
ArrayList<Issue> issues = new ArrayList<Issue>();
String[] repid = repository.generateId().split("/");
issues.addAll(service.getIssues(repid[0],repid[1], "none").execute().body());
return issues;
}

@Override
protected void onSuccess(ArrayList<Issue> all) throws Exception {
super.onSuccess(all);

repositoryIssues = all;
show();
}

@Override
protected void onException(Exception e) throws RuntimeException {
super.onException(e);

Log.d(TAG, "Exception loading issues", e);
ToastUtils.show(activity, e, R.string.error_issues_load);
}

@Override
public void execute() {
showIndeterminate(R.string.loading_issues);

super.execute();
}
}.execute();
}

/**
* Show dialog
*
*/
public void show() {
if (repositoryIssues == null) {
load();
return;
}

IssueDialogFragment.show(activity, requestCode,
activity.getString(R.string.ms_select_issue), null,
repositoryIssues);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
/*
* 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.milestone;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.github.kevinsawicki.wishlist.SingleTypeAdapter;
import com.github.mobile.R;
import com.github.mobile.api.model.Issue;
import com.github.mobile.ui.DialogFragmentActivity;
import com.github.mobile.ui.SingleChoiceDialogFragment;

import java.util.ArrayList;

import static android.app.Activity.RESULT_OK;
import static android.content.DialogInterface.BUTTON_NEGATIVE;

/**
* Dialog fragment to add an issue to milestone
*/
public class IssueDialogFragment extends SingleChoiceDialogFragment {

private static class IssueListAdapter extends
SingleTypeAdapter<Issue> {


public IssueListAdapter(LayoutInflater inflater,
Issue[] issues) {
super(inflater, R.layout.milestone_item);

setItems(issues);
}

@Override
protected int[] getChildViewIds() {
return new int[] { R.id.rb_selected, R.id.tv_milestone_title,
R.id.tv_milestone_description };
}

@Override
protected void update(int position, Issue item) {
setText(1, item.title);
}

@Override
public long getItemId(int position) {
return getItem(position).number;
}
}

/**
* Get selected milestone from results bundle
*
* @param arguments
* @return milestone
*/
public static Issue getSelected(Bundle arguments) {
return (Issue) arguments.getSerializable(ARG_SELECTED);
}

/**
* Confirm message and deliver callback to given activity
*
* @param activity
* @param requestCode
* @param title
* @param message
* @param choices
*/
public static void show(final DialogFragmentActivity activity,
final int requestCode, final String title, final String message,
ArrayList<Issue> choices) {
show(activity, requestCode, title, message, choices, -1,
new IssueDialogFragment());
}

@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
Activity activity = getActivity();

final AlertDialog dialog = createDialog();
dialog.setButton(BUTTON_NEGATIVE, activity.getString(R.string.cancel),
this);

LayoutInflater inflater = activity.getLayoutInflater();

ListView view = (ListView) inflater.inflate(R.layout.dialog_list_view,
null);
view.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
onClick(dialog, position);
}
});

ArrayList<Issue> choices = getChoices();
IssueListAdapter adapter = new IssueListAdapter(inflater,
choices.toArray(new Issue[choices.size()]));
view.setAdapter(adapter);
dialog.setView(view);

return dialog;
}

@SuppressWarnings("unchecked")
private ArrayList<Issue> getChoices() {
return (ArrayList<Issue>) getArguments().getSerializable(
ARG_CHOICES);
}

@Override
public void onClick(DialogInterface dialog, int which) {
super.onClick(dialog, which);

switch (which) {
case BUTTON_NEGATIVE:
break;
default:
getArguments().putSerializable(ARG_SELECTED,
getChoices().get(which));
onResult(RESULT_OK);
}
}
}
Original file line number Diff line number Diff line change
@@ -9,10 +9,14 @@

import com.github.mobile.Intents;
import com.github.mobile.R;
import com.github.mobile.api.model.Issue;
import com.github.mobile.api.model.Milestone;
import com.github.mobile.api.service.IssueService;
import com.github.mobile.core.issue.IssueFilter;
import com.github.mobile.core.milestone.AddIssueTask;
import com.github.mobile.ui.DialogFragmentActivity;
import com.github.mobile.ui.issue.IssuesFragment;
import com.google.inject.Inject;

import org.eclipse.egit.github.core.Repository;
import org.eclipse.egit.github.core.User;
@@ -23,6 +27,7 @@
import static com.github.mobile.Intents.EXTRA_REPOSITORY_NAME;
import static com.github.mobile.Intents.EXTRA_REPOSITORY_OWNER;
import static com.github.mobile.Intents.EXTRA_USER;
import static com.github.mobile.RequestCodes.ISSUE_MILESTONE_UPDATE;
import static com.github.mobile.RequestCodes.MILESTONE_EDIT;

/**
@@ -43,6 +48,12 @@ public static Intent createIntent(Repository repository, Milestone milestone, in

private Repository repository;
private Milestone milestone;
private IssueDialog issueDialog;

private AddIssueTask issueTask;

@Inject
private IssueService issueService;

@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -58,6 +69,8 @@ protected void onCreate(Bundle savedInstanceState) {
actionBar.setSubtitle(R.string.milestone);
actionBar.setDisplayHomeAsUpEnabled(true);

DialogFragmentActivity dialogActivity = (DialogFragmentActivity) this;

MilestoneFragment milestoneFragment = new MilestoneFragment();

Bundle args = new Bundle();
@@ -82,6 +95,21 @@ protected void onCreate(Bundle savedInstanceState) {
transaction.add(R.id.ms_issues, issuesFragment);

transaction.commit();

issueTask = new AddIssueTask(dialogActivity, repository,
milestone.number) {

@Override
protected void onSuccess(Milestone editedMilestone) throws Exception {
super.onSuccess(editedMilestone);
IssuesFragment issuesFragment = new IssuesFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.ms_issues, issuesFragment);
transaction.commit();
milestone = editedMilestone;
updateMilestone();
}
};
}

@Override
@@ -91,7 +119,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
finish();
return true;
case R.id.add_ms_menu_item:
//todo add issues to milestone
issueTask.prompt();
return true;
case R.id.m_edit: {
Intent intent = EditMilestoneActivity.createIntent(milestone, repository,
@@ -121,6 +149,19 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}

@Override
public void onDialogResult(int requestCode, int resultCode, Bundle arguments) {
if (RESULT_OK != resultCode)
return;

switch (requestCode) {
case ISSUE_MILESTONE_UPDATE:
Issue issue = IssueDialogFragment.getSelected(arguments);
issueTask.edit(issue);
break;
}
}

private void updateMilestone() {
if(milestone != null) {
MilestoneFragment milestoneFragment = new MilestoneFragment();
@@ -142,7 +183,7 @@ private void updateMilestone() {

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.add(R.id.ms_description, milestoneFragment);
transaction.replace(R.id.ms_description, milestoneFragment);
transaction.commit();
}
}
4 changes: 3 additions & 1 deletion app/src/main/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
@@ -344,6 +344,7 @@
<string name="render_markdown">Отобразить Markdown</string>
<string name="copy_hash">Копировать хэш</string>
<string name="toast_msg_copied">Скопировано в буфер обмена</string>

<string name="ms_closed_issues">"Закрытые: "</string>
<string name="ms_due_by">"До "</string>
<string name="ms_opened_issues">"Открытые: "</string>
@@ -355,6 +356,7 @@
<string name="issues_display_opened">Показать открытые</string>
<string name="ms_time_past">Просрочен</string>
<string name="ms_days">дней</string>
<string name="new_milestone">Новый milestone</string>
<string name="ms_select_issue">Выбрать задачу</string>
<string name="ms_new_milestone">Новая цель</string>

</resources>
3 changes: 2 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -351,7 +351,7 @@
<string name="ms_due_by">Due by </string>
<string name="ms_opened_issues">Opened:</string>
<string name="ms_closed_issues">Closed:</string>
<string name="new_milestone">New milestone</string>
<string name="ms_new_milestone">New milestone</string>
<string name="ms_date_2_weeks">2 weeks</string>
<string name="ms_date_month">month</string>
<string name="ms_choose_date">Choose date</string>
@@ -361,5 +361,6 @@
<string name="ms_time_past">past due by</string>
<string name="ms_days">days</string>
<string name="ms_date_format">dd MMM yyyy</string>
<string name="ms_select_issue">Select Issue</string>

</resources>

0 comments on commit aaeb72d

Please sign in to comment.