/*
* 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.view.View.GONE;
import static com.github.mobile.Intents.EXTRA_ISSUE_FILTER;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.github.mobile.Intents.Builder;
import com.github.mobile.R.id;
import com.github.mobile.R.layout;
import com.github.mobile.R.menu;
import com.github.mobile.R.string;
import com.github.mobile.core.issue.IssueFilter;
import com.github.mobile.ui.DialogFragmentActivity;
import com.github.mobile.util.AvatarLoader;
import com.google.inject.Inject;
import java.util.Set;
import org.eclipse.egit.github.core.Label;
import org.eclipse.egit.github.core.Milestone;
import org.eclipse.egit.github.core.Repository;
import org.eclipse.egit.github.core.User;
import org.eclipse.egit.github.core.service.CollaboratorService;
import org.eclipse.egit.github.core.service.LabelService;
import org.eclipse.egit.github.core.service.MilestoneService;
/**
* Activity to create or edit an issues filter for a repository
*/
public class EditIssuesFilterActivity extends DialogFragmentActivity {
/**
* Create intent for creating an issue filter for the given repository
*
* @param filter
* @return intent
*/
public static Intent createIntent(IssueFilter filter) {
return new Builder("repo.issues.filter.VIEW").add(EXTRA_ISSUE_FILTER,
filter).toIntent();
}
private static final int REQUEST_LABELS = 1;
private static final int REQUEST_MILESTONE = 2;
private static final int REQUEST_ASSIGNEE = 3;
@Inject
private CollaboratorService collaborators;
@Inject
private MilestoneService milestones;
@Inject
private LabelService labels;
@Inject
private AvatarLoader avatars;
private LabelsDialog labelsDialog;
private MilestoneDialog milestoneDialog;
private AssigneeDialog assigneeDialog;
private IssueFilter filter;
private TextView labelsText;
private TextView milestoneText;
private TextView assigneeText;
private ImageView avatarView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.issues_filter_edit);
labelsText = finder.find(id.tv_labels);
milestoneText = finder.find(id.tv_milestone);
assigneeText = finder.find(id.tv_assignee);
avatarView = finder.find(id.iv_avatar);
if (savedInstanceState != null)
filter = (IssueFilter) savedInstanceState
.getSerializable(EXTRA_ISSUE_FILTER);
if (filter == null)
filter = (IssueFilter) getIntent().getSerializableExtra(
EXTRA_ISSUE_FILTER);
final Repository repository = filter.getRepository();
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(string.filter_issues_title);
actionBar.setSubtitle(repository.generateId());
avatars.bind(actionBar, repository.getOwner());
OnClickListener assigneeListener = new OnClickListener() {
public void onClick(View v) {
if (assigneeDialog == null)
assigneeDialog = new AssigneeDialog(
EditIssuesFilterActivity.this, REQUEST_ASSIGNEE,
repository, collaborators);
assigneeDialog.show(filter.getAssignee());
}
};
findViewById(id.tv_assignee_label)
.setOnClickListener(assigneeListener);
assigneeText.setOnClickListener(assigneeListener);
OnClickListener milestoneListener = new OnClickListener() {
public void onClick(View v) {
if (milestoneDialog == null)
milestoneDialog = new MilestoneDialog(
EditIssuesFilterActivity.this, REQUEST_MILESTONE,
repository, milestones);
milestoneDialog.show(filter.getMilestone());
}
};
findViewById(id.tv_milestone_label)
.setOnClickListener(milestoneListener);
milestoneText.setOnClickListener(milestoneListener);
OnClickListener labelsListener = new OnClickListener() {
public void onClick(View v) {
if (labelsDialog == null)
labelsDialog = new LabelsDialog(
EditIssuesFilterActivity.this, REQUEST_LABELS,
repository, labels);
labelsDialog.show(filter.getLabels());
}
};
findViewById(id.tv_labels_label)
.setOnClickListener(labelsListener);
labelsText.setOnClickListener(labelsListener);
updateAssignee();
updateMilestone();
updateLabels();
RadioButton openButton = (RadioButton) findViewById(id.rb_open);
openButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked)
filter.setOpen(true);
}
});
RadioButton closedButton = (RadioButton) findViewById(id.rb_closed);
closedButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked)
filter.setOpen(false);
}
});
if (filter.isOpen())
openButton.setChecked(true);
else
closedButton.setChecked(true);
}
@Override
public boolean onCreateOptionsMenu(Menu options) {
getSupportMenuInflater().inflate(menu.issue_filter, options);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case id.m_apply:
Intent intent = new Intent();
intent.putExtra(EXTRA_ISSUE_FILTER, filter);
setResult(RESULT_OK, intent);
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(EXTRA_ISSUE_FILTER, filter);
}
private void updateLabels() {
Set<Label> selected = filter.getLabels();
if (selected != null)
LabelDrawableSpan.setText(labelsText, selected);
else
labelsText.setText(string.none);
}
private void updateMilestone() {
Milestone selected = filter.getMilestone();
if (selected != null)
milestoneText.setText(selected.getTitle());
else
milestoneText.setText(string.none);
}
private void updateAssignee() {
User selected = filter.getAssignee();
if (selected != null) {
avatars.bind(avatarView, selected);
assigneeText.setText(selected.getLogin());
} else {
avatarView.setVisibility(GONE);
assigneeText.setText(string.assignee_anyone);
}
}
@Override
public void onDialogResult(int requestCode, int resultCode, Bundle arguments) {
if (RESULT_OK != resultCode)
return;
switch (requestCode) {
case REQUEST_LABELS:
filter.setLabels(LabelsDialogFragment.getSelected(arguments));
updateLabels();
break;
case REQUEST_MILESTONE:
filter.setMilestone(MilestoneDialogFragment.getSelected(arguments));
updateMilestone();
break;
case REQUEST_ASSIGNEE:
filter.setAssignee(AssigneeDialogFragment.getSelected(arguments));
updateAssignee();
break;
}
}
}