package com.alorma.github.ui.activity.gists; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.Switch; import com.afollestad.materialdialogs.MaterialDialog; import com.alorma.github.R; import com.alorma.github.sdk.bean.dto.response.Gist; import com.alorma.github.sdk.bean.dto.response.GistFile; import com.alorma.github.sdk.bean.dto.response.GistFilesMap; import com.alorma.github.sdk.services.gists.PublishGistClient; import com.alorma.github.ui.activity.base.BackActivity; import com.alorma.github.ui.adapter.GistCreatedDetailFilesAdapter; import com.alorma.github.ui.utils.DialogUtils; import com.mikepenz.iconics.IconicsDrawable; import com.mikepenz.octicons_typeface_library.Octicons; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by Bernat on 02/04/2015. */ public class CreateGistActivity extends BackActivity implements GistCreatedDetailFilesAdapter.GistCreateAdapterListener { private static final int GIST_FILE_CREATOR = 540; private static final int GIST_FILE_EDITOR = 541; private GistCreatedDetailFilesAdapter adapter; private boolean sharingMode; private EditText gistDescription; private Switch gistPrivate; private RecyclerView recyclerView; private int editingPosition; public static Intent createLauncherIntent(Context context) { return new Intent(context, CreateGistActivity.class); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_gist); recyclerView = (RecyclerView) findViewById(R.id.recycler); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new GistCreatedDetailFilesAdapter(LayoutInflater.from(this)); adapter.setGistCreateAdapterListener(this); recyclerView.setAdapter(adapter); sharingMode = Intent.ACTION_SEND.equals(getIntent().getAction()); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } gistDescription = (EditText) findViewById(R.id.gistDescription); gistPrivate = (Switch) findViewById(R.id.gistPrivate); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fabButton); fab.setImageDrawable(new IconicsDrawable(this, Octicons.Icon.oct_gist_new).color(Color.WHITE).actionBar()); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { launchEmptyEditor(); } }); } private void launchEmptyEditor() { Intent intent = GistEditorActivity.createLauncherIntent(this, getIntent().getExtras()); startActivityForResult(intent, GIST_FILE_CREATOR); } private void launchEditor(GistFile file) { Intent intent = GistEditorActivity.createLauncherIntent(this, file); startActivityForResult(intent, GIST_FILE_EDITOR); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_create_gist, menu); MenuItem publishItem = menu.findItem(R.id.action_publish_gist); IconicsDrawable publishIcon = new IconicsDrawable(this, Octicons.Icon.oct_package); publishIcon.actionBar(); publishIcon.color(Color.WHITE); publishItem.setIcon(publishIcon); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data != null && resultCode == RESULT_OK) { GistFile file = (GistFile) data.getParcelableExtra(GistEditorActivity.EXTRA_FILE); if (file != null) { switch (requestCode) { case GIST_FILE_CREATOR: adapter.add(file); break; case GIST_FILE_EDITOR: adapter.update(editingPosition, file); break; } editingPosition = -1; } } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: String description = gistDescription.getText().toString(); int gistFiles = adapter.getItemCount(); if (gistFiles > 0) { showDialogCancelGist(); } else { if (!TextUtils.isEmpty(description)) { showDialogNotEmpty(); } else { finish(); } } break; case R.id.action_publish_gist: publishGist(); break; } return true; } private void showDialogNotEmpty() { MaterialDialog.Builder builder = new DialogUtils().builder(this); builder.content(R.string.gist_creator_not_empty); builder.positiveText(R.string.gist_creator_editor_discard); builder.negativeText(R.string.cancel); builder.onPositive((dialog1, which) -> finish()); dialog = builder.show(); } private void showDialogCancelGist() { MaterialDialog.Builder builder = new DialogUtils().builder(this); builder.content(R.string.gist_creator_cancel_job); builder.positiveText(R.string.ok); builder.negativeText(R.string.cancel); builder.neutralText(R.string.publish_gist); builder.callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { super.onPositive(dialog); finish(); } @Override public void onNeutral(MaterialDialog dialog) { super.onNeutral(dialog); publishGist(); } }); dialog = builder.show(); } private void publishGist() { if (adapter != null && adapter.getItemCount() > 0) { Gist gist = new Gist(); gist.isPublic = !gistPrivate.isChecked(); gist.description = gistDescription.getText().toString(); GistFilesMap files = new GistFilesMap(); for (GistFile gistFile : adapter.getItems()) { if (!TextUtils.isEmpty(gistFile.filename) && !TextUtils.isEmpty(gistFile.content)) { files.put(gistFile.filename, gistFile); } } gist.files = files; showProgressDialog(R.string.publishing_gist); PublishGistClient publishGistClient = new PublishGistClient(gist); publishGistClient.observable() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Gist>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { hideProgressDialog(); Snackbar.make(recyclerView, R.string.publish_gist_fail, Snackbar.LENGTH_SHORT).show(); } @Override public void onNext(Gist gist) { hideProgressDialog(); finish(); } }); } } @Override public void updateFile(int position, GistFile gistFile) { this.editingPosition = position; launchEditor(gistFile); } @Override public void removeFile(int position, final GistFile item) { MaterialDialog.Builder builder = new DialogUtils().builder(this); builder.content(getString(R.string.gist_creator_remove_file, item.filename)); builder.positiveText(R.string.ok); builder.negativeText(R.string.cancel); builder.callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { super.onPositive(dialog); adapter.remove(item); } }); dialog = builder.show(); } }