Skip to content

Commit 3041beb

Browse files
chrisbobbegnprice
authored andcommitted
color [nfc]: Add/use extension with argbInt, replacing deprecated value
The `value` getter is deprecated in flutter/engine@eff1b76cf (rolled in flutter/flutter@8c1a93508), and I think that's because it could lose precision for colors in different color spaces that are now possible to represent. We're about to bump the Flutter minimum version to take that change. We're happy with the color space we've been using (sRGB), and this integer representation has been helpful for us. So, add an extension for it, allowing consumers to keep using it without each one needing a `deprecated_member_use`.
1 parent e1fd43c commit 3041beb

File tree

8 files changed

+56
-10
lines changed

8 files changed

+56
-10
lines changed

lib/notifications/display.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import '../model/binding.dart';
1515
import '../model/localizations.dart';
1616
import '../model/narrow.dart';
1717
import '../widgets/app.dart';
18+
import '../widgets/color.dart';
1819
import '../widgets/message_list.dart';
1920
import '../widgets/page.dart';
2021
import '../widgets/store.dart';
@@ -151,7 +152,7 @@ class NotificationDisplayManager {
151152
channelId: NotificationChannelManager.kChannelId,
152153
groupKey: groupKey,
153154

154-
color: kZulipBrandColor.value,
155+
color: kZulipBrandColor.argbInt,
155156
// TODO vary notification icon for debug
156157
smallIconResourceName: 'zulip_notification', // This name must appear in keep.xml too: https://github.com/zulip/zulip-flutter/issues/528
157158

@@ -193,7 +194,7 @@ class NotificationDisplayManager {
193194
groupKey: groupKey,
194195
isGroupSummary: true,
195196

196-
color: kZulipBrandColor.value,
197+
color: kZulipBrandColor.argbInt,
197198
// TODO vary notification icon for debug
198199
smallIconResourceName: 'zulip_notification', // This name must appear in keep.xml too: https://github.com/zulip/zulip-flutter/issues/528
199200
inboxStyle: InboxStyle(

lib/widgets/channel_colors.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class ChannelColorSwatch extends ColorSwatch<ChannelColorVariant> {
209209
swatch = a._swatch.map((key, color) => MapEntry(key, Color.lerp(color, b[key], t)!));
210210
}
211211
}
212-
return ChannelColorSwatch._(Color.lerp(a, b, t)!.value, swatch);
212+
return ChannelColorSwatch._(Color.lerp(a, b, t)!.argbInt, swatch);
213213
}
214214
}
215215

lib/widgets/color.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,26 @@ Color clampLchLightness(Color color, num lowerLimit, num upperLimit) {
1616
.copyWith(lightness: asLab.lightness.clamp(lowerLimit, upperLimit))
1717
.toColor();
1818
}
19+
20+
extension ColorExtension on Color {
21+
/// A 32 bit integer representing this sRGB color.
22+
///
23+
/// If [colorSpace] is not [ColorSpace.sRGB], do not use this.
24+
///
25+
/// The bits are assigned as follows:
26+
///
27+
/// * Bits 24-31 are the alpha value.
28+
/// * Bits 16-23 are the red value.
29+
/// * Bits 8-15 are the green value.
30+
/// * Bits 0-7 are the blue value.
31+
///
32+
/// This is the same form that [Color.new] takes.
33+
int get argbInt {
34+
assert(colorSpace == ColorSpace.sRGB);
35+
36+
return ((a * 255.0).round() & 0xff) << 24 |
37+
((r * 255.0).round() & 0xff) << 16 |
38+
((g * 255.0).round() & 0xff) << 8 |
39+
((b * 255.0).round() & 0xff) << 0;
40+
}
41+
}

test/notifications/display_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:zulip/model/store.dart';
2020
import 'package:zulip/notifications/display.dart';
2121
import 'package:zulip/notifications/receive.dart';
2222
import 'package:zulip/widgets/app.dart';
23+
import 'package:zulip/widgets/color.dart';
2324
import 'package:zulip/widgets/inbox.dart';
2425
import 'package:zulip/widgets/message_list.dart';
2526
import 'package:zulip/widgets/page.dart';
@@ -183,7 +184,7 @@ void main() {
183184
..conversationTitle.equals(expectedTitle)
184185
..messages.deepEquals(messageStyleMessagesChecks))
185186
..number.equals(messageStyleMessages.length)
186-
..color.equals(kZulipBrandColor.value)
187+
..color.equals(kZulipBrandColor.argbInt)
187188
..smallIconResourceName.equals('zulip_notification')
188189
..extras.which((it) => it.isNotNull()
189190
..deepEquals(<String, String>{
@@ -203,7 +204,7 @@ void main() {
203204
..channelId.equals(NotificationChannelManager.kChannelId)
204205
..contentTitle.isNull()
205206
..contentText.isNull()
206-
..color.equals(kZulipBrandColor.value)
207+
..color.equals(kZulipBrandColor.argbInt)
207208
..smallIconResourceName.equals('zulip_notification')
208209
..extras.isNull()
209210
..groupKey.equals(expectedGroupKey)

test/widgets/color_test.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'dart:ui';
2+
3+
import 'package:checks/checks.dart';
4+
import 'package:test/scaffolding.dart';
5+
import 'package:zulip/widgets/color.dart';
6+
7+
void main() {
8+
group('ColorExtension', () {
9+
test('argbInt smoke', () {
10+
const testCases = [
11+
0xffffffff, 0x00000000, 0x12345678, 0x87654321, 0xfedcba98, 0x89abcdef];
12+
13+
for (final testCase in testCases) {
14+
check(Color(testCase).argbInt).equals(testCase);
15+
}
16+
});
17+
});
18+
}

test/widgets/inbox_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart';
44
import 'package:zulip/api/model/events.dart';
55
import 'package:zulip/api/model/model.dart';
66
import 'package:zulip/model/store.dart';
7+
import 'package:zulip/widgets/color.dart';
78
import 'package:zulip/widgets/icons.dart';
89
import 'package:zulip/widgets/inbox.dart';
910
import 'package:zulip/widgets/channel_colors.dart';
@@ -470,7 +471,7 @@ void main() {
470471
});
471472

472473
testWidgets('uncollapsed header changes background color when [subscription.color] changes', (tester) async {
473-
final initialColor = Colors.indigo.value;
474+
final initialColor = Colors.indigo.argbInt;
474475

475476
final stream = eg.stream(streamId: 1);
476477
await setupPage(tester,
@@ -483,7 +484,7 @@ void main() {
483484
check(streamHeaderBackgroundColor(tester, 1))
484485
.equals(ChannelColorSwatch.light(initialColor).barBackground);
485486

486-
final newColor = Colors.orange.value;
487+
final newColor = Colors.orange.argbInt;
487488
store.handleEvent(SubscriptionUpdateEvent(id: 1, streamId: 1,
488489
property: SubscriptionProperty.color, value: newColor));
489490
await tester.pump();

test/widgets/message_list_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:zulip/model/localizations.dart';
1515
import 'package:zulip/model/narrow.dart';
1616
import 'package:zulip/model/store.dart';
1717
import 'package:zulip/widgets/autocomplete.dart';
18+
import 'package:zulip/widgets/color.dart';
1819
import 'package:zulip/widgets/content.dart';
1920
import 'package:zulip/widgets/emoji_reaction.dart';
2021
import 'package:zulip/widgets/icons.dart';
@@ -755,7 +756,7 @@ void main() {
755756
});
756757

757758
testWidgets('color of recipient header background', (tester) async {
758-
final subscription = eg.subscription(stream, color: Colors.red.value);
759+
final subscription = eg.subscription(stream, color: Colors.red.argbInt);
759760
final swatch = ChannelColorSwatch.light(subscription.color);
760761
await setupMessageListPage(tester,
761762
messages: [eg.streamMessage(stream: subscription)],
@@ -770,7 +771,7 @@ void main() {
770771

771772
testWidgets('color of stream icon', (tester) async {
772773
final stream = eg.stream(isWebPublic: true);
773-
final subscription = eg.subscription(stream, color: Colors.red.value);
774+
final subscription = eg.subscription(stream, color: Colors.red.argbInt);
774775
final swatch = ChannelColorSwatch.light(subscription.color);
775776
await setupMessageListPage(tester,
776777
messages: [eg.streamMessage(stream: subscription)],

test/widgets/subscription_list_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33
import 'package:flutter_test/flutter_test.dart';
44
import 'package:zulip/api/model/initial_snapshot.dart';
55
import 'package:zulip/api/model/model.dart';
6+
import 'package:zulip/widgets/color.dart';
67
import 'package:zulip/widgets/icons.dart';
78
import 'package:zulip/widgets/channel_colors.dart';
89
import 'package:zulip/widgets/subscription_list.dart';
@@ -232,7 +233,7 @@ void main() {
232233
final unreadMsgs = eg.unreadMsgs(channels: [
233234
UnreadChannelSnapshot(streamId: stream.streamId, topic: 'a', unreadMessageIds: [1, 2]),
234235
]);
235-
final subscription = eg.subscription(stream, color: Colors.red.value);
236+
final subscription = eg.subscription(stream, color: Colors.red.argbInt);
236237
final swatch = ChannelColorSwatch.light(subscription.color);
237238
await setupStreamListPage(tester, subscriptions: [
238239
subscription,

0 commit comments

Comments
 (0)