package com.door43.translationstudio.newui;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.design.widget.Snackbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.door43.tools.reporting.Logger;
import com.door43.translationstudio.MainApplication;
import com.door43.translationstudio.R;
import com.door43.translationstudio.dialogs.CustomAlertDialog;
import com.door43.translationstudio.tasks.CheckForLatestReleaseTask;
import com.door43.translationstudio.tasks.UploadBugReportTask;
import com.door43.util.tasks.ManagedTask;
import com.door43.util.tasks.TaskManager;
import com.door43.widget.ViewUtil;
/**
* Created by joel on 9/17/2015.
*/
public class FeedbackDialog extends DialogFragment implements ManagedTask.OnFinishedListener {
private static final String STATE_LATEST_RELEASE = "latest_release";
private static final String STATE_NOTES = "bug_notes";
public static final String ARG_MESSAGE = "arg_message";
private String mMessage = "";
private CheckForLatestReleaseTask.Release mLatestRelease;
private LinearLayout mLoadingLayout;
private LinearLayout mFormLayout;
private LinearLayout mControlsLayout;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCanceledOnTouchOutside(false);
return dialog;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View v = inflater.inflate(R.layout.dialog_feedback, container, false);
if(savedInstanceState == null) {
Bundle args = getArguments();
if (args != null) {
mMessage = args.getString(ARG_MESSAGE, "");
}
}
mLoadingLayout = (LinearLayout)v.findViewById(R.id.loadingLayout);
mFormLayout = (LinearLayout)v.findViewById(R.id.formLayout);
mControlsLayout = (LinearLayout)v.findViewById(R.id.controlsLayout);
ImageView wifiIcon = (ImageView)v.findViewById(R.id.wifi_icon);
ViewUtil.tintViewDrawable(wifiIcon, getActivity().getResources().getColor(R.color.dark_secondary_text));
Button cancelButton = (Button)v.findViewById(R.id.cancelButton);
Button confirmButton = (Button)v.findViewById(R.id.confirmButton);
final EditText editText = (EditText)v.findViewById(R.id.editText);
editText.setText(mMessage);
editText.setSelection(editText.getText().length());
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(editText.getText().toString().isEmpty()) {
// requires text
notifyInputRequired();
} else {
reportBug(editText.getText().toString().trim());
}
}
});
if(savedInstanceState != null) {
mMessage = savedInstanceState.getString(STATE_NOTES, "");
mLatestRelease = (CheckForLatestReleaseTask.Release)savedInstanceState.getSerializable(STATE_LATEST_RELEASE);
}
// connect to existing tasks
CheckForLatestReleaseTask checkTask = (CheckForLatestReleaseTask) TaskManager.getTask(CheckForLatestReleaseTask.TASK_ID);
UploadBugReportTask uploadTask = (UploadBugReportTask)TaskManager.getTask(UploadBugReportTask.TASK_ID);
if(checkTask != null) {
showLoadingUI();
checkTask.addOnFinishedListener(this);
} else if(uploadTask != null) {
showLoadingUI();
uploadTask.addOnFinishedListener(this);
} else if(mLatestRelease != null) {
showLoadingUI();
notifyLatestRelease(mLatestRelease);
}
return v;
}
private void notifyInputRequired() {
Snackbar snack = Snackbar.make(getActivity().findViewById(android.R.id.content), R.string.input_required, Snackbar.LENGTH_SHORT);
ViewUtil.setSnackBarTextColor(snack, getResources().getColor(R.color.light_primary_text));
snack.show();
}
private void reportBug(String message) {
mMessage = message;
showLoadingUI();
CheckForLatestReleaseTask task = new CheckForLatestReleaseTask();
task.addOnFinishedListener(FeedbackDialog.this);
TaskManager.addTask(task, CheckForLatestReleaseTask.TASK_ID);
}
private void showLoadingUI() {
mFormLayout.setVisibility(View.GONE);
mControlsLayout.setVisibility(View.GONE);
mLoadingLayout.setVisibility(View.VISIBLE);
}
@Override
public void onFinished(ManagedTask task) {
TaskManager.clearTask(task);
if(task.getClass().getName().equals(CheckForLatestReleaseTask.class.getName())) {
CheckForLatestReleaseTask.Release release = ((CheckForLatestReleaseTask)task).getLatestRelease();
if(release != null) {
mLatestRelease = release;
Handler hand = new Handler(Looper.getMainLooper());
hand.post(new Runnable() {
@Override
public void run() {
notifyLatestRelease(mLatestRelease);
}
});
} else {
if(!mMessage.isEmpty()) {
UploadBugReportTask newTask = new UploadBugReportTask(mMessage);
newTask.addOnFinishedListener(FeedbackDialog.this);
TaskManager.addTask(newTask, UploadBugReportTask.TASK_ID);
} else {
notifyInputRequired();
FeedbackDialog.this.dismiss();
}
}
} else if(task.getClass().getName().equals(UploadBugReportTask.class.getName())) {
Snackbar snack = Snackbar.make(getActivity().findViewById(android.R.id.content), R.string.success, Snackbar.LENGTH_LONG);
ViewUtil.setSnackBarTextColor(snack, getResources().getColor(R.color.light_primary_text));
snack.show();
FeedbackDialog.this.dismiss();
}
}
/**
* Displays a dialog to the user telling them there is an apk update.
* @param release
*/
private void notifyLatestRelease(final CheckForLatestReleaseTask.Release release) {
final Boolean isStoreVersion = ((MainApplication)getActivity().getApplication()).isStoreVersion();
CustomAlertDialog.Create(getActivity())
.setTitle(R.string.apk_update_available)
.setMessage(R.string.upload_report_or_download_latest_apk)
.setNegativeButton(R.string.title_cancel, new View.OnClickListener() {
@Override
public void onClick(View v) {
mLatestRelease = null;
FeedbackDialog.this.dismiss();
}
})
.setNeutralButton(R.string.download_update, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isStoreVersion) {
// open play store
final String appPackageName = getActivity().getPackageName();
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}
} else {
// download from github
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(release.downloadUrl));
startActivity(browserIntent);
}
FeedbackDialog.this.dismiss();
}
})
.setPositiveButton(R.string.label_continue, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mMessage.isEmpty()) {
UploadBugReportTask newTask = new UploadBugReportTask(mMessage);
newTask.addOnFinishedListener(FeedbackDialog.this);
TaskManager.addTask(newTask, UploadBugReportTask.TASK_ID);
} else {
notifyInputRequired();
FeedbackDialog.this.dismiss();
}
}
})
.show("ReleaseNotify");
}
@Override
public void onSaveInstanceState(Bundle outState) {
if(mLatestRelease != null) {
outState.putSerializable(STATE_LATEST_RELEASE, mLatestRelease);
} else {
outState.remove(STATE_LATEST_RELEASE);
}
outState.putString(STATE_NOTES, mMessage);
super.onSaveInstanceState(outState);
}
public void onDestroy() {
// disconnect listeners
CheckForLatestReleaseTask checkTask = (CheckForLatestReleaseTask) TaskManager.getTask(CheckForLatestReleaseTask.TASK_ID);
if(checkTask != null) {
checkTask.removeOnFinishedListener(this);
}
UploadBugReportTask uploadTask = (UploadBugReportTask)TaskManager.getTask(UploadBugReportTask.TASK_ID);
if(uploadTask != null) {
uploadTask.removeOnFinishedListener(this);
}
super.onDestroy();
}
}