Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Expand All @@ -8,6 +7,7 @@

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" android:minSdkVersion="34"/>

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

Expand Down
8 changes: 5 additions & 3 deletions lib/api/exptech.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart';
import 'package:maplibre_gl/maplibre_gl.dart';

import 'package:dpip/api/model/announcement.dart';
import 'package:dpip/api/model/changelog/changelog.dart';
import 'package:dpip/api/model/crowdin/localization_progress.dart';
Expand All @@ -24,7 +27,6 @@ import 'package:dpip/core/preference.dart';
import 'package:dpip/models/settings/notify.dart';
import 'package:dpip/utils/extensions/response.dart';
import 'package:dpip/utils/extensions/string.dart';
import 'package:http/http.dart';

class ExpTech {
String? apikey;
Expand Down Expand Up @@ -486,8 +488,8 @@ class ExpTech {
}

/// 回傳所在地
Future<String> updateDeviceLocation({required String token, required String lat, required String lng}) async {
final requestUrl = Route.location(token: token, lat: lat, lng: lng);
Future<String> updateDeviceLocation({required String token, required LatLng coordinates}) async {
final requestUrl = Route.location(token: token, lat: '${coordinates.latitude}', lng: '${coordinates.longitude}');

final res = await get(requestUrl);

Expand Down
59 changes: 36 additions & 23 deletions lib/app/home/_widgets/eew_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,16 @@ class EewCard extends StatefulWidget {
}

class _EewCardState extends State<EewCard> {
late int localIntensity;
late int localArrivalTime;
int? localIntensity;
int? localArrivalTime;
int countdown = 0;

Timer? _timer;

void _updateCountdown() {
final remainingSeconds = ((localArrivalTime - GlobalProviders.data.currentTime) / 1000).floor();
if (localArrivalTime == null) return;

final remainingSeconds = ((localArrivalTime! - GlobalProviders.data.currentTime) / 1000).floor();
if (remainingSeconds < -1) return;

setState(() => countdown = remainingSeconds);
Expand All @@ -45,17 +47,19 @@ class _EewCardState extends State<EewCard> {
void initState() {
super.initState();

final info = eewLocationInfo(
widget.data.info.magnitude,
widget.data.info.depth,
widget.data.info.latitude,
widget.data.info.longitude,
GlobalProviders.location.coordinateNotifier.value.latitude,
GlobalProviders.location.coordinateNotifier.value.longitude,
);
if (GlobalProviders.location.coordinates != null) {
final info = eewLocationInfo(
widget.data.info.magnitude,
widget.data.info.depth,
widget.data.info.latitude,
widget.data.info.longitude,
GlobalProviders.location.coordinates!.latitude,
GlobalProviders.location.coordinates!.longitude,
);

localIntensity = intensityFloatToInt(info.i);
localArrivalTime = (widget.data.info.time + sWaveTimeByDistance(widget.data.info.depth, info.dist)).floor();
localIntensity = intensityFloatToInt(info.i);
localArrivalTime = (widget.data.info.time + sWaveTimeByDistance(widget.data.info.depth, info.dist)).floor();
}

_updateCountdown();
_timer = Timer.periodic(const Duration(seconds: 1), (_) => _updateCountdown());
Expand Down Expand Up @@ -118,22 +122,31 @@ class _EewCardState extends State<EewCard> {
padding: const EdgeInsets.only(top: 8),
child: StyledText(
text:
'{time} 左右,<bold>{location}</bold>附近發生有感地震,預估規模 <bold>M{magnitude}</bold>、所在地最大震度<bold>{intensity}</bold>。'
.i18n
.args({
'time': widget.data.info.time.toSimpleDateTimeString(context),
'location': widget.data.info.location,
'magnitude': widget.data.info.magnitude.toStringAsFixed(1),
'intensity': localIntensity.asIntensityLabel,
}),
localIntensity != null
? '{time} 左右,<bold>{location}</bold>附近發生有感地震,預估規模 <bold>M{magnitude}</bold>、所在地最大震度<bold>{intensity}</bold>。'
.i18n
.args({
'time': widget.data.info.time.toSimpleDateTimeString(context),
'location': widget.data.info.location,
'magnitude': widget.data.info.magnitude.toStringAsFixed(1),
'intensity': localIntensity!.asIntensityLabel,
})
: '{time} 左右,<bold>{location}</bold>附近發生有感地震,預估規模 <bold>M{magnitude}</bold>、深度<bold>{depth}</bold>公里。'
.i18n
.args({
'time': widget.data.info.time.toSimpleDateTimeString(context),
'location': widget.data.info.location,
'magnitude': widget.data.info.magnitude.toStringAsFixed(1),
'depth': widget.data.info.depth.toStringAsFixed(1),
}),
style: context.textTheme.bodyLarge!.copyWith(color: context.colors.onErrorContainer),
tags: {'bold': StyledTextTag(style: const TextStyle(fontWeight: FontWeight.bold))},
),
),
Selector<SettingsLocationModel, String?>(
selector: (context, model) => model.code,
builder: (context, code, child) {
if (code == null) {
if (code == null || localIntensity == null) {
return const SizedBox.shrink();
}

Expand All @@ -160,7 +173,7 @@ class _EewCardState extends State<EewCard> {
Padding(
padding: const EdgeInsets.only(top: 12, bottom: 8),
child: Text(
localIntensity.asIntensityLabel,
localIntensity!.asIntensityLabel,
style: context.textTheme.displayMedium!.copyWith(
fontWeight: FontWeight.bold,
color: context.colors.onErrorContainer,
Expand Down
2 changes: 1 addition & 1 deletion lib/app/home/_widgets/thunderstorm_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class ThunderstormCard extends StatelessWidget {
padding: const EdgeInsets.only(top: 8),
child: StyledText(
text: '您所在區域附近有劇烈雷雨或降雨發生,請注意防範,持續至 <bold>{time}</bold> 。'.i18n.args({
'time': history.time.expiresAt.toSimpleDateTimeString(context),
'time': history.time.expiresAt.toSimpleDateTimeString(),
}),
style: context.textTheme.bodyLarge!.copyWith(color: context.theme.extendedColors.onBlueContainer),
tags: {'bold': StyledTextTag(style: const TextStyle(fontWeight: FontWeight.bold))},
Expand Down
6 changes: 3 additions & 3 deletions lib/app/home/page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class _HomePageState extends State<HomePage> {
if (_isLoading) return;

final auto = GlobalProviders.location.auto;
final code = GlobalProviders.location.codeNotifier.value;
final code = GlobalProviders.location.code;
final location = Global.location[code];

if (code == null || location == null) {
Expand Down Expand Up @@ -123,7 +123,7 @@ class _HomePageState extends State<HomePage> {
super.initState();

WidgetsBinding.instance.addPostFrameCallback((_) => _checkVersion());
GlobalProviders.location.codeNotifier.addListener(_refresh);
GlobalProviders.location.$code.addListener(_refresh);
_refresh();
}

Expand Down Expand Up @@ -218,7 +218,7 @@ class _HomePageState extends State<HomePage> {

@override
void dispose() {
GlobalProviders.location.codeNotifier.removeListener(_refresh);
GlobalProviders.location.$code.removeListener(_refresh);
super.dispose();
}
}
Loading
Loading