Generate and save code once UI Designer exits

This commit is contained in:
Akash Yadav
2021-12-29 15:58:20 +05:30
parent e1a7211fbf
commit f1340514f6
4 changed files with 1153 additions and 1030 deletions
+1
View File
@@ -5,6 +5,7 @@
<map>
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_github.xml" value="0.21837606837606838" />
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/layout/activity_about.xml" value="0.2" />
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/layout/activity_editor.xml" value="0.20512820512820512" />
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/layout/layout_about_items.xml" value="0.20512820512820512" />
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/menu/menu_editor_nav.xml" value="0.20512820512820512" />
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/common/src/main/res/layout/layout_color_picker.xml" value="0.264" />
@@ -19,6 +19,7 @@ package com.itsaky.androidide;
import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
@@ -50,33 +51,40 @@ import androidx.transition.TransitionManager;
import androidx.transition.TransitionSet;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.ThrowableUtils;
import com.itsaky.androidide.adapters.WidgetGroupItemAdapter;
import com.itsaky.androidide.adapters.WidgetItemAdapter;
import com.itsaky.androidide.app.StudioActivity;
import com.itsaky.androidide.app.StudioApp;
import com.itsaky.androidide.databinding.ActivityDesignerBinding;
import com.itsaky.androidide.fragments.sheets.AttrEditorSheet;
import com.itsaky.androidide.fragments.sheets.ProgressSheet;
import com.itsaky.androidide.models.UIWidget;
import com.itsaky.androidide.models.UIWidgetGroup;
import com.itsaky.androidide.ui.WidgetDragData;
import com.itsaky.androidide.ui.WidgetDragListener;
import com.itsaky.androidide.ui.WidgetDragShadowBuilder;
import com.itsaky.androidide.ui.WidgetTouchListener;
import com.itsaky.androidide.utils.DialogUtils;
import com.itsaky.androidide.utils.Logger;
import com.itsaky.layoutinflater.IAttribute;
import com.itsaky.layoutinflater.IInflateListener;
import com.itsaky.layoutinflater.ILayoutInflater;
import com.itsaky.layoutinflater.IView;
import com.itsaky.layoutinflater.IViewGroup;
import com.itsaky.toaster.Toaster;
import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
import org.jetbrains.annotations.Contract;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
// TODO Generate and save the source code once the user leaves this activity
public class DesignerActivity extends StudioActivity implements WidgetItemAdapter.OnDragStartListener {
private ActivityDesignerBinding mBinding;
@@ -86,6 +94,7 @@ public class DesignerActivity extends StudioActivity implements WidgetItemAdapte
private AttrEditorSheet mEditorSheet;
public static final String KEY_LAYOUT_PATH = "designer_layoutPath";
public static final String KEY_GENERATED_CODE = "designer_xmlCode";
public static final String DRAGGING_WIDGET_TAG = "DRAGGING_WIDGET";
public static final String DRAGGING_WIDGET_MIME = "application/ide_widget";
@@ -187,6 +196,56 @@ public class DesignerActivity extends StudioActivity implements WidgetItemAdapte
@Override
public void onBackPressed () {
// When the user presses the back button, set the activity result and finish this activity
final var progress = new ProgressSheet ();
progress.setSubMessageEnabled (true);
progress.setShowTitle (false);
progress.setMessage (getString (R.string.title_generating_xml));
progress.setSubMessage (getString (R.string.please_wait));
progress.show (getSupportFragmentManager (), "generate_code_progress");
final var future = CompletableFutures.computeAsync (cancelChecker -> inflatedRoot.generateCode ());
future.whenComplete ((s, throwable) -> {
progress.dismiss ();
if (future.isCompletedExceptionally () && throwable != null) {
notifyXmlGenerationFailed (throwable);
return;
}
try {
finishWithResult (future.get ());
} catch (ExecutionException | InterruptedException e) {
notifyXmlGenerationFailed (e);
}
});
}
private void notifyXmlGenerationFailed (Throwable error) {
final var errorMessage = getString (R.string.msg_generate_xml_failed);
LOG.error (errorMessage, error);
final var dialog = DialogUtils.newYesNoDialog (this,
getString(R.string.title_code_generation_failed),
getString(R.string.msg_code_generation_failed),
(dialog1, which) -> finishWithError (),
(dialog1, which) -> dialog1.dismiss ())
.show ();
}
private void finishWithResult (String result) {
final var intent = new Intent ();
intent.putExtra (KEY_GENERATED_CODE, result);
setResult (RESULT_OK, intent);
finish ();
}
private void finishWithError () {
final var intent = new Intent ();
setResult (-123, intent);
finish ();
}
@@ -208,7 +267,7 @@ public class DesignerActivity extends StudioActivity implements WidgetItemAdapte
} catch (Throwable e) {
e.printStackTrace ();
}
super.onDestroy ();
}
@@ -325,7 +384,7 @@ public class DesignerActivity extends StudioActivity implements WidgetItemAdapte
private View.OnDragListener getOnDragListener (IViewGroup group) {
// WidgetDragListener cannot be reused
// This is because they keep a reference to the view group in which dragged view will be added
return new WidgetDragListener (
this,
group,
@@ -339,7 +398,7 @@ public class DesignerActivity extends StudioActivity implements WidgetItemAdapte
private AttrEditorSheet getAttrEditorSheet () {
return this.mEditorSheet == null
? mEditorSheet = new AttrEditorSheet ()
.setDeletionFailedListener (this::onViewDeletionFailed)
.setDeletionFailedListener (this::onViewDeletionFailed)
: mEditorSheet;
}
File diff suppressed because it is too large Load Diff
+5
View File
@@ -334,5 +334,10 @@
<string name="msg_add_namespace_decl">Add \'%1$s\' namespace declaration</string>
<string name="msg_choose_new_val">Choose new value</string>
<string name="msg_select_one_flag">Please check at least one flag.</string>
<string name="msg_generate_xml_failed">Failed to generate XML code</string>
<string name="title_generating_xml">Generating XML code</string>
<string name="title_code_generation_failed">Code generation failed</string>
<string name="msg_code_generation_failed">Failed to generate XML code. Would you like to exit anyway?</string>
<string name="msg_invalid_designer_result">UI Designer returned invalid result</string>
</resources>