package com.alorma.github.ui.fragment;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.text.Html;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.alorma.github.R;
import com.alorma.github.sdk.bean.dto.request.RepoRequestDTO;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.sdk.services.repo.BranchesSubscriber;
import com.alorma.github.sdk.services.repo.DeleteRepoClient;
import com.alorma.github.sdk.services.repo.GetRepoBranchesClient;
import com.alorma.github.ui.activity.ContentEditorActivity;
import com.alorma.github.ui.utils.DialogUtils;
import retrofit.client.Response;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by a557114 on 01/08/2015.
*/
public class RepositoryManagerFragment extends PreferenceFragment {
private static final String REPO_INFO = "REPO_INFO";
private static final String REQUEST_DTO = "REQUEST_DTO";
private static final int DESCRIPTION_EDIT = 544;
private RepoInfo repoInfo;
private RepoRequestDTO repoRequestDTO;
private ListPreference pref_repo_default_branch;
private MaterialDialog deleteRepoDialog;
public static RepositoryManagerFragment newInstance(RepoInfo repoInfo, RepoRequestDTO repoRequestDTO) {
RepositoryManagerFragment fragment = new RepositoryManagerFragment();
Bundle args = new Bundle();
args.putParcelable(REPO_INFO, repoInfo);
args.putParcelable(REQUEST_DTO, repoRequestDTO);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.repository_manager_prefs);
repoInfo = (RepoInfo) getArguments().getParcelable(REPO_INFO);
repoRequestDTO = (RepoRequestDTO) getArguments().getParcelable(REQUEST_DTO);
final EditTextPreference pref_repo_name = (EditTextPreference) findPreference("pref_repo_name");
pref_repo_name.setTitle(repoRequestDTO.name);
pref_repo_name.setText(repoRequestDTO.name);
pref_repo_name.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
repoRequestDTO.name = (String) newValue;
pref_repo_name.setTitle(repoRequestDTO.name);
return true;
}
});
Preference pref_repo_description = findPreference("pref_repo_description");
pref_repo_description.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent intent =
ContentEditorActivity.createLauncherIntent(getActivity(), repoInfo, 0, null, repoRequestDTO.description, true, true);
startActivityForResult(intent, DESCRIPTION_EDIT);
return false;
}
});
final Preference pref_repo_url = findPreference("pref_repo_url");
pref_repo_url.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
repoRequestDTO.homepage = (String) newValue;
return false;
}
});
CheckBoxPreference pref_repo_has_issues = (CheckBoxPreference) findPreference("pref_repo_has_issues");
pref_repo_has_issues.setChecked(repoRequestDTO.has_issues);
pref_repo_has_issues.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
repoRequestDTO.has_issues = (Boolean) newValue;
return true;
}
});
CheckBoxPreference pref_repo_has_wiki = (CheckBoxPreference) findPreference("pref_repo_has_wiki");
pref_repo_has_wiki.setChecked(repoRequestDTO.has_wiki);
pref_repo_has_wiki.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
repoRequestDTO.has_wiki = (Boolean) newValue;
return true;
}
});
CheckBoxPreference pref_repo_has_downloads = (CheckBoxPreference) findPreference("pref_repo_has_downloads");
pref_repo_has_downloads.setChecked(repoRequestDTO.has_downloads);
pref_repo_has_downloads.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
repoRequestDTO.has_downloads = (Boolean) newValue;
return true;
}
});
// CheckBoxPreference pref_repo_is_private = (CheckBoxPreference) findPreference("pref_repo_is_private");
// pref_repo_is_private.setChecked(repoRequestDTO.isPrivate);
// pref_repo_is_private.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
// @Override
// public boolean onPreferenceChange(Preference preference, Object newValue) {
// repoRequestDTO.isPrivate = (Boolean) newValue;
// return true;
// }
// });
pref_repo_default_branch = (ListPreference) findPreference("pref_repo_default_branch");
pref_repo_default_branch.setTitle(repoRequestDTO.default_branch);
pref_repo_default_branch.setEnabled(false);
pref_repo_default_branch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
repoRequestDTO.default_branch = (String) newValue;
pref_repo_default_branch.setTitle((String) newValue);
return true;
}
});
getBranches();
Preference pref_repo_delete = findPreference("pref_repo_delete");
pref_repo_delete.setOnPreferenceClickListener(preference -> {
checkDeleteRepository();
return false;
});
}
private void checkDeleteRepository() {
Spanned content = Html.fromHtml(getString(R.string.delete_repository_content, repoInfo.owner, repoInfo.name));
new DialogUtils().builder(getActivity())
.title(R.string.delete_repository)
.content(content)
.positiveText(R.string.ok)
.positiveColorRes(R.color.md_red_400)
.negativeText(R.string.cancel)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
deleteRepository();
}
})
.show();
}
private void deleteRepository() {
MaterialDialog.Builder builder = new DialogUtils().builder(getActivity());
builder.progress(true, 0);
builder.content(R.string.deleting_repository);
deleteRepoDialog = builder.show();
DeleteRepoClient deleteRepoClient = new DeleteRepoClient(repoInfo);
deleteRepoClient.observable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "Repository delete failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(Response response) {
if (getActivity() != null) {
if (deleteRepoDialog != null) {
deleteRepoDialog.dismiss();
}
getActivity().setResult(Activity.RESULT_CANCELED);
getActivity().finish();
}
}
});
}
private void getBranches() {
GetRepoBranchesClient repoBranchesClient = new GetRepoBranchesClient(repoInfo);
repoBranchesClient.observable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BranchesSubscriber(repoInfo) {
@Override
protected void showBranches(String[] branches, int defaultBranchPosition) {
if (branches != null && branches.length > 0) {
pref_repo_default_branch.setEntries(branches);
pref_repo_default_branch.setEntryValues(branches);
pref_repo_default_branch.setValueIndex(defaultBranchPosition);
pref_repo_default_branch.setEnabled(true);
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == DESCRIPTION_EDIT) {
if (data != null && data.getExtras() != null && data.getExtras().containsKey(ContentEditorActivity.CONTENT)) {
String content = data.getExtras().getString(ContentEditorActivity.CONTENT);
if (!TextUtils.isEmpty(content)) {
repoRequestDTO.description = content;
}
}
}
}
public RepoRequestDTO getRepoRequestDTO() {
return repoRequestDTO;
}
}