Skip to content

Commit

Permalink
Automated release screenshots generation (#177)
Browse files Browse the repository at this point in the history
* added system overlays for iPhone 8 Plus & iPhone 13 Pro

* add device frame (wip)

* scale device frame (wip)

* add text to screenshots (wip)

* added screenshots config json

* reorganized screenshot models

* cleanup

* added fonts for dark screenshots

* typo

* store raw screenshots

* added standalone script to update screenshots

* wip

* refined screenshots naming

* skip metering layout dialog screenshot

* parse ipad name

* added assets for Pixel 6

* typo

* added text for incident light metering

* reorganized store script

* typo

* wip

* synced outlined icons

* added timer screen to screenshot generator

* constrained timer screen timeline for tablets

* added timer screenshot title

* typo

* revised scripts

* track release screenshots

* Update README.md

* iphone 6.5" -> iphone 6.7"

* Update google_play_resources.md

* softened screenshot font colors

* cleanup
  • Loading branch information
vodemn committed May 21, 2024
1 parent 8c016e5 commit f62f658
Show file tree
Hide file tree
Showing 56 changed files with 596 additions and 88 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ ios/Runner/GoogleService-Info.plist
coverage/
test/coverage_helper_test.dart
**/failures/*.png
screenshots/generated/
screenshots/generated/raw/
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ Without further delay behold my new Lightmeter app inspired by Material You (a.k
# Screenshots

<p float="center">
<img src="https://lh3.googleusercontent.com/8Sd-pmNcQ0xAr5opuTeJKWr2OXeQvCoFSdVDSoKQSHHKeNmqF71hqeAdm3yjunY12zY" width="18.8%" />
<img src="https://lh3.googleusercontent.com/rqBv8pT0AdcBy0xEgQY2unV-YEQ5KfUkandAxJ62yYCiSF72HClA_tkb4JT_3UPaIfFP" width="18.8%" />
<img src="https://lh3.googleusercontent.com/-SnYbYSugVfdwYi6m_rd9CzpCZMCIfudhnq0zRIlzEtLSXhrwziWVd2hotygfqiSofI" width="18.8%" />
<img src="https://lh3.googleusercontent.com/UXxptL_dAIJDtrmpEZuSz39Iq4HuPb3ZPeuANfE9XH0De0uZQT83LNdu1AObBPobpg" width="18.8%" />
<img src="https://lh3.googleusercontent.com/15g_SPV8knDLFbz1_-wGNJFsJeyVWZ_y--TGHpk75MaaIdMDyTXY2_TL-Aw8bpOhpw" width="18.8%" />
<img src="screenshots/generated/android/android/light_metering-reflected.png" width="18.8%" />
<img src="screenshots/generated/android/android/light_settings.png" width="18.8%" />
<img src="screenshots/generated/android/android/light_timer.png" width="18.8%" />
<img src="screenshots/generated/android/android/light_equipment-profiles.png" width="18.8%" />
<img src="screenshots/generated/android/android/dark_metering-reflected.png" width="18.8%" />
</p>

# Development
Expand Down
25 changes: 9 additions & 16 deletions doc/google_play_resources.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,19 @@ Lightmeter

## Short description

Simple and powerful metering app inspired by Google's Material Design 3.
A simple and powerful metering app that can be used for any type of camera from film SLR to pinhole to cinematographic.

## Long description

<b>Material Design</b>
The user interface matches every single detail of the material design guidelines to ensure Lightmeter is an eye candy for you.
A simple and easy to use metering app that can be used for any type of camera from film SLR to pinhole to cinematographic. The app contains the following features:

<b>Easy to Use</b>
No complicated or overblown menus but a familiar and clean interface.
- A reflected light meter with spot metering (using the device's camera)
- An incident light meter (using the device's light sensor)
- An in-built timer for shooting long exposures
- A wide range of ISO values sutable even for solarphotograpy
- Reciprocity calculations for a variety of films

<b>Customizability</b>
There is an inbuilt theme engine with many different colors to choose from.

<b>Features</b>
• Incident light metering (uses lightsensor)
• Reflected light metering (needs camera)
• ISO range from 3 to 6400
• Pre-built reciprocity for some films
• Calibration & ND filters
and many more
and many more!

<b>NOTE</b>
The accuracy of the measurements depends on your decice's hardware.
Expand All @@ -34,4 +27,4 @@ Email me, if you need help or detected bugs

## Graphics

[Figma](https://www.figma.com/file/X7pUAsxtjx19Rj8VtBV3Ft/Material-lightmeter?node-id=501%3A1586&t=cWNHaXm024KM4KYn-1)
[Figma](https://www.figma.com/file/X7pUAsxtjx19Rj8VtBV3Ft/Material-lightmeter?node-id=501%3A1586&t=cWNHaXm024KM4KYn-1)
6 changes: 3 additions & 3 deletions integration_test/e2e_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ void testE2E(String description) {
/// Create Praktica + Zenitar profile from scratch
await tester.openSettings();
await tester.tapDescendantTextOf<SettingsScreen>(S.current.equipmentProfiles);
await tester.tap(find.byIcon(Icons.add).first);
await tester.tap(find.byIcon(Icons.add_outlined).first);
await tester.pumpAndSettle();
await tester.setProfileName(mockEquipmentProfiles[0].name);
await tester.expandEquipmentProfileContainer(mockEquipmentProfiles[0].name);
Expand All @@ -63,7 +63,7 @@ void testE2E(String description) {
expect(find.text('1/1000 - B'), findsOneWidget);

/// Create Praktica + Jupiter profile from Zenitar profile
await tester.tap(find.byIcon(Icons.copy).first);
await tester.tap(find.byIcon(Icons.copy_outlined).first);
await tester.pumpAndSettle();
await tester.setProfileName(mockEquipmentProfiles[1].name);
await tester.expandEquipmentProfileContainer(mockEquipmentProfiles[1].name);
Expand Down Expand Up @@ -193,7 +193,7 @@ extension on WidgetTester {
bool deselectAll = true,
}) async {
if (deselectAll) {
await tap(find.byIcon(Icons.deselect));
await tap(find.byIcon(Icons.deselect_outlined));
await pump();
}
for (final value in valuesToSelect) {
Expand Down
3 changes: 3 additions & 0 deletions lib/res/dimens.dart
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,7 @@ class Dimens {
paddingL,
);
static const EdgeInsets dialogMargin = EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0);

// TODO(@vodemn) constrain dialogs with this value
static const double tabletMaxWidth = 600;
}
21 changes: 12 additions & 9 deletions lib/screens/timer/screen_timer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,18 @@ class TimerScreenState extends State<TimerScreen> with TickerProviderStateMixin
const Spacer(),
Padding(
padding: const EdgeInsets.all(Dimens.paddingL),
child: SizedBox.fromSize(
size: Size.square(MediaQuery.sizeOf(context).width - Dimens.paddingL * 4),
child: ValueListenableBuilder(
valueListenable: timelineAnimation,
builder: (_, value, child) => TimerTimeline(
progress: value,
child: TimerText(
timeLeft: Duration(milliseconds: (widget.duration.inMilliseconds * value).toInt()),
duration: widget.duration,
child: ConstrainedBox(
constraints: const BoxConstraints(maxHeight: Dimens.tabletMaxWidth, maxWidth: Dimens.tabletMaxWidth),
child: SizedBox.fromSize(
size: Size.square(MediaQuery.sizeOf(context).width - Dimens.paddingL * 4),
child: ValueListenableBuilder(
valueListenable: timelineAnimation,
builder: (_, value, child) => TimerTimeline(
progress: value,
child: TimerText(
timeLeft: Duration(milliseconds: (widget.duration.inMilliseconds * value).toInt()),
duration: widget.duration,
),
),
),
),
Expand Down
3 changes: 3 additions & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,19 @@ dependencies:
vibration: 1.8.1

dev_dependencies:
args: 2.5.0
bloc_test: 9.1.3
build_runner: 2.4.6
flutter_native_splash: 2.3.5
flutter_test:
sdk: flutter
golden_toolkit: 0.15.0
google_fonts: 3.0.1
image: 4.1.7
integration_test:
sdk: flutter
lint: 2.1.2
logging: 1.2.0
meta: 1.9.1
mocktail: 0.3.0
test: 1.24.3
Expand Down
27 changes: 18 additions & 9 deletions screenshots/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,35 @@ As a user I want to see the most relevant screenshots in the store, so that I ca
- Settings screen

1. Just the screen
2. Opened metering screen layout features dialog

- Equipment profiles screen

1. Just the screen
2. Opened equipment profile ISO picker

- Timer screen

1. Just the screen

> \*also in dark mode
> \*\*Android only
## Run the generator

Screenshots will be stored in the _screenshots/generated/\<platform\>/_ folder.
Release screenshots will be stored in the _screenshots/generated/\<platform\>/_ folder.

### Android
Raw screenshots will be stored in the _screenshots/generated/raw/\<platform\>/_ folder.

### Generate raw screenshots

#### Android

```console
sh screenshots/generate_screenshots.sh <deviceName>
sh screenshots/generate_android_screenshots.sh
```

### iOS
#### iOS

Apple requires screenshots a specific list of devices, so we can implement a custom generator to cover all those devices.

Expand All @@ -48,6 +55,12 @@ Can be run on Simulator.
sh screenshots/generate_ios_screenshots.sh
```

### Apply store constraints and text data

```console
sh screenshots/scripts/convert_to_store_screenshots.sh
```

## List of devices

### Android
Expand All @@ -56,9 +69,5 @@ sh screenshots/generate_ios_screenshots.sh

### iOS

- iPhone 8 Plus
- iPhone 13 Pro
- iPhone 13 Pro Max
- iPhone 15 Pro
- iPhone 15 Pro Max
- iPad Pro (12.9-inch) (6th generation)
44 changes: 44 additions & 0 deletions screenshots/assets/content/screenshot_titles_en.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"screenshots": [
{
"screenshotName": "light_metering-reflected",
"title": "Quick & easy to use",
"subtitle": "with all the necessary controls\nunder your thumb"
},
{
"screenshotName": "light_metering-incident",
"title": "Incident light metering",
"subtitle": "using the light sensor\nof your device"
},
{
"screenshotName": "light_metering-iso-picker",
"title": "Lots of ISO values",
"subtitle": "from 3 and up to 6400"
},
{
"screenshotName": "light_timer",
"title": "In-built timer",
"subtitle": "for the ease of shooting\nlong exposures"
},
{
"screenshotName": "light_settings",
"title": "Useful settings",
"subtitle": "to get the most accurate\nmetering results"
},
{
"screenshotName": "light_equipment-profiles",
"title": "Create multiple profiles",
"subtitle": "to match your\ncamera & lens setups"
},
{
"screenshotName": "light_equipment-profiles-iso-picker",
"title": "Fine-tune results",
"subtitle": "by selecting the values\nthat you use the most"
},
{
"screenshotName": "dark_metering-reflected",
"title": "Match your style",
"subtitle": "with various theme types and colors"
}
]
}
Binary file not shown.
Binary file added screenshots/assets/fonts/SF-Pro-Display-Bold.zip
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit f62f658

Please sign in to comment.