👨‍💻 Squircle IDE is a fast and free multi-language code editor for Android

Overview

Squircle IDE

Squircle IDE is a fast and free multi-language code editor for Android.

Android CI License


Table of Contents

EditorKit

  1. Gradle Dependency
  2. The Basics
  3. More Options
    1. Configuration
    2. Text Scroller
  4. Code Suggestions
  5. Undo Redo
  6. Navigation
    1. Text Navigation
    2. Find and Replace
    3. Shortcuts
  7. Theming
  8. Custom Plugin

Languages

  1. Gradle Dependency
  2. Custom Language
    1. LanguageParser
    2. SuggestionProvider
    3. LanguageStyler

EditorKit

The editorkit module provides code editor without any support for programming languages.
If you are upgrading from any older version, please have a look at the migration guide.
Please note that this library only supports Kotlin.

MavenCentral

Gradle Dependency

Add this to your module's build.gradle file:

dependencies {
  ...
  implementation 'com.blacksquircle.ui:editorkit:2.2.0'
}

The editorkit module does not provide support for syntax highlighting, you need to add specific language dependency. You can see list of available languages here.


The Basics

First, you need to add TextProcessor in your layout:

">
<com.blacksquircle.ui.editorkit.widget.TextProcessor
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top|start"
    android:id="@+id/editor" />

Second, you need to provide a Language object to support syntax highlighting by using following code:

val editor = findViewById<TextProcessor>(R.id.editor)

editor.language = JavaScriptLanguage() // or any other language you want

Third, you need to call setTextContent to set the text. Don't use the default setText method.

editor.setTextContent("your code here")

Also you might want to use setTextContent(PrecomputedTextCompat) if you're working with large text files.

Finally, after you set the text you need to clear undo/redo history because you don't want to keep the change history of previous file:

import com.blacksquircle.ui.editorkit.model.UndoStack

editor.undoStack = UndoStack()
editor.redoStack = UndoStack()

Now you can begin using the code editor.


More Options

Configuration

You can change the default code editor behavior by using Plugin DSL as shown below:

val pluginSupplier = PluginSupplier.create {
    pinchZoom { // whether the zoom gesture enabled
        minTextSize = 10f
        maxTextSize = 20f 
    }
    lineNumbers {
        lineNumbers = true // line numbers visibility
        highlightCurrentLine = true // whether the current line will be highlighted
    }
    highlightDelimiters() // highlight open/closed brackets beside the cursor
    autoIndentation {
        autoIndentLines = true // whether the auto indentation enabled
        autoCloseBrackets = true // automatically close open parenthesis/bracket/brace
        autoCloseQuotes = true // automatically close single/double quote when typing
    }
}
editor.plugins(pluginSupplier)

To enable/disable plugins in runtime, surround necessary methods with if (enabled) { ... } operator:

val pluginSupplier = PluginSupplier.create {
    if (preferences.isLineNumbersEnabled) {
        lineNumbers()
    }
    if (preferences.isPinchZoomEnabled) {
        pinchZoom()
    }
    // ...
}
editor.plugins(pluginSupplier)

Remember: everytime you call editor.plugins(pluginSupplier) it compares current plugin list with the new one, and then detaches plugins that doesn't exists in the PluginSupplier.

Text Scroller

To attach the text scroller you need to add TextScroller in layout:

">
<com.blacksquircle.ui.editorkit.widget.TextScroller
    android:layout_width="30dp"
    android:layout_height="match_parent"
    android:id="@+id/scroller"
    app:thumbNormal="@drawable/fastscroll_normal"
    app:thumbDragging="@drawable/fastscroll_pressed"
    app:thumbTint="@color/blue" />

Now you need to pass a reference to a view inside attachTo method:

val editor = findViewById<TextProcessor>(R.id.editor)
val scroller = findViewById<TextScroller>(R.id.scroller)

scroller.attachTo(editor)

// or using Plugin DSL:

val pluginSupplier = PluginSupplier.create {
    ...
    textScroller {
        scroller = findViewById<TextScroller>(R.id.scroller)
    }
}

Code Suggestions

When you working with a code editor you want to see the list of code suggestion. (Note that you have to provide a Language object before start using it.)

First, you need to create a layout file that will represent the suggestion item inside dropdown menu:

">

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:padding="6dp"
    android:textSize="12sp"
    android:typeface="monospace"
    android:id="@+id/title" />

Second, you need to create custom SuggestionAdapter:

class AutoCompleteAdapter(context: Context) : SuggestionAdapter(context, R.layout.item_suggestion) {

    override fun createViewHolder(parent: ViewGroup): SuggestionViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val view = inflater.inflate(R.layout.item_suggestion, parent, false)
        return AutoCompleteViewHolder(view)
    }
    
    class AutoCompleteViewHolder(itemView: View) : SuggestionViewHolder(itemView) {
    
        private val title: TextView = itemView.findViewById(R.id.title)
        
        override fun bind(suggestion: Suggestion?, query: String) {
            title.text = suggestion?.text
        }
    }
}

Third, enable the code completion plugin and set SuggestionAdapter:

val pluginSupplier = PluginSupplier.create {
    ...
    codeCompletion {
        suggestionAdapter = AutoCompleteAdapter(this)
    }
}

UPD: If you having an issues with the popup position (e.g vertical offset), this might be solved by explicitly setting android:dropDownAnchor in XML.


Undo Redo

The TextProcessor supports undo/redo operations, but remember that you must check the ability to undo/redo before calling actual methods:

// Undo
if (editor.canUndo()) {
    editor.undo()
}

// Redo
if (editor.canRedo()) {
    editor.redo()
}

Also you may have a use case when you want to update undo/redo buttons visibility or other UI after the text replacements is done, this can be achieved by adding OnUndoRedoChangedListener:

editor.onUndoRedoChangedListener = object : OnUndoRedoChangedListener {
    override fun onUndoRedoChanged() {
        val canUndo = editor.canUndo()
        val canRedo = editor.canRedo()
        
        // ...
    }
}

Navigation

Text Navigation

You can use these extension methods to navigate in text:

editor.moveCaretToStartOfLine()
editor.moveCaretToEndOfLine()
editor.moveCaretToPrevWord()
editor.moveCaretToNextWord()

...or use «Go to Line» feature to place the caret at the specific line:

import com.blacksquircle.ui.editorkit.exception.LineException

try {
    editor.gotoLine(lineNumber)
} catch (e: LineException) {
    Toast.makeText(this, "Line does not exists", Toast.LENGTH_SHORT).show()
}

Find and Replace

The TextProcessor has built-in support for search and replace operations, including:

  • Search forward or backward
  • Regular Expressions
  • Match Case
  • Words Only

The class itself contains self-explanatory methods for all your searching needs:

  • find(params) - Find all possible results in text with provided options.
  • replaceFindResult(replaceText) - Finds current match and replaces it with new text.
  • replaceAllFindResults(replaceText) - Finds all matches and replaces them with the new text.
  • findNext() - Finds the next match and scrolls to it.
  • findPrevious() - Finds the previous match and scrolls to it.
  • clearFindResultSpans() - Clears all find spans on the screen. Call this method when you're done searching.
import com.blacksquircle.ui.editorkit.model.FindParams

val params = FindParams(
    query = "function", // text to find
    regex = false, // regular expressions
    matchCase = true, // case sensitive
    wordsOnly = true // words only
)

editor.find(params)

// To navigate between results use findNext() and findPrevious()

Shortcuts

If you're using bluetooth keyboard you probably want to use keyboard shortcuts to write your code faster. To support the keyboard shortcuts you need to enable the shortcuts plugin and set OnShortcutListener:

val pluginSupplier = PluginSupplier.create {
    ...
    shortcuts {
        onShortcutListener = object : OnShortcutListener {
            override fun onShortcut(shortcut: Shortcut): Boolean {
                val (ctrl, shift, alt, keyCode) = shortcut
                return when {
                    ctrl && keyCode == KeyEvent.KEYCODE_DPAD_LEFT -> editor.moveCaretToStartOfLine()
                    ctrl && keyCode == KeyEvent.KEYCODE_DPAD_RIGHT -> editor.moveCaretToEndOfLine()
                    alt && keyCode == KeyEvent.KEYCODE_DPAD_LEFT -> editor.moveCaretToPrevWord()
                    alt && keyCode == KeyEvent.KEYCODE_DPAD_RIGHT -> editor.moveCaretToNextWord()
                    // ...
                    else -> false
                }
            }
        }
    }
}

The onShortcut method will be invoked only if at least one of following keys is pressed: ctrl, shift, alt.
You might already noticed that you have to return a Boolean value as the result of onShortcut method. Return true if the listener has consumed the shortcut event, false otherwise.


Theming

The editorkit module includes some default themes in the EditorTheme class:

editor.colorScheme = EditorTheme.DARCULA // default

// or you can use one of these:
EditorTheme.MONOKAI
EditorTheme.OBSIDIAN
EditorTheme.LADIES_NIGHT
EditorTheme.TOMORROW_NIGHT
EditorTheme.VISUAL_STUDIO_2013

You can also write your own theme by changing the ColorScheme properties. The example below shows how you can programmatically load the color scheme:

editor.colorScheme = ColorScheme(
    textColor = Color.parseColor("#C8C8C8"),
    backgroundColor = Color.parseColor("#232323"),
    gutterColor = Color.parseColor("#2C2C2C"),
    gutterDividerColor = Color.parseColor("#555555"),
    gutterCurrentLineNumberColor = Color.parseColor("#FFFFFF"),
    gutterTextColor = Color.parseColor("#C6C8C6"),
    selectedLineColor = Color.parseColor("#141414"),
    selectionColor = Color.parseColor("#454464"),
    suggestionQueryColor = Color.parseColor("#4F98F7"),
    findResultBackgroundColor = Color.parseColor("#1C3D6B"),
    delimiterBackgroundColor = Color.parseColor("#616161"),
    numberColor = Color.parseColor("#BACDAB"),
    operatorColor = Color.parseColor("#DCDCDC"),
    keywordColor = Color.parseColor("#669BD1"),
    typeColor = Color.parseColor("#669BD1"),
    langConstColor = Color.parseColor("#669BD1"),
    preprocessorColor = Color.parseColor("#C49594"),
    variableColor = Color.parseColor("#9DDDFF"),
    methodColor = Color.parseColor("#71C6B1"),
    stringColor = Color.parseColor("#CE9F89"),
    commentColor = Color.parseColor("#6BA455"),
    tagColor = Color.parseColor("#DCDCDC"),
    tagNameColor = Color.parseColor("#669BD1"),
    attrNameColor = Color.parseColor("#C8C8C8"),
    attrValueColor = Color.parseColor("#CE9F89"),
    entityRefColor = Color.parseColor("#BACDAB")
)

Custom Plugin

Since v2.1.0 the EditorKit library supports writing custom plugins to extend it's functionality. If you're using the latest version, you might be familiar with PluginSupplier and know how to use it's DSL. See More Options for info.

First, you need to create a class which extends the EditorPlugin and provide it's id in the constructor:

class CustomPlugin : EditorPlugin("custom-plugin-id") {

    var publicProperty = true

    override fun onAttached(editText: TextProcessor) {
        super.onAttached(editText)
        // TODO enable your feature here
    }
    
    override fun onDetached(editText: TextProcessor) {
        super.onDetached(editText)
        // TODO disable your feature here
    }
}

Second, you can override lifecycle methods, for example afterDraw, which invoked immediately after onDraw(Canvas) in code editor:

class CustomPlugin : EditorPlugin("custom-plugin-id") {
    
    var publicProperty = true
    
    private val dividerPaint = Paint().apply {
        color = Color.GRAY
    }

    override fun afterDraw(canvas: Canvas?) {
        super.afterDraw(canvas)
        if (publicProperty) {
            var i = editText.topVisibleLine
            while (i <= editText.bottomVisibleLine) {
                val startX = editText.paddingStart + editText.scrollX
                val startY = editText.paddingTop + editText.layout.getLineBottom(i)
                val stopX = editText.paddingLeft + editText.layout.width + editText.paddingRight
                val stopY = editText.paddingTop + editText.layout.getLineBottom(i)
                canvas?.drawLine( // draw divider for each visible line
                    startX.toFloat(), startY.toFloat(),
                    stopX.toFloat(), stopY.toFloat(),
                    dividerPaint
                )
                i++
            }
        }
    }
}

Third, create an extension function to improve code readability when adding your plugin to a PluginSupplier:

fun PluginSupplier.lineDividers(block: CustomPlugin.() -> Unit = {}) {
    plugin(CustomPlugin(), block)
}

Finally, you can attach your plugin using DSL:

val pluginSupplier = PluginSupplier.create {
    lineDividers {
        publicProperty = true // whether should draw the dividers
    }
    ...
}
editor.plugins(pluginSupplier)

Languages

The language modules provides support for programming languages. This includes syntax highlighting, code suggestions and source code parser. (Note that source code parser currently works only in language-javascript module, but it will be implemented for more languages in the future)

MavenCentral

Gradle Dependency

Select your language and add it's dependency to your module's build.gradle file:

dependencies {
  ...
  implementation 'com.blacksquircle.ui:language-actionscript:2.2.0'
  implementation 'com.blacksquircle.ui:language-base:2.2.0' // for custom language
  implementation 'com.blacksquircle.ui:language-c:2.2.0'
  implementation 'com.blacksquircle.ui:language-cpp:2.2.0'
  implementation 'com.blacksquircle.ui:language-csharp:2.2.0'
  implementation 'com.blacksquircle.ui:language-groovy:2.2.0'
  implementation 'com.blacksquircle.ui:language-html:2.2.0'
  implementation 'com.blacksquircle.ui:language-java:2.2.0'
  implementation 'com.blacksquircle.ui:language-javascript:2.2.0'
  implementation 'com.blacksquircle.ui:language-json:2.2.0'
  implementation 'com.blacksquircle.ui:language-julia:2.2.0'
  implementation 'com.blacksquircle.ui:language-kotlin:2.2.0'
  implementation 'com.blacksquircle.ui:language-lisp:2.2.0'
  implementation 'com.blacksquircle.ui:language-lua:2.2.0'
  implementation 'com.blacksquircle.ui:language-markdown:2.2.0'
  implementation 'com.blacksquircle.ui:language-php:2.2.0'
  implementation 'com.blacksquircle.ui:language-plaintext:2.2.0'
  implementation 'com.blacksquircle.ui:language-python:2.2.0'
  implementation 'com.blacksquircle.ui:language-ruby:2.2.0'
  implementation 'com.blacksquircle.ui:language-shell:2.2.0'
  implementation 'com.blacksquircle.ui:language-smali:2.2.0'
  implementation 'com.blacksquircle.ui:language-sql:2.2.0'
  implementation 'com.blacksquircle.ui:language-toml:2.2.0'
  implementation 'com.blacksquircle.ui:language-typescript:2.2.0'
  implementation 'com.blacksquircle.ui:language-visualbasic:2.2.0'
  implementation 'com.blacksquircle.ui:language-xml:2.2.0'
  implementation 'com.blacksquircle.ui:language-yaml:2.2.0'
}

Custom Language

First, add this to your module's build.gradle file:

dependencies {
  ...
  implementation 'com.blacksquircle.ui:language-base:2.2.0'
}

Second, implement the Language interface:

import com.blacksquircle.ui.language.base.Language
import com.blacksquircle.ui.language.base.parser.LanguageParser
import com.blacksquircle.ui.language.base.provider.SuggestionProvider
import com.blacksquircle.ui.language.base.styler.LanguageStyler

class CustomLanguage : Language {

    override val languageName = "custom language"

    override fun getParser(): LanguageParser {
        return CustomParser()
    }

    override fun getProvider(): SuggestionProvider {
        return CustomProvider()
    }

    override fun getStyler(): LanguageStyler {
        return CustomStyler()
    }
}

Every language consist of 3 key components:

  1. LanguageParser is responsible for analyzing the source code. The code editor does not use this component directly.
  2. SuggestionProvider is responsible for collecting the names of functions, fields, and keywords within your file scope. The code editor use this component to display the list of code suggestions.
  3. LanguageStyler is responsible for syntax highlighting. The code editor use this component to display syntax highlight spans on the screen.

LanguageParser

LanguageParser is an interface which detects syntax errors so you can display them in the TextProcessor later.

To create a custom parser you need to implement execute method that will return a ParseResult.
If ParseResult contains an exception it means that the source code can't compile and contains syntax errors. You can highlight an error line by calling editor.setErrorLine(lineNumber) method.

Remember that you shouldn't use this method on the main thread.

class CustomParser : LanguageParser {

    override fun execute(name: String, source: String): ParseResult {
        // TODO Implement parser
        val lineNumber = 0
        val columnNumber = 0
        val parseException = ParseException("describe exception here", lineNumber, columnNumber)
        return ParseResult(parseException)
    }
}

SuggestionProvider

SuggestionProvider is an interface which provides code suggestions to display them in the TextProcessor.

The text scanning is done on a per-line basis. When the user edits code on a single line, that line is re-scanned by the current SuggestionsProvider implementation, so you can keep your suggestions list up to date. This is done by calling the processLine method. This method is responsible for parsing a line of text and saving the code suggestions for that line.

After calling setTextContent the code editor will call processLine for each line to find all possible code suggestions.

class CustomProvider : SuggestionProvider {

    // You can use WordsManager
    // if you don't want to write the language-specific implementation
    private val wordsManager = WordsManager()

    override fun getAll(): Set<Suggestion> {
        return wordsManager.getWords()
    }

    override fun processLine(lineNumber: Int, text: String) {
        wordsManager.processLine(lineNumber, text)
    }

    override fun deleteLine(lineNumber: Int) {
        wordsManager.deleteLine(lineNumber)
    }

    override fun clearLines() {
        wordsManager.clearLines()
    }
}

LanguageStyler

LanguageStyler is an interface which provides syntax highlight spans to display them in the TextProcessor.

The execute method will be executed on the background thread every time the text changes. You can use regex or lexer to find the keywords in text.

Remember: the more spans you add, the more time it takes to render on the main thread.

class CustomStyler : LanguageStyler {

    override fun execute(source: String, scheme: ColorScheme): List<SyntaxHighlightSpan> {
        val syntaxHighlightSpans = mutableListOf<SyntaxHighlightSpan>()
        
        // TODO Implement syntax highlighting
        
        return syntaxHighlightSpans
    }
}
Comments
  • initial fastlane structures

    initial fastlane structures

    Someone opened an RFP with F-Droid to get your app listed there. F-Droid highly recommends that summary & description are maintained in the app's repo (here) itself – so changes/updates/adjustments can be made by those knowing best, without the need of opening merge requests whenever that happens. Fastlane can be used with other "stores" as well, so it gives you "one place to rule them all".

    You might wish to build on this (e.g. adding screenshots, a featureGraphic, per-release changelogs etc). For orientation, you might find my Fastlane Cheat-Sheet useful.

    PS: The format I've used for full_description.txt is what I call "Markdown lite", and has proven to work best when using different targets (like F-Droid, my repo, Play Store). Some pointers on this can be found in my wiki. It's quite simple, basically: separate paragraphs and lists by "empty lines", use "simple HTML" tags (b,i,u,a) where appropriate, avoid using headers (h1,h2,h3,..); that's all.

    opened by IzzySoft 26
  • "File not found" when opening script files from file explorers

    App Version: 2021.1.3

    Affected Device(s): Android 11

    Describe the bug No files can be opened when selecting "Open with Squircle IDE" from several external file explorers.

    To Reproduce Steps to reproduce the behavior:

    1. Navigate to a file, tap it.
    2. Select "open with Squircle IDE"
    3. Error is always returned: "File not found"

    Expected behavior File will open in in the app to be edited.

    I am trying to edit bash shell scripts in the termux .shortcuts folder. I can open the files with several managers (Amaze, Material Files, Ghost Commander, Files etc.) however when I tap on the file and select open with Squircle IDE. I get an error "File not found" I have tried several files, they all result in the same error.

    All of these files can be opened and edited in several other editors. Only Squircle returns this error.

    bug 
    opened by ioogithub 11
  • Undo/Redo may be crash

    Undo/Redo may be crash

    Please consider making a Pull Request if you are capable of doing so.

    App Version: 2020.2.2 Develop branch, means all version has the bug.

    Affected Device(s): ViVo x27 with Android 10

    Describe the bug

        java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
            at java.util.ArrayList.get(ArrayList.java:439)
            at com.lightteam.editorkit.feature.undoredo.UndoStack.pop(UndoStack.kt:37)
            at com.lightteam.editorkit.internal.UndoRedoEditText.redo(UndoRedoEditText.kt:119)
            at com.lightteam.modpeide.ui.editor.fragments.EditorFragment.onRedoButton(EditorFragment.kt:616)
            at com.lightteam.modpeide.ui.editor.utils.ToolbarManager$bind$5.onClick(ToolbarManager.kt:129)
            at android.view.View.performClick(View.java:7187)
            at android.view.View.performClickInternal(View.java:7164)
            at android.view.View.access$3500(View.java:813)
            at android.view.View$PerformClick.run(View.java:27649)
            at android.os.Handler.handleCallback(Handler.java:883)
            at android.os.Handler.dispatchMessage(Handler.java:100)
            at android.os.Looper.loop(Looper.java:230)
            at android.app.ActivityThread.main(ActivityThread.java:7742)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:508)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
    
        fun pop(): TextChange {
            // TODO: size must >= 1
            val item = stack[size - 1]
            stack.removeAt(size - 1)
            currentSize -= item.newText.length + item.oldText.length
            return item
        }
    

    To Reproduce Steps to reproduce the behavior:

    1. Change content of Editor.
    2. Quick click undo or redo button.
    3. May be crash.

    Expected behavior No crash.

    bug cannot reproduce 
    opened by liyujiang-gzu 9
  • Problem with comments regex

    Problem with comments regex

    • ACE Editor Screenshot_2020_0801_031008

    • CodeMirror Screenshot_2020_0801_031113

    • ModPE IDE Screenshot_2020_0801_031213

    Originally posted by @liyujiang-gzu in https://github.com/massivemadness/ModPE-IDE/issues/8#issuecomment-667307540

    bug 
    opened by massivemadness 9
  • Alternative download source

    Alternative download source

    Would you mind publishing the APK here at Github (e.g. via releases/, see Creating releases in the Github Help) for folks without Playstore to grab it? I'd then offer to serve it via my F-Droid compatible repo, including automated updates.

    opened by IzzySoft 8
  • F-Droid inclusion and separate gradle flavor request

    F-Droid inclusion and separate gradle flavor request

    I'd like to include your app to F-Droid, which is a catalogue of FOSS apps and client and server software for its distribution. You can read more about F-Droid at http://f-droid.org/. As per inclusion policy, I must ask for your permission to do so. As for inclusion progress, you can track it here: https://gitlab.com/fdroid/fdroiddata/-/merge_requests/8118.
    If you agree, I also must ask you for a separate gradle flavor without com.google.android.play.core library, which is not FOSS.

    feature 
    opened by ClockGen 7
  • Support Storage Access Framework standard

    Support Storage Access Framework standard

    Is your feature request related to a problem? Please describe. A SAF support will be useful in the following situation:

    1. automatically sync code with cloud solution such as Nextcloud.
    2. open file with SFTP mounted SAF folder on a remote Linux server.

    Describe the solution you'd like Be able to open file with SAF mounted storage.

    Describe alternatives you've considered Be able to use SFTP to open file on a remote server.

    Additional context Could refer to Nextcloud code for SAF implementation. Could refer to VLC code for SFTP implementation.

    feature 
    opened by J4gQBqqR 5
  • Chinese translation for ModPE-IDE

    Chinese translation for ModPE-IDE

    Save as vaules-zh/strings.xml

    <!--
      ~ Licensed to the Light Team Software (Light Team) under one or more
      ~ contributor license agreements.  See the NOTICE file distributed with
      ~ this work for additional information regarding copyright ownership.
      ~ The Light Team licenses this file to You under the Apache License, Version 2.0
      ~ (the "License"); you may not use this file except in compliance with
      ~ the License.  You may obtain a copy of the License at
      ~
      ~      http://www.apache.org/licenses/LICENSE-2.0
      ~
      ~ Unless required by applicable law or agreed to in writing, software
      ~ distributed under the License is distributed on an "AS IS" BASIS,
      ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      ~ See the License for the specific language governing permissions and
      ~ limitations under the License.
      -->
    <resources>
    
        <string name="app_name" translatable="false">ModPE IDE</string>
    
        <string name="label_permissions">权限</string>
        <string name="label_directory">目录</string>
        <string name="label_local_storage">本地存储</string>
        <string name="label_settings">设置</string>
        <string name="label_application">应用</string>
        <string name="label_editor">编辑器</string>
        <string name="label_code_style">代码样式</string>
        <string name="label_files">文件</string>
        <string name="label_about">关于</string>
        <string name="label_fonts">字体</string>
        <string name="label_external_font">外部字体</string>
        <string name="label_themes">主题</string>
        <string name="label_new_theme">新建主题</string>
        <string name="label_keyboard_presets">键盘预设</string>
    
        <string name="hint_search">搜素…</string>
        <string name="hint_line">行:</string>
        <string name="hint_line_number" translatable="false">如:0</string>
        <string name="hint_enter_file_name">输入文件名称</string>
        <string name="hint_enter_file_path">输入文件路径</string>
        <string name="hint_enter_archive_name">输入归档名称</string>
        <string name="hint_file_path" translatable="false">如:/storage/emulated/0/Download/</string>
        <string name="hint_file_name" translatable="false">如:file.txt</string>
        <string name="hint_archive_name" translatable="false">如:archive.zip</string>
        <string name="hint_enter_font_name">输入字体名称</string>
        <string name="hint_enter_font_path">输入字体路径</string>
        <string name="hint_enter_theme_name">输入主题名称</string>
        <string name="hint_enter_theme_author">输入主题作者</string>
        <string name="hint_enter_theme_desc">主题简要描述</string>
        <string name="hint_font_name" translatable="false">如:Droid Sans Mono</string>
        <string name="hint_theme_name" translatable="false">如:Darcula</string>
        <string name="hint_theme_author" translatable="false">如:Light Team Software</string>
        <string name="hint_theme_desc">如:默认配色方案</string>
    
        <string name="action_restart">重启</string>
        <string name="action_grant_access">授予访问权限</string>
        <string name="action_yes">是</string>
        <string name="action_no">否</string>
        <string name="action_ok">确定</string>
        <string name="action_cancel">取消</string>
        <string name="action_create">创建</string>
        <string name="action_close">关闭</string>
        <string name="action_close_others">关闭其他</string>
        <string name="action_close_all">关闭全部</string>
        <string name="action_copy_path">复制路径</string>
        <string name="action_folder">文件夹</string>
        <string name="action_rename">重命名</string>
        <string name="action_delete">删除</string>
        <string name="action_insert">插入</string>
        <string name="action_run_in_background">在后台运行</string>
        <string name="action_show_hidden_files">显示隐藏文件</string>
        <string name="action_create_zip">创建 .zip</string>
        <string name="action_get_it">立即获取</string>
        <string name="action_maybe_later">稍候再说</string>
        <string name="action_unlock_all_features">解锁全部功能</string>
        <string name="action_select">选择</string>
        <string name="action_add_font">添加字体</string>
        <string name="action_save_theme">保存主题</string>
        <string name="action_import">导入</string>
        <string name="action_export">导出</string>
        <string name="action_edit">编辑</string>
        <string name="action_remove">移除</string>
        <string name="action_new">新建</string>
        <string name="action_open">打开</string>
        <string name="action_open_as">另开为</string>
        <string name="action_save">保存</string>
        <string name="action_save_as">另存为</string>
        <string name="action_properties">属性</string>
        <string name="action_cut">剪切</string>
        <string name="action_copy">复制</string>
        <string name="action_paste">粘贴</string>
        <string name="action_select_all">全选</string>
        <string name="action_select_line">选择行</string>
        <string name="action_delete_line">删除行</string>
        <string name="action_duplicate_line">复制行</string>
        <string name="action_regex">正则表达式</string>
        <string name="action_match_case">区分大小写</string>
        <string name="action_words_only">仅匹配单词</string>
        <string name="action_find">查找</string>
        <string name="action_close_find">关闭查找</string>
        <string name="action_replace">替换</string>
        <string name="action_close_replace">关闭替换</string>
        <string name="action_replace_all">替换全部</string>
        <string name="action_goto_line">转到行</string>
        <string name="action_go_to">转到</string>
        <string name="action_error_checking">错误检查</string>
        <string name="action_insert_color">插入颜色</string>
        <string name="action_settings">设置</string>
        <string name="action_search">搜素</string>
        <string name="action_tools">工具</string>
    
        <string name="dialog_title_choose_action">选择操作</string>
        <string name="dialog_title_create">创建文件</string>
        <string name="dialog_title_rename">重命名文件</string>
        <string name="dialog_title_multi_delete">选择删除文件</string>
        <string name="dialog_title_store">获取旗舰版</string>
        <string name="dialog_title_changelog">更新日志</string>
        <string name="dialog_title_privacy_policy">隐私政策</string>
        <string name="dialog_title_exit">退出应用</string>
        <string name="dialog_title_properties">属性</string>
        <string name="dialog_title_color_picker">颜色选择器</string>
        <string name="dialog_title_result">结果</string>
        <string name="dialog_title_save_as">另文件存为</string>
        <string name="dialog_title_goto_line">跳转到行</string>
        <string name="dialog_title_deleting">文件删除中</string>
        <string name="dialog_title_copying">文件复制中</string>
        <string name="dialog_title_compressing">归档压缩中</string>
        <string name="dialog_title_extracting">归档解压中</string>
        <string name="dialog_title_archive_name">归档名称</string>
    
        <string name="dialog_message_exit">你确定要退出吗?所有更改将会保存到缓存中</string>
        <string name="dialog_message_delete">确定要删除此文件吗?</string>
        <string name="dialog_message_multi_delete">确定要删除选定的文件吗?</string>
    
        <string name="properties_name">&lt;b>名称:&lt;/b> %s&lt;br></string>
        <string name="properties_path">&lt;b>路径:&lt;/b> %s&lt;br></string>
        <string name="properties_modified">&lt;b>修改:&lt;/b> %s&lt;br></string>
        <string name="properties_size">&lt;b>大小:&lt;/b> %s&lt;br></string>
        <string name="properties_line_count">&lt;b>行数:&lt;/b> %s&lt;br></string>
        <string name="properties_word_count">&lt;b>单词数:&lt;/b> %s&lt;br></string>
        <string name="properties_char_count">&lt;b>符号数:&lt;/b> %s</string>
        <string name="properties_readable">可读</string>
        <string name="properties_writable">可写</string>
        <string name="properties_executable">可执行</string>
    
        <string name="sort_by_name">按名称排序</string>
        <string name="sort_by_size">按大小排序</string>
        <string name="sort_by_date">按日期排序</string>
    
        <string name="message_access_denied">没有访问权限</string>
        <string name="message_access_required">本应用需要访问文件才能正常工作</string>
        <string name="message_no_result">没有结果</string>
        <string name="message_no_open_files">没有打开任何文件</string>
        <string name="message_tab_limit_achieved">标签页已达上限</string>
        <string name="message_cannot_be_opened">文件无法打开</string>
        <string name="message_invalid_file_name">无效的文件名称</string>
        <string name="message_invalid_file_path">无效的文件路径</string>
        <string name="message_unknown_exception">发生错误</string>
        <string name="message_directory_expected">无法获取文件列表</string>
        <string name="message_file_already_exists">文件已存在</string>
        <string name="message_file_not_found">文件未找到</string>
        <string name="message_done">已完毕</string>
        <string name="message_saved">已保存</string>
        <string name="message_select_file">选择文件</string>
        <string name="message_nothing_to_cut">没有任何内容可剪切</string>
        <string name="message_nothing_to_copy">没有任何内容可复制</string>
        <string name="message_nothing_to_paste">没有任何内容可粘贴</string>
        <string name="message_enter_the_text">输入文本</string>
        <string name="message_line_above_than_0">行号必须大于0</string>
        <string name="message_line_not_exists">行号不存在</string>
        <string name="message_no_errors_detected">未检测到语法错误</string>
        <string name="message_in_app_update_ready">应用已准备好新版本</string>
        <string name="message_in_app_update_failed">新版本安装失败</string>
        <string name="message_selected">已选择 «%1$s»</string>
        <string name="message_new_font_available">新字体可用: %1$s</string>
        <string name="message_font_removed">字体 «%1$s» 已移除</string>
        <string name="message_new_theme_available">新主题可用: %1$s</string>
        <string name="message_theme_removed">主题 «%1$s» 已移除</string>
        <string name="message_theme_exported">主题已保存到 %1$s</string>
        <string name="message_choose_theme_json">选择 .json 主题文件</string>
        <string name="message_theme_syntax_exception">读取主题文件时出错</string>
        <string name="message_elasped_time">运行时间: %1$s</string>
        <string name="message_deleting">删除中…%1$s</string>
        <string name="message_copying">复制中…%1$s</string>
        <string name="message_compressing">压缩中…%1$s</string>
        <string name="message_extracting">解压中…%1$s</string>
        <string name="message_of_total" translatable="false">%1$d / %2$d</string>
    
        <string name="store_standard" translatable="false">标准版</string>
        <string name="store_ultimate" translatable="false">旗舰版</string>
        <string name="store_feature_1">基本功能</string>
        <string name="store_feature_2">配色方案</string>
        <string name="store_feature_3">主题编辑器 🎉</string>
        <string name="store_feature_4">外部字体</string>
        <string name="store_feature_5">增加标签页上限</string>
        <string name="store_feature_6">错误检查</string>
        <string name="store_feature_7">颜色选择器</string>
    
        <string name="font_panagram" translatable="false">the quick brown fox jumps over the lazy dog\n1234567890.:,;\'(!?) +-*/=</string>
        <string name="font_support_ligatures">* 支持连体字母</string>
        <string name="font_disclaimer">如果要使用此字体,请千万不要删除上面指定路径下的 .ttf 文件</string>
    
        <string name="theme_property_text_color">定义编辑器的文本颜色</string>
        <string name="theme_property_background_color">定义编辑器的背景颜色</string>
        <string name="theme_property_gutter_color">定义行号栏的背景颜色</string>
        <string name="theme_property_gutter_divider_color">定义行号栏的分割线颜色</string>
        <string name="theme_property_gutter_divider_current_line_number_color">定义行号栏的当前所选行号颜色</string>
        <string name="theme_property_gutter_text_color">定义行号栏的行号颜色</string>
        <string name="theme_property_selected_line_color">定义编辑器的当前所选行背景颜色</string>
        <string name="theme_property_selection_color">定义编辑器的当前所选文本背景颜色</string>
        <string name="theme_property_suggestion_query_color">定义代码提示下拉菜单中的文字颜色</string>
        <string name="theme_property_find_result_background_color">定义查找结果的背景颜色</string>
        <string name="theme_property_delimiter_background_color">定义成对的分隔符的背景颜色</string>
        <string name="theme_property_numbers_color">定义语法高亮显示的数字颜色,如:123、0.5、0xFF</string>
        <string name="theme_property_operators_color">定义语法高亮显示的操作符颜色,如:+-*/=、[]、 {}、()</string>
        <string name="theme_property_keywords_color">定义语法高亮显示的关键词颜色,如:function, if, else</string>
        <string name="theme_property_types_color">定义语法高亮显示的类型颜色,如:const, var, let</string>
        <string name="theme_property_lang_const_color">定义语法高亮显示的语言常量颜色,如:true, false, null</string>
        <string name="theme_property_methods_color">定义语法高亮显示的方法颜色</string>
        <string name="theme_property_strings_color">定义语法高亮显示的字符串颜色</string>
        <string name="theme_property_comments_color">定义语法高亮显示的注释颜色,如: //、/**/</string>
    
        <string name="encoding_utf8_default">UTF-8 (默认)</string>
    
        <string name="view_mode_compact_list">紧凑列表</string>
        <string name="view_mode_detailed_list">详细列表</string>
    
        <string name="pref_header_application_title">应用</string>
        <string name="pref_header_application_summary">配置全局应用设置。</string>
        <string name="pref_header_editor_title">编辑器</string>
        <string name="pref_header_editor_summary">配置编辑器。</string>
        <string name="pref_header_codeStyle_title">代码样式</string>
        <string name="pref_header_codeStyle_summary">配置代码样式。</string>
        <string name="pref_header_files_title">文件</string>
        <string name="pref_header_files_summary">配置文件的处理方式。</string>
        <string name="pref_header_about_title">关于</string>
        <string name="pref_header_about_summary">查看有关 ModPE IDE 的信息。</string>
    
        <string name="pref_category_look_and_feel">观感</string>
        <string name="pref_category_other">其他</string>
        <string name="pref_category_font">字体</string>
        <string name="pref_category_tabs">标签页</string>
        <string name="pref_category_editor">编辑器</string>
        <string name="pref_category_keyboard">键盘</string>
        <string name="pref_category_code_style">代码样式</string>
        <string name="pref_category_encoding">文本编码</string>
        <string name="pref_category_file_explorer">文件浏览器</string>
        <string name="pref_category_about">关于</string>
        <string name="pref_category_contribute">贡献</string>
    
        <string name="pref_color_scheme_title">配色方案</string>
        <string name="pref_color_scheme_summary">配置语法高亮显示颜色方案。</string>
        <string name="pref_fullscreen_title">全屏模式</string>
        <string name="pref_fullscreen_summary">以全屏模式启动本应用。</string>
        <string name="pref_confirm_exit_title">退出确认</string>
        <string name="pref_confirm_exit_summary">启用后按下返回键将弹出退出确认对话框,否则直接退出。</string>
    
        <string name="pref_font_size_title">编辑器字体大小</string>
        <string name="pref_font_size_summary">指定编辑器的默认字体大小。</string>
        <string name="pref_font_type_title">编辑器字体类型</string>
        <string name="pref_font_type_summary">指定编辑器的默认字体类型。</string>
        <string name="pref_resume_session_title">恢复会话</string>
        <string name="pref_resume_session_summary">下次启动时将恢复已打开的文件。</string>
        <string name="pref_tab_limit_title">标签页限制</string>
        <string name="pref_tab_limit_summary">限制屏幕上显示的最大标签页数。</string>
        <string name="pref_word_wrap_title">自动换行</string>
        <string name="pref_word_wrap_summary">启用自动换行以适应屏幕宽度。</string>
        <string name="pref_code_completion_title">代码提示</string>
        <string name="pref_code_completion_summary">在输入时将自动在下拉菜单中显示代码补全建议。</string>
        <string name="pref_error_highlighting_title">错误高亮</string>
        <string name="pref_error_highlighting_summary">启用实时错误高亮显示(需要重启本应用才能生效)。</string>
        <string name="pref_pinch_zoom_title">手势缩放</string>
        <string name="pref_pinch_zoom_summary">在编辑器中启用缩放手势。</string>
        <string name="pref_highlight_line_title">高亮当前行</string>
        <string name="pref_highlight_line_summary">高亮显示光标当前所在的行。</string>
        <string name="pref_highlight_delimiters_title">高亮成对的符号</string>
        <string name="pref_highlight_delimiters_summary">在光标处插入符号时,高亮显示成对的符号,如括号、引号。</string>
        <string name="pref_extended_keyboard_title">快捷符号栏</string>
        <string name="pref_extended_keyboard_summary">弹出软键盘时,在键盘上面显示常用的符号栏以便快捷输入</string>
        <string name="pref_soft_keyboard_title">软键盘</string>
        <string name="pref_soft_keyboard_summary">始终使用软键盘。</string>
    
        <string name="pref_auto_indent_title">自动缩进</string>
        <string name="pref_auto_indent_summary">自动缩进新行以匹配上面的行。</string>
        <string name="pref_close_brackets_title">括号配对</string>
        <string name="pref_close_brackets_summary">输入时自动关闭小括号/方括号/大括号。</string>
        <string name="pref_close_quotes_title">引号配对</string>
        <string name="pref_close_quotes_summary">输入时自动闭合单引号/双引号。</string>
    
        <string name="pref_encoding_for_opening_title">打开文本的编码</string>
        <string name="pref_encoding_for_opening_summary">打开文本文件时使用的编码。</string>
        <string name="pref_encoding_for_saving_title">保存文本的编码</string>
        <string name="pref_encoding_for_saving_summary">保存文本文件时使用的编码。</string>
        <string name="pref_show_hidden_files_title">显示隐藏文件</string>
        <string name="pref_show_hidden_files_summary">将显示隐藏的文件和文件夹(以“.”开头)。</string>
        <string name="pref_folders_on_top_title">文件夹置顶</string>
        <string name="pref_folders_on_top_summary">文件夹将优先显示在文件的前面。</string>
        <string name="pref_view_mode_title">视图模式</string>
        <string name="pref_sort_mode_title">排序方式</string>
    
        <string name="pref_about_standard_title">ModPE IDE - 标准版</string>
        <string name="pref_about_ultimate_title">ModPE IDE - 旗舰版</string>
        <string name="pref_about_summary">Copyright 2020 Light Team Software\n保留所有权利\n\n版本: %1$s (%2$d)</string>
        <string name="pref_privacy_policy_title">查看“隐私政策”</string>
        <string name="pref_contribute_title">促进发展</string>
        <string name="pref_contribute_summary">您可以在 GitHub 上提问讨论或将本应用翻译为您的母语。\n\n谢谢!</string>
    </resources>
    
    
    translation 
    opened by liyujiang-gzu 5
  • Not working ROOT directory

    Not working ROOT directory

    Please consider making a Pull Request if you are capable of doing so.

    App Version: 2022.2.0

    Affected Device(s): Redmi Note 10 Pro

    Describe the bug I choose the root directory, the application does not request root dotsup, as a result, you can not read / change files.

    Expected behavior Full read/modify access to the root directory.

    bug 
    opened by try-man 4
  • Add the option to open a text file or source code file in this app

    Add the option to open a text file or source code file in this app

    Hi, I have a suggestion for your code editor app from the Google Play Store and F-Droid app- Please add the ability to open a text file or source code file in this app when the user is selecting an app to open a text file or source code file.

    And make it so that this app can be used to open any source code file in any computer programming language, like PY files (files with ‘.py’ filename suffixes) for Python, JS files for JavaScript and so on.

    I would rate your app 5 stars on the Google Play Store when my suggestion is implemented. I also suggest adding the ability to edit text files and source code files saved in a cloud storage like Google Drive

    feature 
    opened by PyMorga 4
  • Auto save files

    Auto save files

    Please consider making a Pull Request if you are capable of doing so.

    Is your feature request related to a problem? Please describe. What makes me frustrated is that every time I finish my code, I have to save my files myself. Sometimes I forget to, and next time I open this app, seeing my unsaved code, I feel upset for having to write the code again.

    Describe the solution you'd like Automatically save files once in a period of time, e.g. 1min. The time should be adjustable.

    Describe alternatives you've considered Save files myself. But it's inconvenient.

    Additional context None.

    feature 
    opened by YVVT 4
  • Change in screen orientation/rotation causes new tab to be opened with active file.

    Change in screen orientation/rotation causes new tab to be opened with active file.

    Change in screen orientation/rotation causes new tab to be opened with active file.

    App Version: 2022.2.1 (10013)

    Affected Device(s): Oneplus 8T, Android 11

    Describe the bug If a file/document is opened into Squircle by using the "Open With" dialog, changing the screen orientation (ie rotating the device) causes a new tab to be created with the active file. This only occurs when the Squircle app is not already open in the background.

    To Reproduce

    1. Close running instance of Squircle and remove it from the recent apps list.
    2. From any file manager app select a text file and "Open with" Squircle
    3. Rotate the screen

    Result: A new tab is created with the recently opened file each time screen orientation changes.

    Expected behavior Screen rotation should not create a new tab with the recently opened file.

    bug 
    opened by quartertone 0
  • StringIndexOutOfBoundsException when cut/copy

    StringIndexOutOfBoundsException when cut/copy

    App Version: 2022.2.1 (10013)

    Affected Device(s): Samsung A037_su with Android 12

    Describe the bug Its relatively minor and avoidable, as it only happens if you use keyboard keys (hold shift + move arrows) AND move UPwards. Doing the same but moving down in the file as you select: when you hit Ctrl-C: no problems.

    To Reproduce Steps to reproduce the behavior:

    1. select text, moving from low to high
    2. copy or cut
    3. immediate window close, no auto-save happens.

    Stack trace I got from logcat

    FATAL EXCEPTION: main Process: com.blacksquircle.ui, PID: 7249 java.lang.StringIndexOutOfBoundsException at android.text.SpannableStringBuilder.(SpannableStringBuilder.java:64) at androidx.emoji2.text.SpannableBuilder.(SpannableBuilder.java:86) at androidx.emoji2.text.SpannableBuilder.subSequence(SpannableBuilder.java:125) at com.blacksquircle.ui.editorkit.ExtensionsKt.getSelectedText(Extensions.kt:29) at com.blacksquircle.ui.editorkit.ExtensionsKt.cut(Extensions.kt:37) at com.blacksquircle.ui.feature.editor.ui.fragment.EditorFragment.onCutButton(EditorFragment.kt:522) at com.blacksquircle.ui.feature.editor.ui.fragment.EditorFragment$observeViewModel$8$pluginSupplier$1$4.invoke$lambda-0(EditorFragment.kt:302) at com.blacksquircle.ui.feature.editor.ui.fragment.EditorFragment$observeViewModel$8$pluginSupplier$1$4.$r8$lambda$K7_57HbTZi17QI2z9RQVsedwYj0(Unknown Source:0) at com.blacksquircle.ui.feature.editor.ui.fragment.EditorFragment$observeViewModel$8$pluginSupplier$1$4$$ExternalSyntheticLambda0.onShortcut(Unknown Source:2) at com.blacksquircle.ui.editorkit.plugin.shortcuts.ShortcutsPlugin.onKeyDown(ShortcutsPlugin.kt:50) at com.blacksquircle.ui.editorkit.widget.TextProcessor.onKeyDown(TextProcessor.kt:128) at android.view.KeyEvent.dispatch(KeyEvent.java:3664) at android.view.View.dispatchKeyEvent(View.java:14927) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1991) at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:1004) at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1952) at android.app.Activity.dispatchKeyEvent(Activity.java:4225) at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:126) at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86) at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:144) at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:601) at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60) at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3106) at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:823) at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:7722) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7545) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6922) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6979) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6945) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7143) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6953) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7200) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6926) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6979) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6945) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6953) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6926) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6979) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6945) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7176) at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:7363) at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3411) at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2972) at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2963) at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3388) at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loopOnce(Looper.java:186) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

    bug 
    opened by rocket-pig 0
  • Crash

    Crash

    App Version: 2022.2.1

    Affected Device(s): Huawei P30 pro with Android 10.0

    Describe the bug Upon Opening a 6,33mb c# file containing 181344 lines of code the app Crashes

    To Reproduce Steps to reproduce the behavior:

    1. Open a C# file of comparable size (6.3mb, 181344 lines)
    2. Orange loading icon will spin for a few seconds
    3. Loading icon will stop and App will become unresponsive

    Expected behavior File will open and Display contents as normal

    bug 
    opened by BlanXyz 0
  • GUI Navigation of an open file

    GUI Navigation of an open file

    Problem: Google's text selection pin is really awkward, and there exists a solution in this app, it just needs to be expanded upon.

    Two things: selecting the end of a line requires my finger to be just perfectly lined up at the very right edge of my screen. Further, once I get there, the last character is visible only at the very edge, and I would like to scroll a bit further to the right.

    Then, there is the zoom handler that already exists in this app. It's wonderful, however being able to zoom out even further would be fantastic.

    The solution here to resolve both and make this text editor even more powerful, fast, and efficient would be to 1) allow a user to zoom out much more than the current cap. and 2) if a user touches a part of the screen not containing text, the app responds by scrolling instead of selecting. If it's possible for the app to detect immediate movement of a finger on the screen, then let that be the trigger. As an example iOS's Textastic developer got this down pretty nicely. I have attached a video displaying the functionality.

    https://user-images.githubusercontent.com/115341424/196891946-f9e68b2e-e3d5-4881-b614-82beeed657f7.mp4

    I would also like to add that this text editor is absolutely hands down the best and I tested over 20 of them. Beautiful job, I will be contributing a couple gallons of coffee to this project especially if this little hiccup can be fixed, as it will in turn allow me to make this my primary text editor and have fun with some projects.

    feature 
    opened by NR51 0
  • [feature request] Light theme

    [feature request] Light theme

    Is your feature request related to a problem? Please describe. I prefer a light theme, but the app always has a dark theme.

    Describe the solution you'd like A light theme can be chosen in the app.

    Describe alternatives you've considered N/A

    Additional context N/A

    feature 
    opened by opk12 0
Releases(2022.2.1)
  • 2022.2.1(Oct 5, 2022)

    ChangeLog

    • Fixed: Empty file list in Root Directory (8ba56622a8e1132527f44fcf4b4e5059d5028ccb)
    • Fixed: Crash when switching FTP server (861dd29bf121cf4760900c92d87b8d2aaa6420f0)
    • Fixed: Local directories were displayed while using FTP (b64917d633ce1c61564c8dca81fac0f3be3f93a7)
    • Improved interaction with WindowInsets API (f8fecedbf98552e15bd0a573334cc52ca6e20708)

    Download via Google Play: https://play.google.com/store/apps/details?id=com.blacksquircle.ui

    Source code(tar.gz)
    Source code(zip)
    app-fdroid-release.apk(19.97 MB)
    app-googlePlay-release.apk(20.06 MB)
  • 2022.2.0(Oct 1, 2022)

  • 2022.1.2(Jun 14, 2022)

    ChangeLog

    • Added: Support for Smali language (54ef0fe8702b5ae9788ef557ce5c349c1c58c47c)
    • Added: Line Numbers visibility in Settings > Editor (b8009c7122827845950ae4ab7f524512a46fda9b)
    • Added: Support for file extensions: .gradle, .cts and .mts (f1bcb68056eb22dfe99caba106b9c1e7d8dc703e, 0775c84477fd65c0f399a53827a9b4804c6404df)
    • Fixed: Tab key on hardware keyboard (261b9d7fd3f9cf4f63fe7469a4373227b2ae4892)
    • Fixed: Translation typos (9abe1b79827023f02ee1158c22d4adf7afdbc2ac)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.blacksquircle.ui

    Source code(tar.gz)
    Source code(zip)
    app-fdroid-release.apk(19.39 MB)
    app-googlePlay-release.apk(19.52 MB)
  • editorkit/2.2.0(Jun 14, 2022)

    ChangeLog

    • Added: Support for Smali language (54ef0fe8702b5ae9788ef557ce5c349c1c58c47c)
    • Added: Support for file extensions: .gradle, .cts and .mts (f1bcb68056eb22dfe99caba106b9c1e7d8dc703e, 0775c84477fd65c0f399a53827a9b4804c6404df)
    • Added: Custom shortcut filters (261b9d7fd3f9cf4f63fe7469a4373227b2ae4892)
    • PluginSupplier returns Set instead of List (c9e2f8bd82cd629400bdd3770068ad4ecfb78731)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/2.1.3...editorkit/2.2.0

    Source code(tar.gz)
    Source code(zip)
  • 2022.1.1(May 28, 2022)

    ChangeLog

    • Added: Support for TOML language (149f7465846c2d08c0be1a9e010410e22144db7a)
    • Added: Swipe navigation in Settings (35141b21198743c3b023110d17206c0f14fab491)
    • Fixed: Bug when opening a file from external file explorer (6e82d4d7443716402f9ff5938073ca97f58d8db5)
    • Internal architecture improvements
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.blacksquircle.ui

    Source code(tar.gz)
    Source code(zip)
    app-fdroid-release.apk(19.35 MB)
    app-googlePlay-release.apk(19.48 MB)
  • editorkit/2.1.3(May 28, 2022)

    ChangeLog

    • Added: Support for YAML language (f98b396dfd199805fb515f15bfa235824d83cf4e)
    • Added: Support for TOML language (149f7465846c2d08c0be1a9e010410e22144db7a)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/2.1.2...editorkit/2.1.3

    Source code(tar.gz)
    Source code(zip)
  • 2022.1.0(Mar 6, 2022)

    ChangeLog

    • Added: Support for YAML language (f98b396dfd199805fb515f15bfa235824d83cf4e)
    • Added: French translation (thanks to @Ilithy, 1e9f0fedcd09d971478a5d4cf8fac8892670c318)
    • Added: Portuguese translation (thanks to @Isaacsha2, 0e12b01d81a4a4e351aec301d242c9592b28e693)
    • Internal architecture improvements
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.blacksquircle.ui

    Source code(tar.gz)
    Source code(zip)
    app-fdroid-release.apk(19.06 MB)
    app-googlePlay-release.apk(19.18 MB)
  • editorkit/2.1.2(Feb 16, 2022)

    ChangeLog

    • Fixed: Type Mismatch Error (#112 , f02741bc1dd92a9f44f23f55a4dac0a00c237eac)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/2.1.1...editorkit/2.1.2

    Source code(tar.gz)
    Source code(zip)
  • editorkit/2.1.1(Nov 14, 2021)

    ChangeLog

    • Fixed: Listeners in ShortcutPlugin and DirtyTextPlugin didn't clean up on detach (e610d2300091c63353cc881a72ca8b7dc6d54c7a)
    • Fixed: Scrolling issues (0264c456e6ef1ec458b203402b13741471982181)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/2.1.0...editorkit/2.1.1

    Source code(tar.gz)
    Source code(zip)
  • editorkit/2.1.0(Nov 3, 2021)

    ChangeLog

    • Added: Plugin support (5a657bc4a92c88814c35cfc217b6cb8ddaf4606a)
    • Added: Support for Ruby language (47618636dcc5b9edc5152b5326af7b91ad2cf5b8)
    • Added: Support for Julia language (999574bfff47f63c86c43b8cf3e210a3823ffd82)
    • Added: Highlighting for open/closed < and > delimiters (b8e08228d6eaa6162f8f5533cbd7f16f46315286)
    • Added: Optional min/max text size variables for pinch zoom feature (eb957d6fcb63d0e029afb7bfc6892bacbba791e9)
    • Improved scrolling experience (b633519635d0a67248b16b0e13232aeb13b3f7d5)

    Breaking Changes

    The setup of the code editor was completely rewritten from scratch, please have a look at the migration guide.

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/2.0.0...editorkit/2.1.0

    Source code(tar.gz)
    Source code(zip)
  • editorkit/2.0.0(May 19, 2021)

    Breaking Changes

    • The package name has been changed from com.brackeys.ui to com.blacksquircle.ui
    • Everything else remains the same

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/1.3.0...editorkit/2.0.0

    Source code(tar.gz)
    Source code(zip)
  • editorkit/1.3.0(Mar 29, 2021)

    ChangeLog

    • Added: Support for PHP language (8ad81faf28d55e47fd0456867700619015c9700d)
    • Added: Support for TypeScript language (7e9e7307ae70a5739cae11d5645282675ab41427)
    • Added: Property variableColor in SyntaxScheme (6cfb0e201c221cc8c5e4d1903f177cd5a42a609b)
    • Slightly improved JavaScript support (c99767aba7d97bb8ed9f0ea80d8be5c7e26d6150)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/1.2.1...editorkit/1.3.0

    Source code(tar.gz)
    Source code(zip)
  • editorkit/1.2.1(Mar 6, 2021)

    ChangeLog

    • Migration to Maven Central Repository (96de9dd910deaf414cd9e602c11f5e0700231d6d)
    • Changed groupId to com.blacksquircle.ui for all .aar artifacts
    • Added: Support for Groovy language (78db8084aff3d87f310883ea3bb7275f823c98bc)
    • Added: clone() method for UndoStack

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/1.2.0...editorkit/1.2.1

    Source code(tar.gz)
    Source code(zip)
  • editorkit/1.2.0(Feb 13, 2021)

    ChangeLog

    • Added: LineNumbers visibility setting (684b3a832b0729f96ae75602fae2d5ece2f4b598)
    • Fixed: If the current line highlighting is disabled, the line number also won't be highlighted (ecaceed27684d3641931381425dc2cfe3a3ae875)
    • Fixed: Wrong tab width when using spaces instead of tabs (62e9c337b20d5f54075e6919f1c48af504e3d296)
    • Renamed TextScroller's link method to attachTo (79421aaeba5e2a6464386b4bb498254e435f171f)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/1.1.0...editorkit/1.2.0

    Source code(tar.gz)
    Source code(zip)
  • editorkit/1.1.0(Dec 16, 2020)

    ChangeLog

    • Added: Support for Shell language (dfeb783c3f953d97a14e2e7b84733219ab3ad473)
    • Fixed: Top/Bottom visible line computation (e700b3aea85537c62ce458d59606c9d205ab0490)
    • Fixed: Methods matching in Lisp (56b599b3336cd5d11d6494f450f8c6a49bbbe6ac)
    • OnChangeListener, OnShortcutListener and OnUndoRedoChangedListener can be replaced with lambda (ca70ff75ce7af3ca4df29f30b6f0e1148732aebf)
    • Renamed Config to EditorConfig (e8d14feb61752f3d156c8150ad8a0318b77edf1c)
    • setErrorLine now only accepts numbers greater than zero (45a23e5720947e4b20cf17fbff8b2174ec628094)

    Full list of changes: https://github.com/massivemadness/Squircle-IDE/compare/editorkit/1.0.1...editorkit/1.1.0

    Source code(tar.gz)
    Source code(zip)
  • editorkit/1.0.1(Nov 10, 2020)

    ChangeLog

    • Fixed: Wrong text size if the editor not gaining focus (548b8dc4626a1c1f2a841d32efbe5413652942a3)
    • Renamed ShortcutListener to OnShortcutListener (16858185368be050e07da91195da32019ee1e3cc)
    • Hardcoded android:gravity="top|start" (af02f86441939c578a1b899744d89aaedae02e99)
    Source code(tar.gz)
    Source code(zip)
  • 2021.1.4(Nov 3, 2021)

    ChangeLog

    • Added: Support for Ruby language (thanks to @avi-vivi, 47618636dcc5b9edc5152b5326af7b91ad2cf5b8)
    • Added: Support for Julia language (thanks to @likewu, 999574bfff47f63c86c43b8cf3e210a3823ffd82)
    • Added: Support for file extensions: .kts, .cjs and .mjs (ef53073cf6668009af7cc360cbcac5e197efd64a, 861e0ebca38fa8179297e648ca9752bd378cdcb1)
    • Added: Highlighting for open/closed < and > delimiters (b8e08228d6eaa6162f8f5533cbd7f16f46315286)
    • Improved scrolling experience (b633519635d0a67248b16b0e13232aeb13b3f7d5)
    • Improved Chinese translation (416be9dd0d48a624ebf5d6480eb96c04a8e85724)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.blacksquircle.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(18.64 MB)
  • 2021.1.3(May 19, 2021)

    ChangeLog

    • Squircle CE – rebranding (copyright issue) (2a8c6e18b7b0a8fbce67335bee820ed6d2ef900e)
    • Added: Support for Android 11 (515ee107a5c7caf85952cdaee27d72b12a4370f1)
    • Added: Ability to open a file using external file explorer (f3f9b7cfd17900ddbc96e621f50cb3afc924f5f4)
    • Added: Support highlighting for Arduino (73a762371b1135f046ea0ccbe66e76d50b422c0b)
    • Added: German translation (thanks to @qwerty287, f3c8e05b71d301020f1dc2d30280a46baa91ef6c)
    • Improved Chinese translation (23f3eb8c98ff9c0ce673620a2c20cc02260239da)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.blacksquircle.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(18.25 MB)
  • 2021.1.2(Mar 29, 2021)

    ChangeLog

    • Added: Support for PHP language (8ad81faf28d55e47fd0456867700619015c9700d)
    • Added: Support for TypeScript language (7e9e7307ae70a5739cae11d5645282675ab41427)
    • Slightly improved JavaScript support (c99767aba7d97bb8ed9f0ea80d8be5c7e26d6150)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.brackeys.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(18.19 MB)
  • 2021.1.1(Mar 6, 2021)

    ChangeLog

    • Added: Support for Groovy language (78db8084aff3d87f310883ea3bb7275f823c98bc)
    • Fixed: Bug when the running task in file explorer wasn't cancelled by clicking «Cancel» (incl. Delete, Copy, Cut) (ba6d6e3d54f8e184acdb7c74bd2699c612168dc4)
    • Completely reworked internal application logic and data flow
    • You can now open unknown files in editor by default (1ff5d71893b62b5695ec2cfb0924f6127885e9b1)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.brackeys.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(18.04 MB)
  • 2021.1.0(Feb 13, 2021)

    ChangeLog

    • Added: Auto-save files in Settings > Editor (6ceaca92aaac4b6019faa11f6edf9cae7f2d2177)
    • Added: Confirmation dialog when closing tab (b5f00125cb0b7f566c9a16c6ac04fa252d432811)
    • Fixed: Wrong tab width when using spaces instead of tabs (62e9c337b20d5f54075e6919f1c48af504e3d296)
    • Fixed: If the current line highlighting is disabled, the line number also won't be highlighted (ecaceed27684d3641931381425dc2cfe3a3ae875)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.brackeys.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(7.48 MB)
  • 2020.3.1(Dec 24, 2020)

    ChangeLog

    • Added: Support for Shell language (dfeb783)
    • Fixed: Top/Bottom visible line computation (e700b3a)
    • Fixed: Methods highlighting in Lisp (56b599b)
    • Improved Chinese translation (b92d4ec)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.brackeys.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(7.47 MB)
  • 2020.3.0(Nov 4, 2020)

    ChangeLog

    • Brackeys IDE – rebranding 🎉 (99479dc7ee07da91b88d62e666909bf3654af8fe)
    • Added: Support for following programming languages: ActionScript, C, C++, C#, HTML, Java, Kotlin, Lisp, Lua, Markdown, Python, SQL, Visual Basic and XML
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.brackeys.ui

    Source code(tar.gz)
    Source code(zip)
    app-release.apk(7.40 MB)
  • 2020.2.5(Oct 20, 2020)

    ChangeLog

    • ModPE IDE is now available for free 🎉 (08220cea0abc50fcdb4171d28035a2ede43de63d)
    • Added: Syntax highlighting for json files (1195b692e07ac72c76c20df76f8ff3df2c272f20)
    • Added: File content status (modified / not modified) (3a79292a90c04d266d1a2e89d814e4699d84d64a)
    • Reduced amount of keyboard presets to one (dbccf742361337eafea56480dc741bfd9ff3705a)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(4.28 MB)
  • 2020.2.4(Sep 11, 2020)

    ChangeLog

    • Added: Keyboard shortcuts (ed2e7d3d5d29c5d2f03928277db2dd6c687b099a)
    • Added: «Drag to Reorder» for file tabs (8cd0153413d996ab69ed8731a774e131bd431add)
    • Added: «Tab Options» in Settings > Code Style (95b099467071a81a42db00efc0bdd1ab0379a466)
    • Added: Extended Keyboard now contains a tab character (3ed26c53f2a390e84ace2423bb3e1dd59e914188)
    • Removed «Resume session» and «Tab Limit» settings due to their uselessness (42fec2ff4179aed2a8a85de912dc23fd7319f895)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(4.29 MB)
  • 2020.2.3(Aug 21, 2020)

    ChangeLog

    • Added: Encoding auto detection + Support for new encodings (thanks to @liyujiang-gzu)
    • Added: Ability to open any files in the editor (thanks to @liyujiang-gzu)
    • Added: «Linebreaks» in Settings > Files (e688615375dc4c80d050d6cb03f198eea5822c57)
    • Fixed: Bug when comments get highlighted inside double quotes (b158fb717e8fc9034e3146da835e5cb4305b2e94)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(4.31 MB)
  • 2020.2.2(Aug 1, 2020)

    ChangeLog

    • Added: Extended keyboard presets
    • Added: Chinese translation (thanks to @liyujiang-gzu)
    • Fixed: UI freezes when loading a large file (bd0847678834a9882e65e8fceea138e7d0a9d8dc)
    • Fixed: UI freezes when scrolling a large file (thanks to @liyujiang-gzu)
    • Fixed: Loading state when loading a large file (e740c7ce4005d65f3a0e65ab4ddb040330e0839d)
    • Completely redesigned changelog screen (6abf8afe3a7095ab47bd34c2faa17530b850f851)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(4.27 MB)
  • 2020.2.1(Jul 4, 2020)

    ChangeLog

    • Added: «View Mode» in Settings > Files (c58e85a45fde44c11a0bc3cad632a3ba65d279c5)
    • Added: Ability to compress and extract multiple files in specific directory
    • Fixed: Error highlighting didn't work on some devices when editing text (fc260509259e78cc88794c8808b476b21edfa105)
    • Slightly decreased APK size
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(4.16 MB)
  • 2020.2.0(Jun 13, 2020)

    ChangeLog

    • Added: Multi-selection in File Explorer
    • Added: Ability to cut/copy/paste files
    • Added: Ability to delete multiple files
    • Added: «Error Highlighting» in Settings > Editor (78fe8f9ede821c035d6cc40303d91bacdb897e2a)
    • Fixed: When switching tabs quickly, the text disappeared (a974a9a83879dffa39ae07ba0dfc2d211d871276)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(6.90 MB)
  • 2020.1.5(May 30, 2020)

    ChangeLog

    • Added: New «Find» and «Replace» panel with navigation between results
    • Added: Ability to import external theme with missing fields (a58a2120de02f5cc97abed0e61e113b4c0696d3d)
    • Added: Encoding support for opening and saving files (701b4cc52c0a1599aab476fbfa99d3a1cd6c53d1)
    • Added: «Save As» in Menu > File (4f2e52051ffb3ad63fd3780aa3dd7ec2055ed7ac)
    • «Auto-close Quotes» now works in Standard Edition (1cf7fe0310a35b5e0cc391e389c3c8342e119d1f)
    • Bugfixes and minor improvements

    Download via Google Play: https://play.google.com/store/apps/details?id=com.KillerBLS.modpeide

    Source code(tar.gz)
    Source code(zip)
    app-standard-release.apk(6.78 MB)
Owner
Dmitry Rubtsov
20 y.o. Middle Android Engineer @ozontech ⚪️🔵⚪️
Dmitry Rubtsov
[DISCONTINUED] Rrich text editor for android platform. 安卓富文本编辑器,暂停维护

icarus-android Maybe the best rich text editor on android platform. Base on Simditor Features Alignment (left/center/right) Bold Blockquote Code Horiz

Dyson Woo 739 Sep 5, 2022
Jetpack Compose Rich Text Editor

An all-in-one Jetpack Compose component to handle text styling inside TextFields

Paweł Chochura 26 Dec 14, 2022
LocalizedEditText - Custom edit text that allow only one language

LocalizedEditText Custom edit text that allow only one language Supported languages : Arabic , English Default language : English Examples

Mostafa Gad 1 Nov 28, 2021
Android Code Highlighter

CodeView Android Code Highlighter Install Add it in your root build.gradle at the end of repositories: allprojects { repositories { ...

Tiago 206 Dec 27, 2022
An easy approach on how to create your country code picker for the edit text.

Country-Code-Picker Original Article on Dev.to Click below ?? App's Overview In this article, I am going to demonstrate how to create a simple country

Siddharth Singh 5 Mar 10, 2022
MarkdownView is an Android webview with the capablity of loading Markdown text or file and display it as HTML, it uses MarkdownJ and extends Android webview.

MarkdownView is an Android webview with the capablity of loading Markdown text or file and display it as HTML, it uses MarkdownJ and extends Android webview.

Feras Alnatsheh 1k Dec 20, 2022
Chips EditText, Token EditText, Bubble EditText, Spannable EditText and etc.. There are many names of this control. Here I develop easy to understand , modify and integrate Chips Edit Text widget for Android

Chips EditText Library Chips EditText, Token EditText, Bubble EditText, Spannable EditText and etc.. There are many names of this control. Here I deve

kpbird 381 Nov 20, 2022
Form validation and feedback library for Android. Provides .setText for more than just TextView and EditText widgets. Provides easy means to validate with dependencies.

android-formidable-validation Form validation and feedback library for Android. Provides .setText for more than just TextView and EditText widgets. Pr

Linden 147 Nov 20, 2022
AutoLinkTextView is TextView that supports Hashtags (#), Mentions (@) , URLs (http://), Phone and Email automatically detecting and ability to handle clicks.

AutoLinkTextView Deprecated Please use the new version of AutoLinkTextView AutoLinkTextView is TextView that supports Hashtags (#), Mentions (@) , URL

Arman 1.1k Nov 23, 2022
A TextView that automatically fit its font and line count based on its available size and content

AutoFitTextView A TextView that automatically fit its font and line count based on its available size and content This code is heavily based on this S

null 899 Jan 2, 2023
Android library contain custom realisation of EditText component for masking and formatting input text

Masked-Edittext Masked-Edittext android library EditText widget wrapper add masking and formatting input text functionality. Install Maven <dependency

Evgeny Safronov 600 Nov 29, 2022
library to implement and render emojis For Android

Release Notes SuperNova-Emoji SuperNova-Emoji is a library to implement and render emojis. Minimum SDK Level: 9 (2.3) Contact Java Usage To use defaul

Hani Al-momani 360 Jan 3, 2023
An extension of Android's TextView, EditText and Button that let's you use the font of your choice

AnyTextView (deprecated) Note: AnyTextView is no longer being maintained. I recommend replacing AnyTextView with the Calligraphy library instead. Frus

Hans Petter Eide 165 Nov 11, 2022
Add text masking functionality to Android EditText. It will prevent user from inserting not allowed signs, and format input as well.

MaskFormatter MaskFormatter adds mask functionality to your EditText. It will prevent user from inserting not allowed signs, and format input as well.

Azimo Labs 161 Nov 25, 2022
Simple way to create linked text, such as @username or #hashtag, in Android TextView and EditText

Simple Linkable Text Simple way to create link text, such as @username or #hashtag, in Android TextView and EditText Installation Gradle Add dependenc

Aditya Pradana Sugiarto 76 Nov 29, 2022
An example of using KWidget(KEditText and KSpinner) in an android application.

KWidget Sample This is an example project of using KWidget on an android application. What is KWidget? Easy use form widget components with material d

null 1 Apr 20, 2022
Include MatchTextView and MatchButton..Come..you will like it

Android MatchView This project is learned from (https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh) . Thanks for liaohuqiu.. I like the animat

Roger 858 Dec 7, 2022
Implementation of a TextView and all its direct/indirect subclasses with native support for the Roboto fonts, includes the brand new Roboto Slab fonts.

Android-RobotoTextView Implementation of a TextView and all its direct/indirect subclasses with native support for the Roboto fonts, includes the bran

Evgeny Shishkin 782 Nov 12, 2022
Androids EditText that animates the typed text. EditText is extended to create AnimatedEditText and a PinEntryEditText.

AnimatedEditText for Android This repository contains AnimatedEditText and TextDrawable all of which extend the behaviour of EditText and implement fe

Ali Muzaffar 439 Nov 29, 2022