From bbd6fe3f5f891fc6fb19349451f197099d9f6b2c Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 8 Jul 2026 23:50:48 +0000 Subject: [PATCH] Refresh native UI styling --- .../neatstudio/tmuxandroid/MainActivity.java | 178 +++++++++++------- app/src/main/res/values/styles.xml | 9 +- 2 files changed, 111 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java b/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java index a8d74c1..266f7ac 100644 --- a/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java +++ b/app/src/main/java/com/neatstudio/tmuxandroid/MainActivity.java @@ -65,6 +65,23 @@ public final class MainActivity extends Activity { private static final int STATUS_SUCCESS = 2; private static final int STATUS_ERROR = 3; private static final long TERMINAL_RENDER_INTERVAL_MS = 80L; + private static final int COLOR_APP_BG = Color.rgb(9, 11, 13); + private static final int COLOR_BAR = Color.rgb(15, 18, 21); + private static final int COLOR_PANEL = Color.rgb(22, 26, 30); + private static final int COLOR_CARD = Color.rgb(26, 31, 36); + private static final int COLOR_CARD_ALT = Color.rgb(31, 37, 43); + private static final int COLOR_FIELD = Color.rgb(12, 15, 18); + private static final int COLOR_TERMINAL_BG = Color.rgb(2, 4, 6); + private static final int COLOR_BORDER = Color.rgb(55, 64, 72); + private static final int COLOR_BORDER_SOFT = Color.rgb(39, 46, 53); + private static final int COLOR_TEXT = Color.rgb(238, 242, 246); + private static final int COLOR_TEXT_MUTED = Color.rgb(151, 163, 174); + private static final int COLOR_TEXT_DIM = Color.rgb(112, 124, 136); + private static final int COLOR_ACCENT = Color.rgb(65, 218, 199); + private static final int COLOR_ACCENT_DARK = Color.rgb(13, 61, 55); + private static final int COLOR_ACCENT_WARM = Color.rgb(243, 185, 82); + private static final int COLOR_SUCCESS = Color.rgb(91, 213, 139); + private static final int COLOR_DANGER = Color.rgb(235, 103, 111); private static final String OLD_LOCAL_DEFAULT_URL = "http://127.0.0.1:3000"; private static final String OLD_GITHUB_DEFAULT_UPDATE_URL = "https://github.com/neatstudio/tmux-browser-android/releases/latest/download/latest.json"; private static final String DEFAULT_TAILSCALE_URL = "http://100.89.0.116:3000"; @@ -134,8 +151,8 @@ public final class MainActivity extends Activity { } migrateDefaultUpdateSourceToGitea(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getWindow().setStatusBarColor(Color.rgb(17, 20, 24)); - getWindow().setNavigationBarColor(Color.rgb(17, 20, 24)); + getWindow().setStatusBarColor(COLOR_APP_BG); + getWindow().setNavigationBarColor(COLOR_APP_BG); } getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); api = new SessionApiClient(getServerUrl()); @@ -159,17 +176,17 @@ public final class MainActivity extends Activity { private View createRoot() { root = new LinearLayout(this); root.setOrientation(LinearLayout.VERTICAL); - root.setBackgroundColor(Color.rgb(17, 20, 24)); + root.setBackgroundColor(COLOR_APP_BG); progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setIndeterminate(true); progressBar.setVisibility(View.GONE); statusText = new TextView(this); - statusText.setTextColor(Color.rgb(210, 215, 224)); - statusText.setTextSize(12); + statusText.setTextColor(COLOR_TEXT_MUTED); + statusText.setTextSize(11); statusText.setGravity(Gravity.CENTER_VERTICAL); - statusText.setPadding(dp(10), 0, dp(10), 0); + statusText.setPadding(dp(12), 0, dp(12), 0); statusText.setSingleLine(true); setStatus("Ready"); applySystemBarInsets(root); @@ -248,12 +265,12 @@ public final class MainActivity extends Activity { String label = url.replace("http://", "").replace(":3000", ""); LinearLayout card = new LinearLayout(this); card.setOrientation(LinearLayout.VERTICAL); - card.setPadding(dp(12), dp(11), dp(12), dp(11)); - card.setBackground(rounded(Color.rgb(27, 33, 40), 8, Color.rgb(45, 54, 64), 1)); + card.setPadding(dp(12), dp(10), dp(12), dp(10)); + card.setBackground(cardBackground()); TextView title = new TextView(this); title.setText(label); - title.setTextColor(Color.WHITE); + title.setTextColor(COLOR_TEXT); title.setTextSize(16); title.setTypeface(Typeface.DEFAULT_BOLD); TextView meta = bodyText(url); @@ -570,7 +587,7 @@ public final class MainActivity extends Activity { LinearLayout toolbar = new LinearLayout(this); toolbar.setOrientation(LinearLayout.VERTICAL); toolbar.setPadding(dp(8), dp(6), dp(8), dp(6)); - toolbar.setBackgroundColor(Color.rgb(17, 20, 24)); + toolbar.setBackgroundColor(COLOR_BAR); LinearLayout urlRow = new LinearLayout(this); urlRow.setOrientation(LinearLayout.HORIZONTAL); @@ -578,8 +595,8 @@ public final class MainActivity extends Activity { urlField = new EditText(this); urlField.setSingleLine(true); - urlField.setTextColor(Color.WHITE); - urlField.setHintTextColor(Color.rgb(150, 158, 168)); + urlField.setTextColor(COLOR_TEXT); + urlField.setHintTextColor(COLOR_TEXT_DIM); urlField.setTextSize(14); urlField.setInputType(InputType.TYPE_TEXT_VARIATION_URI); urlField.setImeOptions(EditorInfo.IME_ACTION_GO); @@ -645,7 +662,7 @@ public final class MainActivity extends Activity { private HorizontalScrollView createServerProfileBar() { HorizontalScrollView scroller = new HorizontalScrollView(this); scroller.setHorizontalScrollBarEnabled(false); - scroller.setBackgroundColor(Color.rgb(22, 27, 34)); + scroller.setBackgroundColor(COLOR_BAR); LinearLayout row = new LinearLayout(this); row.setOrientation(LinearLayout.HORIZONTAL); @@ -677,12 +694,12 @@ public final class MainActivity extends Activity { private HorizontalScrollView createMainTabs(String selected) { HorizontalScrollView scroller = new HorizontalScrollView(this); scroller.setHorizontalScrollBarEnabled(false); - scroller.setBackgroundColor(Color.rgb(17, 20, 24)); + scroller.setBackgroundColor(COLOR_APP_BG); LinearLayout row = new LinearLayout(this); row.setOrientation(LinearLayout.HORIZONTAL); row.setGravity(Gravity.CENTER_VERTICAL); - row.setPadding(dp(8), dp(4), dp(8), dp(4)); + row.setPadding(dp(8), dp(5), dp(8), dp(5)); row.addView(navButton(PAGE_SERVERS, selected, view -> renderServerScreen())); row.addView(navButton(PAGE_SESSIONS, selected, view -> openSessionPage())); row.addView(navButton(PAGE_PROJECTS, selected, view -> renderProjectsScreen())); @@ -700,26 +717,26 @@ public final class MainActivity extends Activity { private Button navButton(String label, String selected, View.OnClickListener listener) { Button button = toolbarButton(label, listener); boolean active = label.equals(selected); - button.setTextColor(active ? Color.rgb(8, 12, 18) : Color.rgb(235, 241, 248)); + button.setTextColor(active ? Color.rgb(5, 18, 18) : COLOR_TEXT); button.setBackground(active - ? rounded(Color.rgb(86, 211, 219), 8, Color.rgb(86, 211, 219), 1) + ? rounded(COLOR_ACCENT, 8, COLOR_ACCENT, 1) : buttonBackground()); - button.setMinWidth(dp(82)); - button.setMinimumWidth(dp(82)); + button.setMinWidth(dp(74)); + button.setMinimumWidth(dp(74)); return button; } private LinearLayout pageContent() { LinearLayout content = new LinearLayout(this); content.setOrientation(LinearLayout.VERTICAL); - content.setPadding(dp(10), dp(10), dp(10), dp(14)); + content.setPadding(dp(10), dp(9), dp(10), dp(14)); return content; } private TextView sectionTitle(String text) { TextView title = new TextView(this); title.setText(text); - title.setTextColor(Color.rgb(139, 148, 158)); + title.setTextColor(COLOR_ACCENT_WARM); title.setTextSize(12); title.setTypeface(Typeface.DEFAULT_BOLD); title.setPadding(dp(2), dp(12), dp(2), dp(6)); @@ -730,11 +747,11 @@ public final class MainActivity extends Activity { LinearLayout block = new LinearLayout(this); block.setOrientation(LinearLayout.VERTICAL); block.setPadding(dp(12), dp(10), dp(12), dp(10)); - block.setBackground(rounded(Color.rgb(27, 33, 40), 8, Color.rgb(45, 54, 64), 1)); + block.setBackground(cardBackground()); TextView heading = new TextView(this); heading.setText(title); - heading.setTextColor(Color.WHITE); + heading.setTextColor(COLOR_TEXT); heading.setTextSize(16); heading.setTypeface(Typeface.DEFAULT_BOLD); @@ -766,8 +783,8 @@ public final class MainActivity extends Activity { private LinearLayout actionPanel(Button... buttons) { LinearLayout panel = new LinearLayout(this); panel.setOrientation(LinearLayout.VERTICAL); - panel.setPadding(dp(7), dp(7), dp(7), dp(2)); - panel.setBackground(rounded(Color.rgb(24, 30, 37), 8, Color.rgb(42, 51, 61), 1)); + panel.setPadding(dp(6), dp(6), dp(6), dp(1)); + panel.setBackground(panelBackground()); LinearLayout row = null; for (int index = 0; index < buttons.length; index++) { if (index % 2 == 0) { @@ -775,7 +792,7 @@ public final class MainActivity extends Activity { row.setOrientation(LinearLayout.HORIZONTAL); panel.addView(row, matchWrap()); } - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, dp(42), 1); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, dp(38), 1); params.leftMargin = dp(3); params.rightMargin = dp(3); params.bottomMargin = dp(6); @@ -895,7 +912,7 @@ public final class MainActivity extends Activity { view.setTypeface(Typeface.MONOSPACE); view.setTextIsSelectable(true); view.setPadding(dp(12), dp(10), dp(12), dp(10)); - view.setBackground(rounded(Color.rgb(12, 17, 23), 8, Color.rgb(42, 51, 61), 1)); + view.setBackground(rounded(COLOR_FIELD, 8, COLOR_BORDER_SOFT, 1)); return view; } @@ -908,12 +925,12 @@ public final class MainActivity extends Activity { LinearLayout card = new LinearLayout(this); card.setOrientation(LinearLayout.VERTICAL); - card.setPadding(dp(12), dp(11), dp(12), dp(11)); - card.setBackground(rounded(Color.rgb(27, 33, 40), 8, Color.rgb(45, 54, 64), 1)); + card.setPadding(dp(12), dp(10), dp(12), dp(10)); + card.setBackground(cardBackground()); TextView title = new TextView(this); title.setText(name); - title.setTextColor(Color.WHITE); + title.setTextColor(COLOR_TEXT); title.setTextSize(17); title.setTypeface(Typeface.DEFAULT_BOLD); @@ -935,7 +952,7 @@ public final class MainActivity extends Activity { if (agents != null && agents.length() > 0) { TextView agentsTitle = bodyText("Agents"); - agentsTitle.setTextColor(Color.rgb(139, 148, 158)); + agentsTitle.setTextColor(COLOR_TEXT_DIM); agentsTitle.setTypeface(Typeface.DEFAULT_BOLD); agentsTitle.setPadding(0, dp(10), 0, dp(4)); card.addView(agentsTitle); @@ -1000,15 +1017,15 @@ public final class MainActivity extends Activity { private View sessionRow(SessionSummary session) { LinearLayout row = new LinearLayout(this); row.setOrientation(LinearLayout.VERTICAL); - row.setPadding(dp(12), dp(11), dp(12), dp(11)); - row.setBackground(rounded(Color.rgb(27, 33, 40), 8, Color.rgb(45, 54, 64), 1)); + row.setPadding(dp(12), dp(10), dp(12), dp(10)); + row.setBackground(cardBackground()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { row.setElevation(dp(1)); } TextView title = new TextView(this); title.setText(session.name); - title.setTextColor(Color.WHITE); + title.setTextColor(COLOR_TEXT); title.setTextSize(17); title.setTypeface(Typeface.DEFAULT_BOLD); @@ -1110,9 +1127,9 @@ public final class MainActivity extends Activity { terminalScroll = new ScrollView(this); terminalScroll.setFillViewport(true); - terminalScroll.setBackgroundColor(Color.rgb(4, 7, 10)); + terminalScroll.setBackgroundColor(COLOR_TERMINAL_BG); terminalText = new TextView(this); - terminalText.setTextColor(Color.rgb(230, 235, 242)); + terminalText.setTextColor(COLOR_TEXT); terminalText.setTextSize(13); terminalText.setTypeface(Typeface.MONOSPACE); terminalText.setIncludeFontPadding(false); @@ -1120,7 +1137,7 @@ public final class MainActivity extends Activity { terminalText.setGravity(Gravity.BOTTOM | Gravity.START); terminalText.setTextIsSelectable(terminalSelectionEnabled); terminalText.setPadding(dp(10), dp(10), dp(10), dp(10)); - terminalText.setBackgroundColor(Color.rgb(4, 7, 10)); + terminalText.setBackgroundColor(COLOR_TERMINAL_BG); terminalScroll.addView(terminalText, new ScrollView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT @@ -1160,11 +1177,11 @@ public final class MainActivity extends Activity { bar.setOrientation(LinearLayout.HORIZONTAL); bar.setGravity(Gravity.CENTER_VERTICAL); bar.setPadding(dp(5), dp(5), dp(5), dp(5)); - bar.setBackgroundColor(Color.rgb(17, 20, 24)); + bar.setBackgroundColor(COLOR_BAR); bar.addView(terminalToolButton("‹", view -> openSessionPage())); TextView title = new TextView(this); title.setText(sessionName); - title.setTextColor(Color.WHITE); + title.setTextColor(COLOR_TEXT); title.setTextSize(15); title.setTypeface(Typeface.DEFAULT_BOLD); title.setSingleLine(true); @@ -1178,7 +1195,7 @@ public final class MainActivity extends Activity { private HorizontalScrollView createTerminalGroupBar() { HorizontalScrollView scroller = new HorizontalScrollView(this); scroller.setHorizontalScrollBarEnabled(false); - scroller.setBackgroundColor(Color.rgb(13, 17, 22)); + scroller.setBackgroundColor(COLOR_PANEL); terminalGroupRow = new LinearLayout(this); terminalGroupRow.setOrientation(LinearLayout.HORIZONTAL); @@ -1268,7 +1285,7 @@ public final class MainActivity extends Activity { private TextView groupLabel(String text) { TextView label = new TextView(this); label.setText(text); - label.setTextColor(Color.rgb(139, 148, 158)); + label.setTextColor(COLOR_TEXT_DIM); label.setTextSize(11); label.setTypeface(Typeface.DEFAULT_BOLD); label.setGravity(Gravity.CENTER_VERTICAL); @@ -1283,8 +1300,8 @@ public final class MainActivity extends Activity { } }); if (active) { - button.setTextColor(Color.rgb(8, 12, 18)); - button.setBackground(rounded(Color.rgb(86, 211, 219), 7, Color.rgb(86, 211, 219), 1)); + button.setTextColor(Color.rgb(5, 18, 18)); + button.setBackground(rounded(COLOR_ACCENT, 7, COLOR_ACCENT, 1)); } return button; } @@ -1433,15 +1450,15 @@ public final class MainActivity extends Activity { LinearLayout bar = new LinearLayout(this); bar.setOrientation(LinearLayout.VERTICAL); bar.setPadding(dp(8), dp(5), dp(8), dp(6)); - bar.setBackgroundColor(Color.rgb(17, 20, 24)); + bar.setBackgroundColor(COLOR_BAR); LinearLayout row = new LinearLayout(this); row.setOrientation(LinearLayout.HORIZONTAL); row.setGravity(Gravity.BOTTOM); inputField = new EditText(this); - inputField.setTextColor(Color.WHITE); - inputField.setHintTextColor(Color.rgb(150, 158, 168)); + inputField.setTextColor(COLOR_TEXT); + inputField.setHintTextColor(COLOR_TEXT_DIM); inputField.setHint("type, edit, paste"); inputField.setSingleLine(false); inputField.setMinLines(1); @@ -2031,7 +2048,7 @@ public final class MainActivity extends Activity { private HorizontalScrollView createAccessoryBar() { HorizontalScrollView scroller = new HorizontalScrollView(this); scroller.setHorizontalScrollBarEnabled(false); - scroller.setBackgroundColor(Color.rgb(22, 27, 34)); + scroller.setBackgroundColor(COLOR_PANEL); LinearLayout pad = new LinearLayout(this); pad.setOrientation(LinearLayout.VERTICAL); @@ -2071,7 +2088,7 @@ public final class MainActivity extends Activity { private void addPageLabel(LinearLayout row) { TextView label = new TextView(this); label.setText(accessoryPageName()); - label.setTextColor(Color.rgb(139, 148, 158)); + label.setTextColor(COLOR_TEXT_DIM); label.setTextSize(11); label.setGravity(Gravity.CENTER); label.setTypeface(Typeface.DEFAULT_BOLD); @@ -2487,16 +2504,21 @@ public final class MainActivity extends Activity { private Button toolbarButton(String label, View.OnClickListener listener) { Button button = new Button(this); button.setText(label); - button.setTextColor(Color.rgb(235, 241, 248)); - button.setTextSize(12); + button.setTextColor(COLOR_TEXT); + button.setTextSize(11); button.setAllCaps(false); button.setTypeface(Typeface.DEFAULT_BOLD); + button.setIncludeFontPadding(false); button.setMinWidth(0); button.setMinimumWidth(0); - button.setPadding(dp(10), 0, dp(10), 0); + button.setPadding(dp(9), 0, dp(9), 0); button.setBackground(buttonBackground()); button.setGravity(Gravity.CENTER); button.setHapticFeedbackEnabled(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + button.setStateListAnimator(null); + button.setElevation(0); + } button.setOnClickListener(view -> { view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); view.animate().cancel(); @@ -2512,9 +2534,9 @@ public final class MainActivity extends Activity { }); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, - dp(42) + dp(38) ); - params.leftMargin = dp(5); + params.leftMargin = dp(4); button.setLayoutParams(params); return button; } @@ -2536,20 +2558,20 @@ public final class MainActivity extends Activity { } private void styleInput(EditText input) { - input.setTextColor(Color.rgb(240, 246, 252)); - input.setHintTextColor(Color.rgb(139, 148, 158)); + input.setTextColor(COLOR_TEXT); + input.setHintTextColor(COLOR_TEXT_DIM); input.setTextSize(14); input.setSingleLine(true); input.setPadding(dp(10), 0, dp(10), 0); - input.setBackground(rounded(Color.rgb(12, 17, 23), 8, Color.rgb(48, 58, 70), 1)); + input.setBackground(inputBackground()); } private void styleComposerInput(EditText input) { - input.setTextColor(Color.rgb(240, 246, 252)); - input.setHintTextColor(Color.rgb(139, 148, 158)); + input.setTextColor(COLOR_TEXT); + input.setHintTextColor(COLOR_TEXT_DIM); input.setTextSize(14); input.setPadding(dp(10), dp(8), dp(10), dp(8)); - input.setBackground(rounded(Color.rgb(12, 17, 23), 8, Color.rgb(48, 58, 70), 1)); + input.setBackground(inputBackground()); } private Button compactButton(String label, View.OnClickListener listener) { @@ -2563,13 +2585,25 @@ public final class MainActivity extends Activity { private StateListDrawable buttonBackground() { StateListDrawable states = new StateListDrawable(); - states.addState(new int[]{-android.R.attr.state_enabled}, rounded(Color.rgb(24, 30, 37), 8, Color.rgb(35, 42, 50), 1)); - states.addState(new int[]{android.R.attr.state_pressed}, rounded(Color.rgb(64, 78, 94), 8, Color.rgb(91, 108, 128), 1)); - states.addState(new int[]{android.R.attr.state_focused}, rounded(Color.rgb(48, 61, 76), 8, Color.rgb(98, 128, 164), 1)); - states.addState(new int[]{}, rounded(Color.rgb(34, 43, 53), 8, Color.rgb(55, 66, 80), 1)); + states.addState(new int[]{-android.R.attr.state_enabled}, rounded(Color.rgb(20, 23, 27), 8, COLOR_BORDER_SOFT, 1)); + states.addState(new int[]{android.R.attr.state_pressed}, rounded(COLOR_ACCENT_DARK, 8, COLOR_ACCENT, 1)); + states.addState(new int[]{android.R.attr.state_focused}, rounded(Color.rgb(35, 48, 53), 8, COLOR_ACCENT, 1)); + states.addState(new int[]{}, rounded(COLOR_CARD_ALT, 8, COLOR_BORDER, 1)); return states; } + private GradientDrawable cardBackground() { + return rounded(COLOR_CARD, 8, COLOR_BORDER_SOFT, 1); + } + + private GradientDrawable panelBackground() { + return rounded(COLOR_PANEL, 8, COLOR_BORDER_SOFT, 1); + } + + private GradientDrawable inputBackground() { + return rounded(COLOR_FIELD, 8, COLOR_BORDER, 1); + } + private GradientDrawable rounded(int color, int radiusDp, int strokeColor, int strokeDp) { GradientDrawable drawable = new GradientDrawable(); drawable.setColor(color); @@ -2621,7 +2655,7 @@ public final class MainActivity extends Activity { private TextView bodyText(String text) { TextView view = new TextView(this); view.setText(text); - view.setTextColor(Color.rgb(205, 213, 224)); + view.setTextColor(COLOR_TEXT_MUTED); view.setTextSize(13); return view; } @@ -2668,20 +2702,20 @@ public final class MainActivity extends Activity { if (statusText != null) { String value = message == null || message.trim().isEmpty() ? "Ready" : message.trim(); statusText.setText(value); - int bg = Color.rgb(22, 27, 34); + int bg = COLOR_PANEL; int stroke = Color.TRANSPARENT; - int text = Color.rgb(210, 215, 224); + int text = COLOR_TEXT_MUTED; if (tone == STATUS_BUSY) { - bg = Color.rgb(20, 44, 68); - stroke = Color.rgb(44, 96, 142); + bg = Color.rgb(20, 42, 58); + stroke = COLOR_ACCENT; text = Color.rgb(220, 238, 255); } else if (tone == STATUS_SUCCESS) { - bg = Color.rgb(20, 56, 40); - stroke = Color.rgb(42, 118, 78); + bg = Color.rgb(19, 55, 36); + stroke = COLOR_SUCCESS; text = Color.rgb(218, 245, 228); } else if (tone == STATUS_ERROR) { - bg = Color.rgb(72, 28, 31); - stroke = Color.rgb(154, 66, 72); + bg = Color.rgb(72, 27, 33); + stroke = COLOR_DANGER; text = Color.rgb(255, 226, 226); } statusText.setTextColor(text); diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0ca8840..20754ca 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,11 +1,12 @@ - -