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 . --> - - - - - - - - - - - - - - - - - - - - - - -