package com.door43.translationstudio.newui.home;
import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
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 com.door43.tools.reporting.Logger;
import com.door43.translationstudio.AppContext;
import com.door43.translationstudio.ImportFileChooserActivity;
import com.door43.translationstudio.R;
import com.door43.translationstudio.core.Translator;
import com.door43.translationstudio.dialogs.CustomAlertDialog;
import com.door43.translationstudio.newui.DeviceNetworkAliasDialog;
import com.door43.translationstudio.newui.ImportUsfmActivity;
import com.door43.translationstudio.newui.Door43LoginDialog;
import com.door43.translationstudio.newui.ShareWithPeerDialog;
import com.door43.translationstudio.util.SdUtils;
import com.door43.widget.ViewUtil;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.io.InputStream;
/**
* Created by joel on 10/5/2015.
*/
public class ImportDialog extends DialogFragment {
private static final int IMPORT_PROJECT_FROM_SD_REQUEST = 142;
private static final int IMPORT_USFM_PROJECT_FROM_SD_REQUEST = 143;
public static final String TAG = "importDialog";
private static final String STATE_SETTING_DEVICE_ALIAS = "state_setting_device_alias";
private boolean settingDeviceAlias = false;
private boolean isDocumentFile = false;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View v = inflater.inflate(R.layout.dialog_import, container, false);
final Button restoreDoor43Button = (Button)v.findViewById(R.id.restore_from_door43);
Button importFromSDButton = (Button)v.findViewById(R.id.import_from_sd);
Button importFromSDUsfmButton = (Button)v.findViewById(R.id.import_from_sd_usfm);
Button importFromFriend = (Button)v.findViewById(R.id.import_from_friend);
Button importDoor43Button = (Button)v.findViewById(R.id.import_from_door43);
if(savedInstanceState != null) {
// check if returning from device alias dialog
settingDeviceAlias = savedInstanceState.getBoolean(STATE_SETTING_DEVICE_ALIAS, false);
}
importDoor43Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// make sure we have a gogs user
if(AppContext.getProfile().gogsUser == null) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Door43LoginDialog dialog = new Door43LoginDialog();
dialog.show(ft, Door43LoginDialog.TAG);
return;
}
// open dialog for browsing repositories
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag(ImportDialog.TAG);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
ImportFromDoor43Dialog dialog = new ImportFromDoor43Dialog();
dialog.show(ft, ImportDialog.TAG);
}
});
restoreDoor43Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// make sure we have a gogs user
if(AppContext.getProfile().gogsUser == null) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Door43LoginDialog dialog = new Door43LoginDialog();
dialog.show(ft, Door43LoginDialog.TAG);
return;
}
// open dialog for browsing repositories
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag(ImportDialog.TAG);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
RestoreFromDoor43Dialog dialog = new RestoreFromDoor43Dialog();
dialog.show(ft, ImportDialog.TAG);
}
});
importFromSDButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doImportFromSdCard(false);
}
});
importFromSDUsfmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doImportFromSdCard(true);
}
});
importFromFriend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: 11/18/2015 eventually we need to support bluetooth as well as an adhoc network
if (AppContext.context().isNetworkAvailable()) {
if (AppContext.getDeviceNetworkAlias() == null) {
// get device alias
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag(ImportDialog.TAG);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
settingDeviceAlias = true;
DeviceNetworkAliasDialog dialog = new DeviceNetworkAliasDialog();
dialog.show(ft, ImportDialog.TAG);
} else {
showP2PDialog();
}
} else {
Snackbar snack = Snackbar.make(getActivity().findViewById(android.R.id.content), R.string.internet_not_available, Snackbar.LENGTH_LONG);
ViewUtil.setSnackBarTextColor(snack, getResources().getColor(R.color.light_primary_text));
snack.show();
}
}
});
Button dismissButton = (Button)v.findViewById(R.id.dismiss_button);
dismissButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
return v;
}
private void doImportFromSdCard(boolean doingUsfmImport) {
String typeStr = null;
Intent intent = new Intent(getActivity(), ImportFileChooserActivity.class);
isDocumentFile = SdUtils.isSdCardPresentLollipop();
if(isDocumentFile) {
typeStr = ImportFileChooserActivity.SD_CARD_TYPE;
} else {
typeStr = ImportFileChooserActivity.INTERNAL_TYPE;
}
intent.setType(typeStr);
if(doingUsfmImport) {
intent.putExtra(ImportFileChooserActivity.EXTRAS_ACCEPTED_EXTENSIONS, "usfm");
}
startActivityForResult(intent, doingUsfmImport ? IMPORT_USFM_PROJECT_FROM_SD_REQUEST : IMPORT_PROJECT_FROM_SD_REQUEST);
}
@Override
public void onResume() {
if(settingDeviceAlias && AppContext.getDeviceNetworkAlias() != null) {
settingDeviceAlias = false;
showP2PDialog();
}
super.onResume();
}
/**
* Displays the p2p dialog
*/
private void showP2PDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag(ImportDialog.TAG);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
ShareWithPeerDialog dialog = new ShareWithPeerDialog();
Bundle args = new Bundle();
args.putInt(ShareWithPeerDialog.ARG_OPERATION_MODE, ShareWithPeerDialog.MODE_CLIENT);
args.putString(ShareWithPeerDialog.ARG_DEVICE_ALIAS, AppContext.getDeviceNetworkAlias());
dialog.setArguments(args);
dialog.show(ft, ImportDialog.TAG);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMPORT_PROJECT_FROM_SD_REQUEST) {
if ((resultCode == Activity.RESULT_OK) && (data != null)) {
if (isDocumentFile) {
Uri uri = data.getData();
importUri(uri);
} else {
File file = new File(data.getData().getPath());
importFile(file);
}
}
} else if (requestCode == IMPORT_USFM_PROJECT_FROM_SD_REQUEST) {
if ((resultCode == Activity.RESULT_OK) && (data != null)) {
if (isDocumentFile) {
Uri uri = data.getData();
doUsfmImportUri(uri);
} else {
String path = data.getData().getPath();
doUsfmImportFile(path);
}
}
}
}
/**
* import USFM uri with fallback to standard import if tstudio uri
* @param uri
*/
private void doUsfmImportUri(Uri uri) {
String path = uri.toString();
String ext = FilenameUtils.getExtension(path).toLowerCase();
ImportUsfmActivity.startActivityForUriImport(getActivity(), uri);
}
/**
* import USFM file with fallback to standard import if tstudio file
* @param path
*/
private void doUsfmImportFile(String path) {
File file = new File(path);
String ext = FilenameUtils.getExtension(path).toLowerCase();
boolean tstudio = ext.equalsIgnoreCase(Translator.ARCHIVE_EXTENSION);
if (tstudio) {
importFile(file);
} else {
ImportUsfmActivity.startActivityForFileImport(getActivity(), file);
}
}
/**
* import selected file
* @param file
*/
private void importFile(File file) {
if (FilenameUtils.getExtension(file.getName()).toLowerCase().equals(Translator.ARCHIVE_EXTENSION)) {
try {
Logger.i(this.getClass().getName(), "Importing internal file: " + file.toString());
final Translator translator = AppContext.getTranslator();
final String[] targetTranslationSlugs = translator.importArchive(file);
showImportResults(R.string.import_success, file.toString());
} catch (Exception e) {
Logger.e(this.getClass().getName(), "Failed to import the archive", e);
showImportResults(R.string.import_failed, file.toString());
}
// todo: terrible hack.
((HomeActivity) getActivity()).notifyDatasetChanged();
} else {
showImportResults(R.string.invalid_file, file.toString());
}
}
/**
* import selected uri
* @param uri
*/
private void importUri(Uri uri) {
if(FilenameUtils.getExtension(uri.getPath()).toLowerCase().equals(Translator.ARCHIVE_EXTENSION)) {
try {
Logger.i(this.getClass().getName(), "Importing SD card: " + uri);
final InputStream in = AppContext.context().getContentResolver().openInputStream(uri);
final Translator translator = AppContext.getTranslator();
final String[] targetTranslationSlugs = translator.importArchive(in);
showImportResults(R.string.import_success, SdUtils.getPathString(uri.toString()));
} catch (Exception e) {
Logger.e(this.getClass().getName(), "Failed to import the archive", e);
showImportResults(R.string.import_failed, SdUtils.getPathString(uri.toString()));
}
// todo: terrible hack.
((HomeActivity)getActivity()).notifyDatasetChanged();
} else {
showImportResults(R.string.invalid_file, uri.toString());
}
}
/**
* show the import results to user
* @param textResId
* @param filePath
*/
private void showImportResults(final int textResId, final String filePath) {
String message = getResources().getString(textResId);
if(filePath != null) {
message += "\n" + filePath;
}
CustomAlertDialog.Create(getActivity())
.setTitle(R.string.import_from_sd)
.setMessage(message)
.setNeutralButton(R.string.dismiss, null)
.show("Import");
}
@Override
public void onSaveInstanceState(Bundle out) {
out.putBoolean(STATE_SETTING_DEVICE_ALIAS, settingDeviceAlias);
super.onSaveInstanceState(out);
}
}