package com.alorma.github.ui.fragment; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.text.TextUtils; import com.afollestad.materialdialogs.prefs.MaterialListPreference; import com.alorma.github.R; import com.alorma.github.sdk.bean.dto.request.RepoRequestDTO; import com.alorma.github.sdk.bean.dto.response.GitIgnoreTemplates; import com.alorma.github.sdk.services.gtignore.GitIgnoreClient; import com.alorma.github.ui.activity.ContentEditorActivity; import java.util.ArrayList; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by bernat.borras on 10/11/15. */ public class CreateRepositoryFragment extends PreferenceFragment { private static final int DESCRIPTION_EDIT = 112; private RepoRequestDTO repoRequestDTO = new RepoRequestDTO(); private CreateRepositoryInterface nullInterface = new NullInterface(); private CreateRepositoryInterface createInterface = nullInterface; @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof CreateRepositoryInterface) { createInterface = (CreateRepositoryInterface) context; } } @Override public void onDetach() { createInterface = nullInterface; super.onDetach(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.repository_create_prefs); 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); checkState(); return true; } }); final 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(), 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(true); repoRequestDTO.has_issues = true; 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.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.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { repoRequestDTO.has_downloads = (Boolean) newValue; return true; } }); CheckBoxPreference pref_repo_auto_init = (CheckBoxPreference) findPreference("pref_repo_auto_init"); pref_repo_auto_init.setChecked(true); repoRequestDTO.auto_init = true; pref_repo_has_downloads.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { repoRequestDTO.auto_init = (Boolean) newValue; return true; } }); final MaterialListPreference pref_repo_gitignore = (MaterialListPreference) findPreference("pref_repo_gitignore"); pref_repo_gitignore.setEnabled(false); pref_repo_gitignore.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (!newValue.equals("[none]")) { repoRequestDTO.gitignore_template = (String) newValue; pref_repo_gitignore.setSummary((String) newValue); } else { repoRequestDTO.gitignore_template = null; pref_repo_gitignore.setSummary(""); } return false; } }); GitIgnoreClient gitIgnoreClient = new GitIgnoreClient(); gitIgnoreClient.observable() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<GitIgnoreTemplates>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(GitIgnoreTemplates gitIgnoreTemplates) { ArrayList<String> ignoreTemplates = new ArrayList<String>(); ignoreTemplates.add("[none]"); ignoreTemplates.addAll(gitIgnoreTemplates); CharSequence[] templates = new CharSequence[ignoreTemplates.size()]; for (int i = 0; i < ignoreTemplates.size(); i++) { templates[i] = ignoreTemplates.get(i); } pref_repo_gitignore.setEntries(templates); pref_repo_gitignore.setEntryValues(templates); pref_repo_gitignore.setEnabled(true); } }); } private void checkState() { if (createInterface != null) { if (repoRequestDTO.isValid()) { createInterface.onRepositoryReady(); } else { createInterface.onRepositoryNotReady(); } } } public RepoRequestDTO getRequest() { return repoRequestDTO; } @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; checkState(); } } } } public interface CreateRepositoryInterface { void onRepositoryReady(); void onRepositoryNotReady(); } private class NullInterface implements CreateRepositoryInterface { @Override public void onRepositoryReady() { } @Override public void onRepositoryNotReady() { } } }