me-web? 0.3.1: sharing offered when the check ends; an Android icon that fits

- The offer to share the findings appeared only after the "test from outside?" question was
  answered, so scrolling past it meant no offer at all. It now appears as soon as the check
  ends (hidden only while the outside test runs), and a payload built later still carries
  the outside test's result.
- Android gets an adaptive launcher icon: the drawing as a vector inside the 66-unit safe
  zone over the background colour, plus a monochrome layer for themed icons. The splash
  screen uses the same vector, so it is neither cut by the circle nor blurred from a
  192-pixel picture. The PNG stays for Android 7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-15 08:31:10 +02:00
1 parent 37752f9f07
commit 9378a52fab
13 files changed
+57 -7

No files matched your search

+5
View File
@@ -111,6 +111,11 @@ The Android release key: alias `meweb`, certificate SHA-256
properties; one nested property function left it unevaluated (`XA0003`).
- **A headless Avalonia session does not end on its own** while the pulse animation runs: the screenshot tool calls
`Environment.Exit(0)` after dispatching.
- **Launchers and the Android 12 splash crop the icon to their own shape.** The launcher icon is the adaptive
`mipmap-anydpi-v26/icon.xml` (background colour, `drawable/icon_foreground.xml`, `drawable/icon_monochrome.xml` for
themed icons), and the splash uses the same foreground. Both vectors hold `branding/meweb.svg`'s drawing scaled into
the central 66 of 108 units around its smallest enclosing circle; a change to the drawing goes into all three files.
The plain `mipmap-xxxhdpi/icon.png` is only for Android 7.x.
- **The macOS apphost is ad-hoc signed by the .NET 10 SDK even on Linux** (`LC_CODE_SIGNATURE` present); Apple
Silicon refuses unsigned arm64 code, so never strip it.
- **The Windows single-file publish drops native `.pdb` files beside the exe**; only `meweb.exe` ships.
+1 -1
View File
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>0.3.0</Version>
<Version>0.3.1</Version>
<Product>me-web?</Product>
<Company>Arasaka di Hvozdikov Yevheniy</Company>
<Copyright>© 2026 Arasaka di Hvozdikov Yevheniy</Copyright>
+1 -1
View File
@@ -8,7 +8,7 @@ namespace MeWeb.Android;
[Activity(
Label = "me-web?",
Theme = "@style/MeWebTheme.NoActionBar",
Icon = "@drawable/icon",
Icon = "@mipmap/icon",
MainLauncher = true,
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode | ConfigChanges.Locale | ConfigChanges.LayoutDirection)]
public class MainActivity : AvaloniaMainActivity
@@ -4,5 +4,5 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<application android:label="me-web?" android:icon="@drawable/icon" android:supportsRtl="true" />
<application android:label="me-web?" android:icon="@mipmap/icon" android:supportsRtl="true" />
</manifest>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportHeight="108">
<group android:scaleX="0.15136" android:scaleY="0.15136" android:translateX="14.908" android:translateY="12.875">
<path android:pathData="M110,300 L230,196 L350,300 L350,404 L110,404 Z"
android:fillColor="#2C222D" android:strokeColor="#F0EAEF" android:strokeWidth="18" android:strokeLineJoin="round" />
<path android:pathData="M208,320 L252,320 A8,8 0 0 1 260,328 L260,396 A8,8 0 0 1 252,404 L208,404 A8,8 0 0 1 200,396 L200,328 A8,8 0 0 1 208,320 Z"
android:fillColor="#E04A55" />
<path android:pathData="M330,170 A70,70 0 0 1 400,240"
android:strokeColor="#E04A55" android:strokeWidth="18" android:strokeLineCap="round" />
<path android:pathData="M330,116 A124,124 0 0 1 454,240"
android:strokeColor="#E04A55" android:strokeWidth="18" android:strokeLineCap="round" android:strokeAlpha="0.7" />
<path android:pathData="M312,240 A18,18 0 1 0 348,240 A18,18 0 1 0 312,240 Z"
android:fillColor="#E04A55" />
</group>
</vector>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportHeight="108">
<group android:scaleX="0.15136" android:scaleY="0.15136" android:translateX="14.908" android:translateY="12.875">
<path android:pathData="M110,300 L230,196 L350,300 L350,404 L110,404 Z"
android:strokeColor="#FFFFFF" android:strokeWidth="18" android:strokeLineJoin="round" />
<path android:pathData="M208,320 L252,320 A8,8 0 0 1 260,328 L260,396 A8,8 0 0 1 252,404 L208,404 A8,8 0 0 1 200,396 L200,328 A8,8 0 0 1 208,320 Z"
android:fillColor="#FFFFFF" />
<path android:pathData="M330,170 A70,70 0 0 1 400,240"
android:strokeColor="#FFFFFF" android:strokeWidth="18" android:strokeLineCap="round" />
<path android:pathData="M330,116 A124,124 0 0 1 454,240"
android:strokeColor="#FFFFFF" android:strokeWidth="18" android:strokeLineCap="round" />
<path android:pathData="M312,240 A18,18 0 1 0 348,240 A18,18 0 1 0 312,240 Z"
android:fillColor="#FFFFFF" />
</group>
</vector>
@@ -3,5 +3,5 @@
<item>
<color android:color="@color/splash_background" />
</item>
<item android:drawable="@drawable/icon" android:width="120dp" android:height="120dp" android:gravity="center" />
<item android:drawable="@drawable/icon_foreground" android:width="180dp" android:height="180dp" android:gravity="center" />
</layer-list>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/icon_background" />
<foreground android:drawable="@drawable/icon_foreground" />
<monochrome android:drawable="@drawable/icon_monochrome" />
</adaptive-icon>
@@ -6,7 +6,7 @@
<item name="android:windowBackground">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowSplashScreenBackground">@color/splash_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/icon</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/icon_foreground</item>
<item name="postSplashScreenTheme">@style/MeWebTheme.Main</item>
</style>
<style name="MeWebTheme.Main" parent="MeWebTheme.NoActionBar">
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="splash_background">#1B141C</color>
<color name="icon_background">#1B141C</color>
</resources>
+5 -1
View File
@@ -77,9 +77,11 @@ public partial class MainViewModel : ObservableObject
public partial bool AskReach { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowShareOffer))]
public partial bool IsReaching { get; set; }
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowShareOffer))]
public partial bool OfferShare { get; set; }
[ObservableProperty]
@@ -100,6 +102,7 @@ public partial class MainViewModel : ObservableObject
public bool CanOpenPorts => lastRun?.Router?.AnyAnswer == true && lastRun.PublicV4 is not null && lastRun.Local?.LocalV4 is not null;
public bool ShowShareResult => ShareResult is not null;
public bool ShowShareOffer => OfferShare && !IsReaching;
public bool ShowShared => Shared.Count > 0;
public IReadOnlyList<Language> Languages { get; } = Services.Languages.All;
@@ -203,6 +206,7 @@ public partial class MainViewModel : ObservableObject
{
lastRun = await runner.Run((finding, run) => Dispatcher.UIThread.Post(() => Apply(finding, run)), ct);
ShowUses(lastRun);
OfferShare = true;
OnPropertyChanged(nameof(CanOpenPorts));
AskReach = lastRun.PublicV4 is not null || lastRun.PublicV6 is not null;
if (!AskReach) SettleReach(null);
@@ -253,7 +257,6 @@ public partial class MainViewModel : ObservableObject
Cards.First(c => c.Id == CheckId.Reach).Finding = finding;
lastRun.Uses = Core.Checks.Uses.Decide(lastRun);
ShowUses(lastRun);
OfferShare = true;
}
void ShowUses(RunReport run)
@@ -336,6 +339,7 @@ public partial class MainViewModel : ObservableObject
instant = false;
OnPropertyChanged(nameof(CanOpenPorts));
AskReach = run.Reach is null;
OfferShare = true;
}
[RelayCommand]
+1 -1
View File
@@ -250,7 +250,7 @@
</ItemsControl>
</StackPanel>
<Border Classes="consent" IsVisible="{Binding OfferShare}" MaxWidth="760">
<Border Classes="consent" IsVisible="{Binding ShowShareOffer}" MaxWidth="760">
<StackPanel Spacing="12">
<TextBlock Classes="section" Margin="0" Text="{s:Tr ShareOfferTitle}" />
<TextBlock Classes="body" Text="{s:Tr ShareOfferBody}" />