Rework the loading workflow to be more natural and fix some nasty bugs. Make the dialogs more localizable by extracting strings into resources.
This commit is contained in:
parent
da430d3611
commit
6a6f926e45
@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
<string name="app_name">OpenRocket</string>
|
<string name="app_name">OpenRocket</string>
|
||||||
<string name="version">version 12.07-b7</string>
|
<string name="version">version 12.07-b7</string>
|
||||||
|
<string name="cancel">Cancel</string>
|
||||||
|
<string name="ok">OK</string>
|
||||||
|
<string name="dismiss">Dismiss</string>
|
||||||
<string name="load">Load</string>
|
<string name="load">Load</string>
|
||||||
<string name="save">Save</string>
|
<string name="save">Save</string>
|
||||||
<string name="Add">Add</string>
|
<string name="Add">Add</string>
|
||||||
@ -10,6 +13,9 @@
|
|||||||
<string name="Download">Download</string>
|
<string name="Download">Download</string>
|
||||||
<string name="About">About</string>
|
<string name="About">About</string>
|
||||||
<string name="Preferences">Preferences</string>
|
<string name="Preferences">Preferences</string>
|
||||||
|
<string name="missingMotors">Missing Motors</string>
|
||||||
|
<string name="missingMotorsMessageStart">The following motors are missing:</string>
|
||||||
|
<string name="missingMotorsMessageEnd">Would you like to download them from Thrustcurve?</string>
|
||||||
<string name="configurePlot">Change Plot</string>
|
<string name="configurePlot">Change Plot</string>
|
||||||
<string name="view_events">View Events</string>
|
<string name="view_events">View Events</string>
|
||||||
<string name="simulationPlotDialogTitle">Select Series And Events</string>
|
<string name="simulationPlotDialogTitle">Select Series And Events</string>
|
||||||
|
@ -11,7 +11,6 @@ public abstract class ActivityHelpers {
|
|||||||
|
|
||||||
public static void goHome( Activity parent ) {
|
public static void goHome( Activity parent ) {
|
||||||
Intent i = new Intent(parent, Main.class);
|
Intent i = new Intent(parent, Main.class);
|
||||||
i.putExtra(Main.restartFlag, true);
|
|
||||||
i.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP + Intent.FLAG_ACTIVITY_NEW_TASK );
|
i.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP + Intent.FLAG_ACTIVITY_NEW_TASK );
|
||||||
parent.startActivity(i);
|
parent.startActivity(i);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ package net.sf.openrocket.android;
|
|||||||
|
|
||||||
import net.sf.openrocket.R;
|
import net.sf.openrocket.R;
|
||||||
import net.sf.openrocket.android.rocket.OpenRocketLoaderActivity;
|
import net.sf.openrocket.android.rocket.OpenRocketLoaderActivity;
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@ -13,17 +12,10 @@ import com.actionbarsherlock.view.MenuItem;
|
|||||||
|
|
||||||
public class Main extends OpenRocketLoaderActivity {
|
public class Main extends OpenRocketLoaderActivity {
|
||||||
|
|
||||||
public final static String restartFlag = "restart";
|
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
/** Called when the activity is first created. */
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
Intent i = getIntent();
|
|
||||||
// Rocket already loaded. go to viewer unless we want to restart.
|
|
||||||
if ( ( i.getBooleanExtra(restartFlag, false) == false) && CurrentRocketHolder.getCurrentRocket().getRocketDocument() != null ) {
|
|
||||||
moveOnToViewer();
|
|
||||||
}
|
|
||||||
setContentView(R.layout.main);
|
setContentView(R.layout.main);
|
||||||
((Button) findViewById(R.id.main_open)).setOnClickListener(
|
((Button) findViewById(R.id.main_open)).setOnClickListener(
|
||||||
new View.OnClickListener() {
|
new View.OnClickListener() {
|
||||||
@ -48,6 +40,15 @@ public class Main extends OpenRocketLoaderActivity {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostResume() {
|
||||||
|
super.onPostResume();
|
||||||
|
// Rocket already loaded.
|
||||||
|
if ( !isLoading() && CurrentRocketHolder.getCurrentRocket().getRocketDocument() != null ) {
|
||||||
|
moveOnToViewer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
MenuInflater inflater = getSupportMenuInflater();
|
MenuInflater inflater = getSupportMenuInflater();
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
package net.sf.openrocket.android.rocket;
|
||||||
|
|
||||||
|
import net.sf.openrocket.R;
|
||||||
|
import net.sf.openrocket.android.util.AndroidLogWrapper;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.actionbarsherlock.app.SherlockDialogFragment;
|
||||||
|
|
||||||
|
public class ErrorLoadingFileDialogFragment extends SherlockDialogFragment {
|
||||||
|
|
||||||
|
public static ErrorLoadingFileDialogFragment newInstance( int titleRes, String message ) {
|
||||||
|
ErrorLoadingFileDialogFragment dialog = new ErrorLoadingFileDialogFragment();
|
||||||
|
Bundle b = new Bundle();
|
||||||
|
b.putString("message", message);
|
||||||
|
b.putInt("titleRes", titleRes);
|
||||||
|
dialog.setArguments(b);
|
||||||
|
dialog.setCancelable(true);
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCancel(DialogInterface dialog) {
|
||||||
|
((OpenRocketLoaderActivity)getActivity()).doDismissErrorDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
AndroidLogWrapper.d(ErrorLoadingFileDialogFragment.class,"onCreateDialog");
|
||||||
|
|
||||||
|
String message = getArguments().getString("message");
|
||||||
|
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
|
||||||
|
if ( getArguments().containsKey("titleRes") ) {
|
||||||
|
int titleRes = getArguments().getInt("titleRes");
|
||||||
|
builder.setTitle(titleRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.setMessage(message);
|
||||||
|
builder.setNeutralButton(R.string.dismiss, new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface arg0, int arg1) {
|
||||||
|
((OpenRocketLoaderActivity)getActivity()).doDismissErrorDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
final AlertDialog dialog = builder.create();
|
||||||
|
dialog.setOwnerActivity(getActivity());
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -2,6 +2,8 @@ package net.sf.openrocket.android.rocket;
|
|||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.sf.openrocket.R;
|
||||||
|
import net.sf.openrocket.android.util.AndroidLogWrapper;
|
||||||
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;
|
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
@ -11,72 +13,68 @@ import android.os.Bundle;
|
|||||||
import com.actionbarsherlock.app.SherlockDialogFragment;
|
import com.actionbarsherlock.app.SherlockDialogFragment;
|
||||||
|
|
||||||
public class MissingMotorDialogFragment extends SherlockDialogFragment {
|
public class MissingMotorDialogFragment extends SherlockDialogFragment {
|
||||||
|
|
||||||
private final static String MESSAGE_ARG_KEY = "message";
|
private final static String MESSAGES_ARG_KEY = "messages";
|
||||||
|
|
||||||
public static MissingMotorDialogFragment newInstance( Set<ThrustCurveMotorPlaceholder> missingMotors ) {
|
public static MissingMotorDialogFragment newInstance( Set<ThrustCurveMotorPlaceholder> missingMotors ) {
|
||||||
MissingMotorDialogFragment frag = new MissingMotorDialogFragment();
|
MissingMotorDialogFragment frag = new MissingMotorDialogFragment();
|
||||||
Bundle b = new Bundle();
|
Bundle b = new Bundle();
|
||||||
b.putString(MESSAGE_ARG_KEY, buildMessage(missingMotors));
|
String[] messages = new String[ missingMotors.size() ];
|
||||||
|
int index = 0;
|
||||||
|
for( ThrustCurveMotorPlaceholder m : missingMotors ) {
|
||||||
|
messages[index++] = m.getManufacturer() + " " + m.getDesignation();
|
||||||
|
}
|
||||||
|
b.putStringArray(MESSAGES_ARG_KEY, messages);
|
||||||
frag.setArguments(b);
|
frag.setArguments(b);
|
||||||
|
frag.setCancelable(false);
|
||||||
return frag;
|
return frag;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String buildMessage( Set<ThrustCurveMotorPlaceholder> missingMotors ) {
|
private String buildMessage( String[] missingMotors ) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("The following motors are missing:");
|
sb.append(this.getString(R.string.missingMotorsMessageStart));
|
||||||
for( ThrustCurveMotorPlaceholder m : missingMotors ) {
|
for( String m : missingMotors ) {
|
||||||
sb.append("\n").append(m.getManufacturer()).append(" ").append(m.getDesignation());
|
sb.append("\n").append(m);
|
||||||
}
|
}
|
||||||
sb.append("\nWould you like to download them from Thrustcurve?");
|
sb.append("\n").append(this.getString(R.string.missingMotorsMessageEnd));
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setRetainInstance(true);
|
|
||||||
setCancelable(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCancel(DialogInterface dialog) {
|
||||||
|
((OpenRocketLoaderActivity)getActivity()).doNotFixMissingMotors();
|
||||||
|
super.onCancel(dialog);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
|
||||||
String message = getArguments().getString(MESSAGE_ARG_KEY);
|
AndroidLogWrapper.d(MissingMotorDialogFragment.class,"onCreateDialog");
|
||||||
|
|
||||||
|
String[] messages = getArguments().getStringArray(MESSAGES_ARG_KEY);
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
// .setIcon(android.R.drawable.alert_dialog_icon)
|
// .setIcon(android.R.drawable.alert_dialog_icon)
|
||||||
builder.setTitle("Missing Motors");
|
builder.setTitle(R.string.missingMotors);
|
||||||
builder.setMessage(message);
|
builder.setMessage(buildMessage(messages));
|
||||||
builder.setPositiveButton("OK",
|
builder.setPositiveButton(R.string.yes,
|
||||||
new DialogInterface.OnClickListener() {
|
new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
((OpenRocketLoaderActivity)getActivity()).doFixMissingMotors();
|
((OpenRocketLoaderActivity)getActivity()).doFixMissingMotors();
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
);
|
|
||||||
builder.setNegativeButton("Cancel",
|
builder.setNegativeButton(R.string.no,
|
||||||
new DialogInterface.OnClickListener() {
|
new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
((OpenRocketLoaderActivity)getActivity()).doNotFixMissingMotors();
|
((OpenRocketLoaderActivity)getActivity()).doNotFixMissingMotors();
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
);
|
|
||||||
return builder.create();
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.setOwnerActivity(getActivity());
|
||||||
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Work around for dialog getting dismissed on orientation change. See code.google.com/p/android/issues/detail?id=17423
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onDestroyView() {
|
|
||||||
if ( getDialog() != null && getRetainInstance() ) {
|
|
||||||
getDialog().setDismissMessage(null);
|
|
||||||
}
|
|
||||||
super.onDestroyView();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,6 @@ import net.sf.openrocket.android.thrustcurve.TCQueryAction;
|
|||||||
import net.sf.openrocket.android.util.AndroidLogWrapper;
|
import net.sf.openrocket.android.util.AndroidLogWrapper;
|
||||||
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;
|
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;
|
||||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
@ -42,6 +40,12 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
|
|||||||
* Set to the Uri of the file we are supposed to load. Is saved in InstanceState.
|
* Set to the Uri of the file we are supposed to load. Is saved in InstanceState.
|
||||||
*/
|
*/
|
||||||
private Uri fileToLoad = null;
|
private Uri fileToLoad = null;
|
||||||
|
|
||||||
|
protected boolean isLoading() {
|
||||||
|
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading " + this.hashCode());
|
||||||
|
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);
|
||||||
|
return isLoading;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostCreate(Bundle savedInstanceState) {
|
protected void onPostCreate(Bundle savedInstanceState) {
|
||||||
@ -57,7 +61,8 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onSaveInstanceState(Bundle outState) {
|
protected void onSaveInstanceState(Bundle outState) {
|
||||||
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onSaveInstanceState");
|
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onSaveInstanceState " + this.hashCode());
|
||||||
|
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);
|
||||||
outState.putBoolean("isLoading", isLoading);
|
outState.putBoolean("isLoading", isLoading);
|
||||||
if ( fileToLoad != null ) {
|
if ( fileToLoad != null ) {
|
||||||
outState.putParcelable("fileToLoad", fileToLoad);
|
outState.putParcelable("fileToLoad", fileToLoad);
|
||||||
@ -69,6 +74,7 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
|
|||||||
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||||
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onRestoreInstanceState");
|
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onRestoreInstanceState");
|
||||||
isLoading = savedInstanceState.getBoolean("isLoading",false);
|
isLoading = savedInstanceState.getBoolean("isLoading",false);
|
||||||
|
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);
|
||||||
if ( savedInstanceState.containsKey("fileToLoad") ) {
|
if ( savedInstanceState.containsKey("fileToLoad") ) {
|
||||||
fileToLoad = savedInstanceState.getParcelable("fileToLoad");
|
fileToLoad = savedInstanceState.getParcelable("fileToLoad");
|
||||||
}
|
}
|
||||||
@ -164,16 +170,10 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
|
|||||||
* @param result
|
* @param result
|
||||||
*/
|
*/
|
||||||
public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {
|
public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {
|
||||||
isLoading = false;
|
|
||||||
if ( result.loadingError != null ) {
|
if ( result.loadingError != null ) {
|
||||||
|
|
||||||
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
|
ErrorLoadingFileDialogFragment errorDialog = ErrorLoadingFileDialogFragment.newInstance(R.string.loadingErrorMessage, result.loadingError.getLocalizedMessage());
|
||||||
dialogBuilder.setTitle( R.string.loadingErrorMessage );
|
errorDialog.show(getSupportFragmentManager(),"errorDialog");
|
||||||
dialogBuilder.setMessage( result.loadingError.getLocalizedMessage());
|
|
||||||
dialogBuilder.setCancelable(true);
|
|
||||||
Dialog d = dialogBuilder.create();
|
|
||||||
d.setCanceledOnTouchOutside(true);
|
|
||||||
d.show();
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
CurrentRocketHolder.getCurrentRocket().setRocketDocument( result.rocket );
|
CurrentRocketHolder.getCurrentRocket().setRocketDocument( result.rocket );
|
||||||
@ -188,8 +188,8 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
|
|||||||
Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);
|
Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);
|
||||||
|
|
||||||
if ( missingMotors.size() > 0 ) {
|
if ( missingMotors.size() > 0 ) {
|
||||||
DialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );
|
MissingMotorDialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );
|
||||||
getSupportFragmentManager().beginTransaction().add(missingMotorDialog, MISSING_MOTOR_DIAG_FRAGMENT_TAG).commit();
|
missingMotorDialog.show(getSupportFragmentManager(), MISSING_MOTOR_DIAG_FRAGMENT_TAG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,7 +235,13 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
|
|||||||
displayWarningDialog();
|
displayWarningDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void doDismissErrorDialog() {
|
||||||
|
isLoading = false;
|
||||||
|
fileToLoad = null;
|
||||||
|
}
|
||||||
|
|
||||||
public void moveOnToViewer() {
|
public void moveOnToViewer() {
|
||||||
|
isLoading = false;
|
||||||
Intent i = new Intent(this,OpenRocketViewer.class);
|
Intent i = new Intent(this,OpenRocketViewer.class);
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
finish();
|
finish();
|
||||||
|
@ -18,7 +18,9 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
public class OpenRocketLoaderFragment extends Fragment {
|
import com.actionbarsherlock.app.SherlockFragment;
|
||||||
|
|
||||||
|
public class OpenRocketLoaderFragment extends SherlockFragment {
|
||||||
|
|
||||||
private final static String FILE_ARG_KEY = "file";
|
private final static String FILE_ARG_KEY = "file";
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ public class WarningDialogFragment extends DialogFragment {
|
|||||||
WarningDialogFragment frag = new WarningDialogFragment();
|
WarningDialogFragment frag = new WarningDialogFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
frag.setArguments(args);
|
frag.setArguments(args);
|
||||||
|
frag.setCancelable(false);
|
||||||
return frag;
|
return frag;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,11 +36,7 @@ public class WarningDialogFragment extends DialogFragment {
|
|||||||
((OpenRocketLoaderActivity)getActivity()).moveOnToViewer();
|
((OpenRocketLoaderActivity)getActivity()).moveOnToViewer();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
Dialog dialog = builder.create();
|
||||||
public void onCancel(DialogInterface dialog) {
|
return dialog;
|
||||||
((OpenRocketLoaderActivity)getActivity()).moveOnToViewer();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return builder.create();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user