package yuku.alkitab.base.util;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.afollestad.materialdialogs.MaterialDialog;
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.Request;
import okhttp3.Response;
import yuku.alkitab.base.App;
import yuku.alkitab.debug.BuildConfig;
import yuku.alkitab.debug.R;
import yuku.alkitab.model.Version;
import yuku.alkitab.util.Ari;
import yuku.alkitab.util.IntArrayList;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
public class ShareUrl {
public interface Callback {
void onSuccess(String shareUrl);
void onUserCancel();
void onError(Exception e);
void onFinally();
}
public static void make(@NonNull final Activity activity, final boolean immediatelyCancel, @NonNull final String verseText, final int ari_bc, @NonNull final IntArrayList selectedVerses_1, @NonNull final String reference, @NonNull final Version version, @Nullable final String preset_name, @NonNull final Callback callback) {
if (immediatelyCancel) { // user explicitly ask for not submitting url
callback.onUserCancel();
callback.onFinally();
return;
}
final StringBuilder aris = new StringBuilder();
for (int i = 0, len = selectedVerses_1.size(); i < len; i++) {
final int verse_1 = selectedVerses_1.get(i);
final int ari = Ari.encodeWithBc(ari_bc, verse_1);
if (aris.length() != 0) {
aris.append(',');
}
aris.append(ari);
}
final FormBody.Builder form = new FormBody.Builder()
.add("verseText", verseText)
.add("aris", aris.toString())
.add("verseReferences", reference);
if (preset_name != null) {
form.add("preset_name", preset_name);
}
final String versionLongName = version.getLongName();
if (versionLongName != null) {
form.add("versionLongName", versionLongName);
}
final String versionShortName = version.getShortName();
if (versionShortName != null) {
form.add("versionShortName", versionShortName);
}
final Call call = App.okhttp().newCall(
new Request.Builder()
.url(BuildConfig.SERVER_HOST + "v/create")
.post(form.build())
.build()
);
// when set to true, do not call any callback
final AtomicBoolean done = new AtomicBoolean();
final MaterialDialog dialog = new MaterialDialog.Builder(activity)
.content("Getting share URL…")
.progress(true, 0)
.negativeText(R.string.cancel)
.onNegative((dialog1, which) -> {
if (!done.getAndSet(true)) {
done.set(true);
callback.onUserCancel();
dialog1.dismiss();
callback.onFinally();
}
})
.dismissListener(dialog1 -> {
if (!done.getAndSet(true)) {
callback.onUserCancel();
dialog1.dismiss();
callback.onFinally();
}
})
.show();
call.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(final Call call, final IOException e) {
if (!done.getAndSet(true)) {
activity.runOnUiThread(() -> {
callback.onError(e);
dialog.dismiss();
callback.onFinally();
});
}
}
@Override
public void onResponse(final Call call, final Response response) throws IOException {
if (!done.getAndSet(true)) {
final ShareUrlResponseJson obj = App.getDefaultGson().fromJson(response.body().charStream(), ShareUrlResponseJson.class);
if (obj.success) {
activity.runOnUiThread(() -> {
callback.onSuccess(obj.share_url);
dialog.dismiss();
callback.onFinally();
});
} else {
activity.runOnUiThread(() -> {
callback.onError(new Exception(obj.message));
dialog.dismiss();
callback.onFinally();
});
}
}
}
});
}
static class ShareUrlResponseJson {
public boolean success;
public String message;
public String share_url;
}
}