Skip to content

Commit 9d998bf

Browse files
committed
Refactor Android UI: MD3, shared transitions, perf, cleanup
- Major UI modernization: Material Design 3 components, new toolbars, and dashboard metrics - Implement shared element transitions and morphing fragments for song details - Refactor RecyclerView adapters to use DiffUtil for smooth, animated updates - Centralize usings and clean up redundant imports - Improve app lifecycle handling with async state persistence - Enhance error handling, code readability, and maintainability - Update WinUI song detail page with better controls and feedback - Numerous bug fixes, null checks, and minor UI/UX improvements
1 parent 5aa7115 commit 9d998bf

File tree

75 files changed

+1095
-1031
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1095
-1031
lines changed

Dimmer/Dimmer.Droid/DimmerAudio/ExoPlayerService.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
using Android.Media;
3333

3434
using MediaController = AndroidX.Media3.Session.MediaController;
35-
36-
using AndroidX.Lifecycle;
3735
using Exception = System.Exception;
3836

3937
namespace Dimmer.DimmerAudio; // Make sure this namespace is correct

Dimmer/Dimmer.Droid/DimmerAudio/NotificationHelper.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using Android.Content;
2-
3-
using AndroidX.Core.App;
1+
using AndroidX.Core.App;
42
using AndroidX.Media3.Common;
53
using AndroidX.Media3.Session;
64
using AndroidX.Media3.UI;

Dimmer/Dimmer.Droid/DimmerAudio/QuickSettingsTileService.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
using AndroidX.Media3.Session;
44

5-
using Google.Android.Material.Dialog;
6-
75
namespace Dimmer.DimmerAudio;
86
[Service(Name = "com.yvanbrunel.dimmer.QuickSettingsTileService", // <<< CHANGE TO YOUR UNIQUE NAME
97
Permission = Android.Manifest.Permission.BindQuickSettingsTile,

Dimmer/Dimmer.Droid/GlobalUsings.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
global using Android.Window;
2121
global using AndroidX.AppCompat.App;
2222
global using AndroidX.RecyclerView.Widget;
23-
global using AndroidX.Transitions;
2423
global using CommunityToolkit.Mvvm.ComponentModel;
2524
global using CommunityToolkit.Mvvm.Input;
2625
global using Dimmer.Data.Models;
@@ -33,12 +32,11 @@
3332
global using Dimmer.Utils;
3433
global using Dimmer.Utils.PageAnimations;
3534
global using Dimmer.ViewModel;
36-
global using Dimmer.ViewModels;
35+
global using Dimmer.ViewModels;
3736
global using Dimmer.ViewsAndPages.NativeViews.Activity;
3837
global using Google.Android.Material.BottomSheet;
3938
global using Google.Android.Material.Button;
4039
global using Google.Android.Material.Card;
41-
global using Google.Android.Material.Shape;
4240
global using Google.Android.Material.TextField;
4341
global using Google.Android.Material.Transition;
4442
global using Microsoft.Maui.Controls;
@@ -50,7 +48,6 @@
5048
global using TextView = Google.Android.Material.TextView.MaterialTextView;
5149
global using TransitionManager = AndroidX.Transitions.TransitionManager;
5250
global using Google.Android.Material.Dialog;
53-
global using Google.Android.Material.SwitchMaterial;
5451

5552
global using DialogFragment = AndroidX.Fragment.App.DialogFragment;
5653
global using Color = Android.Graphics.Color;
@@ -80,7 +77,6 @@
8077
global using Slider = Google.Android.Material.Slider.Slider;
8178

8279
global using CommunityToolkit.Maui.Core.Extensions;
83-
global using CommunityToolkit.Maui.Storage;
8480

8581
global using Dimmer.Data;
8682
global using Dimmer.Interfaces.IDatabase;
@@ -105,8 +101,6 @@
105101
global using TransitionSet = AndroidX.Transitions.TransitionSet;
106102
global using ChangeImageTransform = AndroidX.Transitions.ChangeImageTransform;
107103

108-
global using Resource = Microsoft.Maui.Resource;
109-
110104
global using Android.Text;
111105
global using AndroidX.Core.View;
112106
global using Bumptech.Glide;
@@ -120,6 +114,13 @@
120114
global using System.Reactive.Disposables;
121115
global using System.Reactive.Disposables.Fluent;
122116

117+
global using AndroidX.CoordinatorLayout.Widget;
118+
global using AndroidX.Core.Widget;
119+
global using Dimmer.ViewsAndPages.NativeViews.AlbumSection;
120+
global using Google.Android.Material.Behavior;
121+
global using Google.Android.Material.Floatingtoolbar;
122+
global using Google.Android.Material.Loadingindicator;
123+
global using static Dimmer.ViewsAndPages.NativeViews.SongAdapter;
123124

124125

125126
namespace Dimmer;

Dimmer/Dimmer.Droid/TQL/TqlGuideAdapter.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using Dimmer.DimmerSearch.TQLDoc;
22

3-
using Google.Android.Material.Chip;
4-
53
namespace Dimmer.TQL;
64

75

Dimmer/Dimmer.Droid/UiUtils/SmoothBarView.cs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
6-
7-
8-
using System;
9-
using System.Collections.Generic;
10-
using System.Linq;
11-
using System.Text;
12-
using System.Threading.Tasks;
13-
using Microsoft.Maui.Controls.PlatformConfiguration;
14-
15-
namespace Dimmer.UiUtils;
1+
namespace Dimmer.UiUtils;
162

173
using Android.Animation;
184
using Android.Content;
@@ -24,15 +10,14 @@ namespace Dimmer.UiUtils;
2410
using AndroidX.CoordinatorLayout.Widget;
2511
using AndroidX.Core.Graphics.Drawable;
2612
using AndroidX.Core.View;
27-
using Google.Android.Material.Behavior;
2813
using System;
2914
using System.Collections.Generic;
3015
using System.Linq;
3116

3217

33-
// --- 1. ENUMS & MODELS ---
18+
// --- 1. ENUMS & MODELS ---
3419

35-
public enum BadgeType { Circle, Box }
20+
public enum BadgeType { Circle, Box }
3621
public enum TextOrientation { Side, Bottom }
3722

3823
public class Badge

Dimmer/Dimmer.Droid/UiUtils/UiBuilder.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
1-
using Android.Text;
2-
using AndroidX.Lifecycle;
3-
using CommunityToolkit.Diagnostics;
1+
using CommunityToolkit.Diagnostics;
42
using Google.Android.Material.Snackbar;
5-
using Xamarin.Google.Crypto.Tink.Signature;
63
using static Dimmer.Utils.AppUtil;
74

8-
using TextAlignment = Android.Views.TextAlignment;
9-
105
namespace Dimmer.UiUtils;
116

127
public static class UiBuilder

Dimmer/Dimmer.Droid/Utils/AndroidErrorPresenter.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
using System;
2-
using System.Diagnostics;
3-
using Android.Widget;
4-
using Dimmer.Interfaces;
5-
using Google.Android.Material.Dialog;
6-
71
namespace Dimmer.Utils;
82

93
/// <summary>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using AndroidX.Interpolator.View.Animation;
2+
using Fade = AndroidX.Transitions.Fade;
3+
4+
namespace Dimmer.Utils;
5+
6+
7+
public static class AnimationHelper
8+
{
9+
/// <summary>
10+
/// Executes a Morph (Shared Element) transition from one Fragment to another.
11+
/// </summary>
12+
public static void ShowMorphingFragment(
13+
FragmentManager fragmentManager,
14+
Fragment destinationFragment,
15+
params (View SourceView, string TransitionName)[] sharedElements)
16+
{
17+
// 1. Define the Morphing Animation
18+
var morphTransition = new TransitionSet();
19+
morphTransition.AddTransition(new ChangeBounds());
20+
morphTransition.AddTransition(new ChangeTransform());
21+
morphTransition.AddTransition(new ChangeImageTransform());
22+
23+
// Spring-like bouncy interpolator for a modern feel
24+
morphTransition.SetInterpolator(new FastOutSlowInInterpolator());
25+
morphTransition.SetDuration(350);
26+
27+
// 2. Apply to the Destination Fragment
28+
destinationFragment.SharedElementEnterTransition = morphTransition;
29+
destinationFragment.SharedElementReturnTransition = morphTransition;
30+
31+
// Optional: Fade out the old fragment slightly
32+
var dTrans = new Fade ();
33+
dTrans.SetDuration(300);
34+
destinationFragment.EnterTransition = dTrans;
35+
36+
destinationFragment.ReturnTransition = dTrans;
37+
38+
// 3. Build and Execute Transaction
39+
var transaction = fragmentManager.BeginTransaction();
40+
transaction.SetReorderingAllowed(true); // REQUIRED for shared elements
41+
42+
// Add all shared elements to the transaction
43+
foreach (var element in sharedElements)
44+
{
45+
ViewCompat.SetTransitionName(element.SourceView, element.TransitionName);
46+
transaction.AddSharedElement(element.SourceView, element.TransitionName);
47+
}
48+
49+
// Add the overlay fragment (Assuming your activity has a root container with this ID)
50+
// If you don't have a specific container, Android.Resource.Id.Content is the root of the screen.
51+
transaction.Add(Android.Resource.Id.Content, destinationFragment, "MorphOverlay");
52+
transaction.AddToBackStack("MorphOverlay");
53+
transaction.Commit();
54+
}
55+
}

Dimmer/Dimmer.Droid/Utils/AppUtils.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Security.Cryptography;
2-
using Android.Hardware.Input;
32
using Android.Views.InputMethods;
43
using Application = Android.App.Application;
54
using Path = System.IO.Path;

0 commit comments

Comments
 (0)