diff --git a/.idea/misc.xml b/.idea/misc.xml
index f11f9ee47..8fa14092a 100755
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -13,9 +13,11 @@
+
+
diff --git a/app/src/main/java/com/itsaky/androidide/CrashHandlerActivity.java b/app/src/main/java/com/itsaky/androidide/CrashHandlerActivity.java
index b0944b98b..f0f60abf5 100644
--- a/app/src/main/java/com/itsaky/androidide/CrashHandlerActivity.java
+++ b/app/src/main/java/com/itsaky/androidide/CrashHandlerActivity.java
@@ -33,6 +33,7 @@ import com.blankj.utilcode.util.ClipboardUtils;
import com.itsaky.androidide.app.BaseApplication;
import com.itsaky.androidide.app.StudioActivity;
import com.itsaky.androidide.databinding.ActivityCrashHandlerBinding;
+import com.itsaky.androidide.fragments.CrashReportFragment;
public class CrashHandlerActivity extends StudioActivity {
@@ -50,43 +51,19 @@ public class CrashHandlerActivity extends StudioActivity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
- binding.closeButton.setOnClickListener (v -> finishAffinity ());
final var extra = getIntent ().getExtras ();
if (extra == null) {
- binding.closeButton.performClick ();
+ finishAffinity ();
return;
}
- final var report = buildReportText (extra.getString (TRACE_KEY, "Unable to get logs."));
- binding.logText.setText (report);
- binding.reportButton.setOnClickListener (v -> reportTrace (report));
- }
-
- private void reportTrace (String report) {
- ClipboardUtils.copyText ("AndroidIDE CrashLog", report);
- final var url = BaseApplication.GITHUB_URL.concat ("/issues");
- final var intent = new Intent ();
- intent.setAction(Intent.ACTION_VIEW);
- intent.setData (Uri.parse (url));
- intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity (intent);
- }
-
- @NonNull
- private String buildReportText (String trace) {
- return "AndroidIDE crash report\n" +
- "Manufacturer: " +
- getManufacturer () +
- "\n" +
- "Device: " +
- getModel () +
- "\n" +
- "App version: " +
- getAppVersionName () +
- " (" +
- getAppVersionCode () +
- ")\n\n Stacktrace: \n" +
- trace;
+ final var report = extra.getString (TRACE_KEY, "Unable to get logs.");
+ final var fragment = CrashReportFragment.newInstance (report);
+
+ getSupportFragmentManager ().beginTransaction ()
+ .replace (binding.getRoot ().getId (), fragment, "crash_report_fragment")
+ .addToBackStack (null)
+ .commit ();
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/itsaky/androidide/TerminalActivity.java b/app/src/main/java/com/itsaky/androidide/TerminalActivity.java
index c4fe341af..1bff48f00 100755
--- a/app/src/main/java/com/itsaky/androidide/TerminalActivity.java
+++ b/app/src/main/java/com/itsaky/androidide/TerminalActivity.java
@@ -21,17 +21,22 @@ package com.itsaky.androidide;
import static com.itsaky.androidide.utils.Environment.*;
+import android.graphics.Typeface;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.Button;
+import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import com.blankj.utilcode.util.ClipboardUtils;
import com.blankj.utilcode.util.KeyboardUtils;
import com.blankj.utilcode.util.SizeUtils;
+import com.blankj.utilcode.util.ThrowableUtils;
import com.itsaky.androidide.app.StudioActivity;
import com.itsaky.androidide.databinding.ActivityTerminalBinding;
+import com.itsaky.androidide.fragments.CrashReportFragment;
import com.itsaky.androidide.fragments.sheets.ProgressSheet;
import com.itsaky.androidide.managers.PreferenceManager;
import com.itsaky.androidide.models.ConstantsBridge;
@@ -57,8 +62,10 @@ import java.util.Map;
import org.json.JSONException;
import android.os.Bundle;
+import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
public class TerminalActivity extends StudioActivity {
@@ -113,13 +120,7 @@ public class TerminalActivity extends StudioActivity {
if (future.isCompletedExceptionally () || throwable != null) {
LOG.error ("Future has been completed exceptionally.");
-
- final var builder = DialogUtils.newMaterialDialogBuilder (TerminalActivity.this);
- builder.setTitle (getString (R.string.title_installation_failed));
- builder.setMessage (getString (R.string.msg_installation_error, throwable.getMessage ()));
- builder.setPositiveButton (android.R.string.ok, null);
- builder.setCancelable (false);
- builder.show ();
+ showInstallationError (throwable);
return;
}
@@ -129,6 +130,22 @@ public class TerminalActivity extends StudioActivity {
}
}
+ private void showInstallationError (Throwable throwable) {
+
+ binding.virtualKeyTable.setVisibility (View.GONE);
+
+ final var frag = CrashReportFragment.newInstance (
+ getString (R.string.title_installation_failed),
+ getString (R.string.msg_bootstrap_installation_error),
+ ThrowableUtils.getFullStackTrace (throwable))
+ .setCloseAppOnClick (false);
+
+ getSupportFragmentManager ().beginTransaction ()
+ .replace (binding.root.getId (), frag, "bootstrap_install_error_fragment")
+ .addToBackStack (null)
+ .commit ();
+ }
+
private void setupTerminalView () {
terminal = new TerminalView (this, null);
terminal.setTerminalViewClient (client);
diff --git a/app/src/main/java/com/itsaky/androidide/fragments/CrashReportFragment.java b/app/src/main/java/com/itsaky/androidide/fragments/CrashReportFragment.java
new file mode 100644
index 000000000..88afaa898
--- /dev/null
+++ b/app/src/main/java/com/itsaky/androidide/fragments/CrashReportFragment.java
@@ -0,0 +1,149 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+package com.itsaky.androidide.fragments;
+
+import static com.blankj.utilcode.util.AppUtils.getAppVersionCode;
+import static com.blankj.utilcode.util.AppUtils.getAppVersionName;
+import static com.blankj.utilcode.util.DeviceUtils.getManufacturer;
+import static com.blankj.utilcode.util.DeviceUtils.getModel;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.blankj.utilcode.util.ClipboardUtils;
+import com.itsaky.androidide.R;
+import com.itsaky.androidide.app.BaseApplication;
+import com.itsaky.androidide.databinding.LayoutCrashReportBinding;
+
+public class CrashReportFragment extends Fragment {
+
+ private LayoutCrashReportBinding binding;
+ private boolean closeAppOnClick = true;
+
+ public static final String KEY_TITLE = "crash_title";
+ public static final String KEY_MESSAGE = "crash_message";
+ public static final String KEY_TRACE = "crash_trace";
+
+ @NonNull
+ public static CrashReportFragment newInstance (@NonNull final String trace) {
+ return CrashReportFragment.newInstance (null, null, trace);
+ }
+
+ @NonNull
+ public static CrashReportFragment newInstance (@Nullable final String title, @Nullable final String message, @NonNull final String trace) {
+ final var frag = new CrashReportFragment ();
+ final var args = new Bundle ();
+
+ args.putString (KEY_TRACE, trace);
+
+ if (title != null) {
+ args.putString (KEY_TITLE, title);
+ }
+
+ if (message != null) {
+ args.putString (KEY_MESSAGE, message);
+ }
+
+ frag.setArguments (args);
+ return frag;
+ }
+
+ public CrashReportFragment setCloseAppOnClick (boolean closeAppOnClick) {
+ this.closeAppOnClick = closeAppOnClick;
+ return this;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView (@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return (binding = LayoutCrashReportBinding.inflate (inflater, container, false)).getRoot ();
+ }
+
+ @Override
+ public void onViewCreated (@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated (view, savedInstanceState);
+
+ final var args = requireArguments ();
+ var title = getString (R.string.msg_ide_crashed);
+ var message = getString (R.string.msg_report_crash);
+ var trace = "";
+ if (args.containsKey (KEY_TITLE)) {
+ title = args.getString (KEY_TITLE);
+ }
+
+ if (args.containsKey (KEY_MESSAGE)) {
+ message = args.getString (KEY_MESSAGE);
+ }
+
+ if (args.containsKey (KEY_TRACE)) {
+ trace = args.getString (KEY_TRACE);
+ trace = buildReportText (trace);
+ } else {
+ trace = "No stack strace was provided for the report";
+ }
+
+ binding.crashTitle.setText (title);
+ binding.crashSubtitle.setText (message);
+ binding.logText.setText (trace);
+
+ final var report = trace;
+ binding.closeButton.setOnClickListener (v -> {
+ if (closeAppOnClick) {
+ requireActivity ().finishAffinity ();
+ } else {
+ requireActivity ().finish ();
+ }
+ });
+ binding.reportButton.setOnClickListener (v -> reportTrace (report));
+ }
+
+ private void reportTrace (String report) {
+ ClipboardUtils.copyText ("AndroidIDE CrashLog", report);
+
+ final var url = BaseApplication.GITHUB_URL.concat ("/issues");
+ final var intent = new Intent ();
+ intent.setAction(Intent.ACTION_VIEW);
+ intent.setData (Uri.parse (url));
+ intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity (intent);
+ }
+
+ @NonNull
+ private String buildReportText (String trace) {
+ return "AndroidIDE crash report\n" +
+ "Manufacturer: " +
+ getManufacturer () +
+ "\n" +
+ "Device: " +
+ getModel () +
+ "\n" +
+ "App version: " +
+ getAppVersionName () +
+ " (" +
+ getAppVersionCode () +
+ ")\n\n Stacktrace: \n" +
+ trace;
+ }
+}
diff --git a/app/src/main/res/layout/activity_crash_handler.xml b/app/src/main/res/layout/activity_crash_handler.xml
index 815bcb359..7f49b1383 100644
--- a/app/src/main/res/layout/activity_crash_handler.xml
+++ b/app/src/main/res/layout/activity_crash_handler.xml
@@ -15,117 +15,12 @@
~ You should have received a copy of the GNU General Public License
~ along with AndroidIDE. If not, see .
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_terminal.xml b/app/src/main/res/layout/activity_terminal.xml
index 9e30d2eb6..3be1ddca7 100755
--- a/app/src/main/res/layout/activity_terminal.xml
+++ b/app/src/main/res/layout/activity_terminal.xml
@@ -1,6 +1,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ec4a678db..958a0283c 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -347,6 +347,6 @@
Click on the button below to copy log and open issues page.
Copy and report
Reading bootstrap archiveā¦
- Installation error was: %s
+ Bootstrap installation failed with the following exception.