Skip to content

feat: Home, settings and git panel ui redesign & fix git multiple branch clone - #393

Open
xeriomy wants to merge 30 commits into
AndroidCSOfficial:devfrom
xeriomy:dev
Open

xeriomy wants to merge 30 commits into
AndroidCSOfficial:devfrom
xeriomy:dev

Conversation

@xeriomy

@xeriomy xeriomy commented Sep 27, 2026 •

Copy link
Copy Markdown

Homescreen redesigned
Settings redesigned
And projects git side panel redesigned
Fixed Git not cloning/showing more than 1 branch
About the build workflow idk what i just made
This fully made with ai

Screenshot_2026-09-27-21-24-14-162_com tom rv2ide Screenshot_2026-09-27-21-24-21-792_com tom rv2ide Screenshot_2026-09-27-21-27-55-188_com tom rv2ide Screenshot_2026-09-27-21-28-01-555_com tom rv2ide Screenshot_2026-09-27-21-28-23-796_com tom rv2ide Screenshot_2026-09-27-21-28-29-753_com tom rv2ide Screenshot_2026-09-27-21-28-51-845_com tom rv2ide Screenshot_2026-09-27-21-28-56-797_com tom rv2ide Screenshot_2026-09-27-21-30-13-917_com tom rv2ide

opencode and others added 30 commits September 22, 2026 00:29
Clean github build warnings
…hem out

A clone only creates a local branch for the remote's default branch while
every remote branch is fetched into refs/remotes/*, but getAllBranches()
listed local branches only. That made a freshly cloned repository look like
it had exactly one branch, and checkout of any other branch failed with
"Ref <name> cannot be resolved" because JGit has no DWIM rule that maps a
remote-only branch name to its remote-tracking ref.

- list local and remote-tracking branches together (ListMode.ALL),
  deduplicated, sorted, skipping the symbolic remote HEAD ref
- check out remote-only branches by creating a local tracking branch from the
  matching remote-tracking ref with upstream configuration set, matching
  native `git checkout <branch>` semantics
tasks.configureEach disabled every task whose name contains "desugar",
which also matched `l8DexDesugarLib<Variant>` — the AGP task that
produces the desugar_jdk_libs runtime dex which PackageAndroidArtifact
packs into the APK. Debug APKs therefore shipped with no `j$` classes at
all (verified: zero `Lj$/...` class definitions in every classes*.dex of
run 36273739542), so any desugared JDK call died at runtime.

JGit 6.8's RefDirectory.getRefsByPrefix(varargs) — the overload used
only when several prefixes are passed, i.e. ListMode.ALL branch listing —
calls java.util.stream.Collectors.toUnmodifiableList() (Java 10), which
D8 rewrites to j$.util.stream.DesugarCollectors. Opening the Git
branches screen therefore crashed with NoClassDefFoundError.

Narrow the predicate to `desugar<Variant>FileDependencies` only, the
task CI already works around by pre-creating its output directory.
Each GitHub Actions run generated a brand-new ~/.android/debug.keystore:
AGP's SigningConfigFactory defaults the "debug" signing config to that
path, the runner has no persistent copy (the workflow caches only
~/.gradle), and AGP creates the file when it is missing. Every Debug APK
therefore shipped with a different signer certificate:

  run 36273739542 -> sha256 1e3bb6e9f39d0033b8b169b934b65eef0bee901b...
  run 35924946644 -> sha256 5000db600eb65c0567d012cf85a57f1b1296d71a...

package (com.tom.rv2ide), versionCode (1024), versionName and the whole
manifest were identical between those two builds, so the failure was not
version ordering or application id: Android rejected the newer build
over the installed one because the signatures did not match, and every
update needed an uninstall first.

Commit one stock Android debug keystore (androiddebugkey/android) and
point signingConfigs.debug at it, so CI runs and developer machines all
produce identically signed Debug APKs. Release signing and its
credentials are untouched, and Debug builds still need no secrets.
fix(git): expose all remote branches after clone and allow checking them out
fix(build): keep desugar_jdk_libs runtime packaged in the APK
fix(core/app): sign Debug builds with a stable committed debug keystore
Presentation-only rework of the Git UI. No GitManager, GitViewModel,
navigation or backend behaviour is changed.

- repository status bar above the tabs (project path + current branch chip)
- shared header card on Changes/History/Branches/Remotes: title, subtitle
  with screen-specific context, single refresh action with ic_sync
- loading spinner until the first data emission, and a consistent
  empty state (title + subtitle) on every list screen - Branches had none
- compact horizontal action rows for branch, changed-file and remote items,
  consistent 18sp titles / 16sp item titles / 14sp secondary type scale
- remotes subtitle names the remote that push/pull/fetch act on
- destructive confirmations (delete branch, discard changes, remove remote)
  and their row buttons now use the theme error color
- operation results on the Remotes screen reported through snackbars like
  every other screen instead of modal dialogs; precondition dialogs kept
- bottom padding so list content clears the floating action buttons
The material library does not expose R.attr.colorError; this project
resolves the theme's error color through androidx.appcompat (see
MainFragment). XML references to ?attr/colorError were already
resolvable, only the Kotlin lookup needed the appcompat constant.
Push, Pull and Fetch become three equal-width action cells (icon above label,
one shared height, radius and gap) so the row no longer clips its labels in the
half-width panel and stays balanced when the panel is expanded.

Branch rows lose their card and their redundant current-branch capsule: the
checked out branch is now marked with a leading dot, bold primary-colored text
and no actions, every other row offers Checkout and Delete through an overflow
menu so the branch name keeps the width it needs. Names stay verbatim and are
middle-ellipsized only when they do not fit.
The side panel stays the default. A new action in the Git repo header widens
the navigation view that already hosts this fragment to the full window and
collapses it back to its wrap-content width, so the fragment, the pager and the
selected tab keep their state and no new navigation or state container is
introduced. The panel collapses itself when another sidebar panel takes over,
when the init screen is shown and when the view is destroyed.
Screen headers become plain, compact blocks instead of cards - title plus an
icon-only refresh, subtitle, optional action and a divider - which gives the
narrow panel back the space the card margins used to eat; list items are
tightened by a couple of dp.

All Git messages now go through showGitFeedback(): success is tinted with the
primary container, neutral information keeps the default snackbar look and
failures use the error color and stay on screen longer. Precondition notices
that used to open a modal dialog are snackbars now, and nothing is ever
suppressed.

Destructive confirmations keep their title, short explanation and Cancel
/action pair, with a readable on-error label on the filled confirm button;
clearing saved credentials is styled like the other destructive dialogs.
Material 1.13.0 no longer ships com.google.android.material.menu.PopupMenu, so
the branch actions menu has to come from the platform, and the fallback text
color used TextView.currentTextColor.
ui(git): Git UI redesign — unified list-screen scaffold
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant