From 51cabbf41c38b806cf7e78f5ba25b353361fd32e Mon Sep 17 00:00:00 2001 From: SyntaxSpin <86142168+SyntaxSpin@users.noreply.github.com> Date: Sat, 21 Feb 2026 07:12:33 +0100 Subject: [PATCH 1/3] feat : initializing TerminalFragment --- .../fragments/MainFragment.java | 24 +++++------- ...ondFragment.java => TemplateFragment.java} | 11 ++---- .../fragments/TerminalFragment.java | 38 +++++++++++++++++++ ...gment_second.xml => fragment_template.xml} | 2 +- app/src/main/res/layout/fragment_terminal.xml | 18 +++++++++ 5 files changed, 71 insertions(+), 22 deletions(-) rename app/src/main/java/com/sparkleseditor/fragments/{SecondFragment.java => TemplateFragment.java} (64%) create mode 100644 app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java rename app/src/main/res/layout/{fragment_second.xml => fragment_template.xml} (96%) create mode 100644 app/src/main/res/layout/fragment_terminal.xml diff --git a/app/src/main/java/com/sparkleseditor/fragments/MainFragment.java b/app/src/main/java/com/sparkleseditor/fragments/MainFragment.java index 58922fc..172a7dd 100644 --- a/app/src/main/java/com/sparkleseditor/fragments/MainFragment.java +++ b/app/src/main/java/com/sparkleseditor/fragments/MainFragment.java @@ -159,20 +159,6 @@ private void setupFileTree() { } private void slideXDrawer() { - /*int statusBarHeight = - getResources() - .getDimensionPixelSize( - getResources().getIdentifier("status_bar_height", "dimen", "android"));*/ - int navigationBarHeight = - getResources() - .getDimensionPixelSize( - getResources().getIdentifier("navigation_bar_height", "dimen", "android")); - ViewGroup.LayoutParams layoutParams = binding.leftDrawerMenu.getLayoutParams(); - if (layoutParams instanceof ViewGroup.MarginLayoutParams) { - ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) layoutParams; - binding.leftDrawerMenu.setLayoutParams(marginLayoutParams); - } - binding.drawer.setScrimColor(Color.TRANSPARENT); binding.drawer.setDrawerElevation(0f); binding.drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @@ -243,6 +229,16 @@ private void setupToolbox() { frgSettings ); }); + binding.term.setOnClickListener( + v->{ + Fragment frgTerm = new TerminalFragment(); + Navigator.pushTo( + getParentFragmentManager(), + R.id.nav_host, + frgTerm + ); + } + ); } @SuppressLint("NonConstantResourceId") diff --git a/app/src/main/java/com/sparkleseditor/fragments/SecondFragment.java b/app/src/main/java/com/sparkleseditor/fragments/TemplateFragment.java similarity index 64% rename from app/src/main/java/com/sparkleseditor/fragments/SecondFragment.java rename to app/src/main/java/com/sparkleseditor/fragments/TemplateFragment.java index ce66488..751ca7e 100644 --- a/app/src/main/java/com/sparkleseditor/fragments/SecondFragment.java +++ b/app/src/main/java/com/sparkleseditor/fragments/TemplateFragment.java @@ -6,15 +6,12 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.navigation.fragment.NavHostFragment; -import com.sparkleseditor.R; -import com.sparkleseditor.databinding.FragmentSecondBinding; +import com.sparkleseditor.databinding.FragmentTemplateBinding; -public class SecondFragment extends BaseFragment { +public class TemplateFragment extends BaseFragment { - private FragmentSecondBinding binding; + private FragmentTemplateBinding binding; @Override public View onCreateView( @@ -22,7 +19,7 @@ public View onCreateView( Bundle savedInstanceState ) { - binding = FragmentSecondBinding.inflate(inflater, container, false); + binding = FragmentTemplateBinding.inflate(inflater, container, false); return binding.getRoot(); } diff --git a/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java b/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java new file mode 100644 index 0000000..1728cb7 --- /dev/null +++ b/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java @@ -0,0 +1,38 @@ +package com.sparkleseditor.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; + +import com.sparkleseditor.databinding.FragmentTemplateBinding; + +public class TerminalFragment extends BaseFragment { + + private FragmentTemplateBinding binding; + + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState + ) { + + binding = FragmentTemplateBinding.inflate(inflater, container, false); + return binding.getRoot(); + + } + + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_second.xml b/app/src/main/res/layout/fragment_template.xml similarity index 96% rename from app/src/main/res/layout/fragment_second.xml rename to app/src/main/res/layout/fragment_template.xml index 6ea56a5..2c1145b 100644 --- a/app/src/main/res/layout/fragment_second.xml +++ b/app/src/main/res/layout/fragment_template.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".fragments.SecondFragment"> + tools:context=".fragments.TemplateFragment"> + + + + + + + \ No newline at end of file From fe458f78153b822407fb3ac89460b84afbfc6b5f Mon Sep 17 00:00:00 2001 From: SyntaxSpin <86142168+SyntaxSpin@users.noreply.github.com> Date: Sat, 21 Feb 2026 07:25:15 +0100 Subject: [PATCH 2/3] refacor : Optimize Imports --- .../com/sparkleseditor/fragments/SettingsFragment.java | 5 ----- .../com/sparkleseditor/fragments/TerminalFragment.java | 7 +++---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/sparkleseditor/fragments/SettingsFragment.java b/app/src/main/java/com/sparkleseditor/fragments/SettingsFragment.java index 00383ae..cc9a66c 100644 --- a/app/src/main/java/com/sparkleseditor/fragments/SettingsFragment.java +++ b/app/src/main/java/com/sparkleseditor/fragments/SettingsFragment.java @@ -5,14 +5,9 @@ import android.view.View; import android.view.ViewGroup; -import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import com.sparkleseditor.R; -import com.sparkleseditor.databinding.FragmentSecondBinding; import com.sparkleseditor.databinding.FragmentSettingsBinding; -import com.sparkleseditor.navigation.Navigator; public class SettingsFragment extends BaseFragment { diff --git a/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java b/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java index 1728cb7..e43025e 100644 --- a/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java +++ b/app/src/main/java/com/sparkleseditor/fragments/TerminalFragment.java @@ -6,12 +6,11 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; - -import com.sparkleseditor.databinding.FragmentTemplateBinding; +import com.sparkleseditor.databinding.FragmentTerminalBinding; public class TerminalFragment extends BaseFragment { - private FragmentTemplateBinding binding; + private FragmentTerminalBinding binding; @Override public View onCreateView( @@ -19,7 +18,7 @@ public View onCreateView( Bundle savedInstanceState ) { - binding = FragmentTemplateBinding.inflate(inflater, container, false); + binding = FragmentTerminalBinding.inflate(inflater, container, false); return binding.getRoot(); } From 5110e17cefce5e3364ba756a1b82597c345395db Mon Sep 17 00:00:00 2001 From: SyntaxSpin <86142168+SyntaxSpin@users.noreply.github.com> Date: Mon, 23 Feb 2026 07:07:49 +0100 Subject: [PATCH 3/3] feat : TerminalFragment implemented on Android Shell (old code via @RohitKushvaha1) --- app/build.gradle.kts | 6 +- .../components/virtualkeys/SpecialButton.java | 49 ++ .../virtualkeys/SpecialButtonState.java | 56 ++ .../virtualkeys/VirtualKeyButton.java | 165 +++++ .../virtualkeys/VirtualKeyClient.kt | 39 + .../virtualkeys/VirtualKeysConstants.java | 246 +++++++ .../virtualkeys/VirtualKeysInfo.java | 199 ++++++ .../virtualkeys/VirtualKeysListener.kt | 42 ++ .../virtualkeys/VirtualKeysView.java | 667 ++++++++++++++++++ .../fragments/TerminalFragment.java | 109 ++- .../com/sparkleseditor/utils/FileUtil.java | 599 ++++++++++++++++ .../sparkleseditor/utils/TerminalBackEnd.java | 241 +++++++ .../main/res/layout-v26/fragment_terminal.xml | 19 + app/src/main/res/layout/fragment_terminal.xml | 29 +- gradle/libs.versions.toml | 6 + settings.gradle.kts | 7 +- 16 files changed, 2458 insertions(+), 21 deletions(-) create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButton.java create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButtonState.java create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/VirtualKeyButton.java create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/VirtualKeyClient.kt create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/VirtualKeysConstants.java create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/VirtualKeysInfo.java create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/VirtualKeysListener.kt create mode 100755 app/src/main/java/com/sparkleseditor/components/virtualkeys/VirtualKeysView.java create mode 100755 app/src/main/java/com/sparkleseditor/utils/FileUtil.java create mode 100644 app/src/main/java/com/sparkleseditor/utils/TerminalBackEnd.java create mode 100644 app/src/main/res/layout-v26/fragment_terminal.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d89ad3c..43f7e18 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -63,9 +63,13 @@ dependencies { implementation(libs.transition) implementation(libs.fragment) implementation(libs.activity) - implementation(project(":filetree")) + implementation(libs.terminal.view) + implementation(libs.terminal.emulator) + implementation(libs.utilcodex) + // with Paths + implementation(project(":filetree")) //tests coreLibraryDesugaring(libs.desugar.jdk.libs) diff --git a/app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButton.java b/app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButton.java new file mode 100755 index 0000000..a2b367c --- /dev/null +++ b/app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButton.java @@ -0,0 +1,49 @@ +package com.sparkleseditor.components.virtualkeys; + +import androidx.annotation.NonNull; +import java.util.HashMap; + +/** The {@link Class} that implements special buttons for {@link VirtualKeysView}. */ +public class SpecialButton { + + private static final HashMap map = new HashMap<>(); + public static final SpecialButton CTRL = new SpecialButton("CTRL"); + public static final SpecialButton ALT = new SpecialButton("ALT"); + public static final SpecialButton SHIFT = new SpecialButton("SHIFT"); + public static final SpecialButton FN = new SpecialButton("FN"); + + /** The special button key. */ + private final String key; + + /** + * Initialize a {@link SpecialButton}. + * + * @param key The unique key name for the special button. The key is registered in {@link #map} + * with which the {@link SpecialButton} can be retrieved via a call to {@link + * #valueOf(String)}. + */ + public SpecialButton(@NonNull final String key) { + this.key = key; + map.put(key, this); + } + + /** + * Get the {@link SpecialButton} for {@code key}. + * + * @param key The unique key name for the special button. + */ + public static SpecialButton valueOf(String key) { + return map.get(key); + } + + /** Get {@link #key} for this {@link SpecialButton}. */ + public String getKey() { + return key; + } + + @NonNull + @Override + public String toString() { + return key; + } +} diff --git a/app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButtonState.java b/app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButtonState.java new file mode 100755 index 0000000..ffa11ad --- /dev/null +++ b/app/src/main/java/com/sparkleseditor/components/virtualkeys/SpecialButtonState.java @@ -0,0 +1,56 @@ +package com.sparkleseditor.components.virtualkeys; + +import android.widget.Button; +import java.util.ArrayList; +import java.util.List; + +/** The {@link Class} that maintains a state of a {@link SpecialButton} */ +public class SpecialButtonState { + + /** If special button has been created for the {@link VirtualKeysView}. */ + boolean isCreated = false; + + /** If special button is active. */ + boolean isActive = false; + + /** + * If special button is locked due to long hold on it and should not be deactivated if its state + * is read. + */ + boolean isLocked = false; + + List