mirror of
https://gitee.com/zhangsken/AndroidIDE.git
synced 2026-10-16 07:49:44 +08:00
Fixed some bugs/mistakes
- Changed color of ActionMode's Overflow menu icon to match other icons - 'chmod' to $HOME command should not be shown to user - Remove logging from StudioApp - Fixed icon of 'Code navigation' - Use AppCompat method to start ActionMode - Forcibly show icon of menu items
This commit is contained in:
@@ -17,7 +17,11 @@ import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.LinearLayout;
|
||||
import androidx.appcompat.app.ActionBarDrawerToggle;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.view.menu.MenuBuilder;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.GravityCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
@@ -48,6 +52,7 @@ import com.itsaky.androidide.app.StudioActivity;
|
||||
import com.itsaky.androidide.databinding.ActivityEditorBinding;
|
||||
import com.itsaky.androidide.databinding.LayoutCreateFileJavaBinding;
|
||||
import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding;
|
||||
import com.itsaky.androidide.databinding.LayoutSearchProjectBinding;
|
||||
import com.itsaky.androidide.fragments.EditorFragment;
|
||||
import com.itsaky.androidide.fragments.FileTreeFragment;
|
||||
import com.itsaky.androidide.fragments.sheets.OptionsListFragment;
|
||||
@@ -72,6 +77,7 @@ import com.itsaky.androidide.utils.Environment;
|
||||
import com.itsaky.androidide.utils.Logger;
|
||||
import com.itsaky.androidide.utils.PreferenceManager;
|
||||
import com.itsaky.androidide.utils.ProjectWriter;
|
||||
import com.itsaky.androidide.utils.RecursiveFileSearcher;
|
||||
import com.itsaky.androidide.utils.Symbols;
|
||||
import com.itsaky.androidide.utils.TypefaceUtils;
|
||||
import com.itsaky.androidide.utils.VersionedFileManager;
|
||||
@@ -115,11 +121,6 @@ import java.util.Stack;
|
||||
import java.util.regex.Pattern;
|
||||
import me.piruin.quickaction.ActionItem;
|
||||
import me.piruin.quickaction.QuickAction;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import com.itsaky.androidide.databinding.LayoutSearchProjectBinding;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.LinearLayout;
|
||||
import com.itsaky.androidide.utils.RecursiveFileSearcher;
|
||||
|
||||
public class EditorActivity extends StudioActivity implements FileTreeFragment.FileActionListener,
|
||||
IDEService.BuildListener,
|
||||
@@ -258,7 +259,7 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
|
||||
GradientDrawable gd = new GradientDrawable();
|
||||
gd.setShape(GradientDrawable.RECTANGLE);
|
||||
gd.setColor(0xff212121);
|
||||
gd.setStroke(2, 0xffffffff);
|
||||
gd.setStroke(1, 0xffffffff);
|
||||
gd.setCornerRadius(8);
|
||||
mBinding.symbolText.setBackgroundDrawable(gd);
|
||||
mBinding.symbolText.setVisibility(View.GONE);
|
||||
@@ -445,8 +446,13 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
if(menu instanceof MenuBuilder){
|
||||
MenuBuilder builder = (MenuBuilder) menu;
|
||||
builder.setOptionalIconsVisible(true);
|
||||
}
|
||||
getMenuInflater().inflate(R.menu.menu_editor, menu);
|
||||
return true;
|
||||
}
|
||||
@@ -532,6 +538,7 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
|
||||
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
|
||||
builder.setTitle(R.string.menu_find_project);
|
||||
builder.setView(binding.getRoot());
|
||||
builder.setCancelable(false);
|
||||
builder.setPositiveButton(R.string.menu_find, (dialog, which) -> {
|
||||
final String text = binding.input.getEditText().getText().toString().trim();
|
||||
if(text == null || text.isEmpty()) {
|
||||
@@ -1838,6 +1845,11 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
|
||||
p.textDocument = id;
|
||||
didClose(p);
|
||||
|
||||
if(mPagerAdapter.getCount() <= 0) {
|
||||
mCurrentFragment = null;
|
||||
mCurrentFile = null;
|
||||
}
|
||||
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ public class StudioApp extends MultiDexApplication
|
||||
extractLogsenderIfNeeded();
|
||||
extractCleanerIfNeeded();
|
||||
|
||||
newShell(line -> handleLog(line)).bgAppend("androidide-cleaner && logcat -v threadtime");
|
||||
// newShell(line -> handleLog(line)).bgAppend("androidide-cleaner && logcat -v threadtime");
|
||||
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
createNotificationChannels();
|
||||
|
||||
@@ -58,7 +58,7 @@ public class ShellServer extends Thread {
|
||||
append(stringBuilder.toString(), false);
|
||||
|
||||
// Make sure there are proper permissions set to the $HOME directory
|
||||
append("chmod -R 777 $HOME");
|
||||
append("chmod -R 777 $HOME", false);
|
||||
} catch (Throwable th) {
|
||||
if (callback != null) {
|
||||
String out = ThrowableUtils.getFullStackTrace(th).concat("\n");
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
package io.github.rosemoe.editor.widget;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
@@ -35,9 +34,9 @@ import android.text.InputType;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.MutableInt;
|
||||
import android.util.TypedValue;
|
||||
import android.view.ActionMode;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
@@ -50,16 +49,22 @@ import android.view.inputmethod.ExtractedText;
|
||||
import android.view.inputmethod.ExtractedTextRequest;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.OverScroller;
|
||||
import android.widget.SearchView;
|
||||
import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.Px;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.appcompat.view.menu.MenuBuilder;
|
||||
import com.blankj.utilcode.util.ThrowableUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.itsaky.androidide.R;
|
||||
import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding;
|
||||
import com.itsaky.androidide.interfaces.JLSRequestor;
|
||||
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE;
|
||||
import com.itsaky.androidide.utils.Logger;
|
||||
import com.itsaky.androidide.utils.TypefaceUtils;
|
||||
import com.itsaky.androidide.utils.VersionedFileManager;
|
||||
import com.itsaky.lsp.Diagnostic;
|
||||
@@ -67,7 +72,11 @@ import com.itsaky.lsp.DiagnosticSeverity;
|
||||
import com.itsaky.lsp.DidChangeTextDocumentParams;
|
||||
import com.itsaky.lsp.Position;
|
||||
import com.itsaky.lsp.Range;
|
||||
import com.itsaky.lsp.ReferenceContext;
|
||||
import com.itsaky.lsp.ReferenceParams;
|
||||
import com.itsaky.lsp.TextDocumentContentChangeEvent;
|
||||
import com.itsaky.lsp.TextDocumentIdentifier;
|
||||
import com.itsaky.lsp.TextDocumentPositionParams;
|
||||
import com.itsaky.lsp.VersionedTextDocumentIdentifier;
|
||||
import io.github.rosemoe.editor.interfaces.EditorEventListener;
|
||||
import io.github.rosemoe.editor.interfaces.EditorLanguage;
|
||||
@@ -96,15 +105,6 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import com.itsaky.androidide.utils.Logger;
|
||||
import com.blankj.utilcode.util.ThrowableUtils;
|
||||
import com.itsaky.lsp.TextDocumentPositionParams;
|
||||
import com.itsaky.lsp.TextDocumentIdentifier;
|
||||
import com.itsaky.lsp.ReferenceParams;
|
||||
import com.itsaky.lsp.ReferenceContext;
|
||||
import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding;
|
||||
import android.view.LayoutInflater;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
/**
|
||||
* CodeEditor is a editor that can highlight text regions by doing basic syntax analyzing
|
||||
@@ -2966,17 +2966,22 @@ public class CodeEditor extends View implements ContentListener, TextAnalyzer.Ca
|
||||
*/
|
||||
public void beginSearchMode() {
|
||||
class SearchActionMode implements ActionMode.Callback {
|
||||
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
@Override
|
||||
public boolean onCreateActionMode(ActionMode p1, Menu p2) {
|
||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
||||
mStartedActionMode = ACTION_MODE_SEARCH_TEXT;
|
||||
p2.add(0, 1, 0, R.string.last)
|
||||
if(menu instanceof MenuBuilder){
|
||||
MenuBuilder builder = (MenuBuilder) menu;
|
||||
builder.setOptionalIconsVisible(true);
|
||||
}
|
||||
menu.add(0, 1, 0, R.string.last)
|
||||
.setIcon(R.drawable.ic_search_last)
|
||||
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||
p2.add(0, 0, 0, R.string.next)
|
||||
menu.add(0, 0, 0, R.string.next)
|
||||
.setIcon(R.drawable.ic_search_next)
|
||||
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||
p2.add(0, 2, 0, R.string.replace)
|
||||
menu.add(0, 2, 0, R.string.replace)
|
||||
.setIcon(R.drawable.ic_search_replace)
|
||||
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||
SearchView sv = new SearchView(getContext());
|
||||
@@ -2995,7 +3000,7 @@ public class CodeEditor extends View implements ContentListener, TextAnalyzer.Ca
|
||||
}
|
||||
|
||||
});
|
||||
p1.setCustomView(sv);
|
||||
mode.setCustomView(sv);
|
||||
sv.performClick();
|
||||
sv.setQueryHint(getContext().getString(R.string.text_to_search));
|
||||
sv.setIconifiedByDefault(false);
|
||||
@@ -3050,7 +3055,7 @@ public class CodeEditor extends View implements ContentListener, TextAnalyzer.Ca
|
||||
|
||||
}
|
||||
ActionMode.Callback callback = new SearchActionMode();
|
||||
startActionMode(callback);
|
||||
((AppCompatActivity) getContext()).startSupportActionMode(callback);
|
||||
}
|
||||
|
||||
public EditorTouchEventHandler getEventHandler() {
|
||||
|
||||
+40
-14
@@ -15,12 +15,14 @@
|
||||
*/
|
||||
package io.github.rosemoe.editor.widget;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.res.TypedArray;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.appcompat.view.menu.MenuBuilder;
|
||||
import io.github.rosemoe.editor.util.IntPair;
|
||||
|
||||
/**
|
||||
@@ -36,16 +38,21 @@ class EditorTextActionModeStarter implements CodeEditor.EditorTextActionPresente
|
||||
EditorTextActionModeStarter(CodeEditor editor) {
|
||||
mEditor = editor;
|
||||
}
|
||||
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
@Override
|
||||
public void onBeginTextSelect() {
|
||||
if (mActionMode != null) {
|
||||
return;
|
||||
}
|
||||
mActionMode = mEditor.startActionMode(new ActionMode.Callback() {
|
||||
mActionMode = ((AppCompatActivity) mEditor.getContext()).startSupportActionMode(new ActionMode.Callback() {
|
||||
@Override
|
||||
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
|
||||
mEditor.mStartedActionMode = CodeEditor.ACTION_MODE_SELECT_TEXT;
|
||||
if(menu instanceof MenuBuilder){
|
||||
MenuBuilder builder = (MenuBuilder) menu;
|
||||
builder.setOptionalIconsVisible(true);
|
||||
}
|
||||
actionMode.setTitle(android.R.string.selectTextMode);
|
||||
TypedArray array = mEditor.getContext().getTheme().obtainStyledAttributes(new int[]{
|
||||
android.R.attr.actionModeSelectAllDrawable,
|
||||
@@ -55,36 +62,55 @@ class EditorTextActionModeStarter implements CodeEditor.EditorTextActionPresente
|
||||
});
|
||||
|
||||
menu.add(0, 0, 0, mEditor.getContext().getString(android.R.string.selectAll))
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(0));
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(0));
|
||||
|
||||
menu.add(0, 1, 0, mEditor.getContext().getString(android.R.string.cut))
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(1));
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(1));
|
||||
|
||||
menu.add(0, 2, 0, mEditor.getContext().getString(android.R.string.copy))
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(2));
|
||||
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(2));
|
||||
|
||||
menu.add(0, 3, 0, mEditor.getContext().getString(android.R.string.paste))
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(3));
|
||||
.setShowAsActionFlags(2)
|
||||
.setIcon(array.getDrawable(3));
|
||||
|
||||
menu.add(0, 4, 0, mEditor.getContext().getString(com.itsaky.androidide.R.string.menu_navigate_definition))
|
||||
.setIcon(com.itsaky.androidide.R.drawable.ic_goto_definition);
|
||||
|
||||
menu.add(0, 5, 0, mEditor.getContext().getString(com.itsaky.androidide.R.string.menu_navigate_references))
|
||||
.setIcon(com.itsaky.androidide.R.drawable.ic_find_references);
|
||||
|
||||
menu.add(0, 6, 0, mEditor.getContext().getString(com.itsaky.androidide.R.string.menu_comment_line))
|
||||
.setIcon(com.itsaky.androidide.R.drawable.ic_comment_line);
|
||||
|
||||
menu.add(0, 7, 0, mEditor.getContext().getString(com.itsaky.androidide.R.string.menu_uncomment_line))
|
||||
.setIcon(com.itsaky.androidide.R.drawable.ic_uncomment_line);
|
||||
|
||||
array.recycle();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
|
||||
return false;
|
||||
if(mEditor.getFile() == null) return false;
|
||||
|
||||
final String name = mEditor.getFile().getName();
|
||||
final boolean isJava = name.endsWith(".java") || name.endsWith(".gradle");
|
||||
final boolean isXml = name.endsWith(".xml");
|
||||
final MenuItem def = menu.findItem(4);
|
||||
final MenuItem ref = menu.findItem(5);
|
||||
final MenuItem comment = menu.findItem(6);
|
||||
final MenuItem uncomment = menu.findItem(7);
|
||||
|
||||
def.setEnabled(isJava).getIcon().setAlpha(isJava ? 255 : 76);
|
||||
ref.setEnabled(isJava).getIcon().setAlpha(isJava ? 255 : 76);
|
||||
comment.setEnabled(isJava || isXml).getIcon().setAlpha(isJava || isXml ? 255 : 76);
|
||||
uncomment.setEnabled(isJava || isXml).getIcon().setAlpha(isJava || isXml ? 255 : 76);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M14.6,16.6L19.2,12L14.6,7.4L16,6L22,12L16,18L14.6,16.6M9.4,16.6L4.8,12L9.4,7.4L8,6L2,12L8,18L9.4,16.6Z"/>
|
||||
|
||||
</vector>
|
||||
@@ -106,7 +106,7 @@
|
||||
android:title="@string/save"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:icon="@drawable/ic_navigation"
|
||||
android:icon="@drawable/ic_code"
|
||||
android:id="@+id/menuEditor_navigate"
|
||||
android:title="@string/menu_navigate"
|
||||
app:showAsAction="ifRoom">
|
||||
|
||||
@@ -1,19 +1,24 @@
|
||||
<resources>
|
||||
<style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar">
|
||||
<item name="actionOverflowButtonStyle">@style/AppTheme.Toolbar.OverflowButton</item>
|
||||
<item name="colorPrimary">@color/primaryColor</item>
|
||||
<item name="colorPrimaryDark">@color/primaryDarkColor</item>
|
||||
<item name="colorAccent">@color/secondaryColor</item>
|
||||
<item name="colorButtonNormal">@color/secondaryColor</item>
|
||||
<item name="android:colorButtonNormal">@color/secondaryColor</item>
|
||||
<item name="android:textColorSecondary">@color/secondaryTextColor</item>
|
||||
<item name="colorControlNormal">@color/secondaryColor</item>
|
||||
<item name="colorControlHighlight">@color/rippleHighlightColor</item>
|
||||
<item name="android:fontFamily">@font/josefin_sans</item>
|
||||
<item name="fontFamily">@font/josefin_sans</item>
|
||||
<item name="hintTextColor">@color/secondaryColor</item>
|
||||
<item name="shapeAppearanceLargeComponent">@style/AppTheme.ShapeOverlay.Large</item>
|
||||
<item name="windowActionModeOverlay">true</item>
|
||||
<item name="windowActionBarOverlay">true</item>
|
||||
<item name="fontFamily">@font/josefin_sans</item>
|
||||
<item name="shapeAppearanceLargeComponent">@style/AppTheme.ShapeOverlay.Large</item>
|
||||
<item name="android:windowBackground">@color/content_background</item>
|
||||
<item name="android:colorButtonNormal">@color/secondaryColor</item>
|
||||
<item name="android:textColorSecondary">@color/secondaryTextColor</item>
|
||||
<item name="android:windowBackground">@color/content_background</item>
|
||||
<item name="android:fontFamily">@font/josefin_sans</item>
|
||||
</style>
|
||||
<style name="AppTheme.Toolbar.OverflowButton" parent="@style/Widget.AppCompat.ActionButton.Overflow">
|
||||
<item name="android:tint">@color/secondaryColor</item>
|
||||
</style>
|
||||
<style name="AppTheme.MaterialToggleButton" parent="">
|
||||
<item name="colorPrimary">@color/secondaryColor</item>
|
||||
|
||||
Reference in New Issue
Block a user