Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[参考] テストの例 #59

Closed
wants to merge 6 commits into from
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
part of 'force_update_config.dart';

class ReadForceUpdateConfig {
const ReadForceUpdateConfig._({
const ReadForceUpdateConfig({
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

モックで差し替えたいので公開する通常のコンストラクタに変えた(flutterfire_gen でそのように生成されるように変える予定)

required this.forceUpdateConfigId,
required this.forceUpdateConfigReference,
// required this.forceUpdateConfigReference,
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

暫定対応としてコメントアウトした

required this.iOSLatestVersion,
required this.iOSMinRequiredVersion,
required this.iOSForceUpdate,
Expand All @@ -17,7 +17,7 @@ class ReadForceUpdateConfig {
});

final String forceUpdateConfigId;
final DocumentReference<ReadForceUpdateConfig> forceUpdateConfigReference;
// final DocumentReference<ReadForceUpdateConfig> forceUpdateConfigReference;
final String iOSLatestVersion;
final String iOSMinRequiredVersion;
final bool iOSForceUpdate;
Expand All @@ -26,10 +26,10 @@ class ReadForceUpdateConfig {
final bool androidForceUpdate;

factory ReadForceUpdateConfig._fromJson(Map<String, dynamic> json) {
return ReadForceUpdateConfig._(
return ReadForceUpdateConfig(
forceUpdateConfigId: json['forceUpdateConfigId'] as String,
forceUpdateConfigReference: json['forceUpdateConfigReference']
as DocumentReference<ReadForceUpdateConfig>,
// forceUpdateConfigReference: json['forceUpdateConfigReference']
// as DocumentReference<ReadForceUpdateConfig>,
iOSLatestVersion: json['iOSLatestVersion'] as String,
iOSMinRequiredVersion: json['iOSMinRequiredVersion'] as String,
iOSForceUpdate: json['iOSForceUpdate'] as bool? ?? false,
Expand All @@ -44,12 +44,12 @@ class ReadForceUpdateConfig {
return ReadForceUpdateConfig._fromJson(<String, dynamic>{
...data,
'forceUpdateConfigId': ds.id,
'forceUpdateConfigReference':
ds.reference.parent.doc(ds.id).withConverter(
fromFirestore: (ds, _) =>
ReadForceUpdateConfig.fromDocumentSnapshot(ds),
toFirestore: (obj, _) => throw UnimplementedError(),
),
// 'forceUpdateConfigReference':
// ds.reference.parent.doc(ds.id).withConverter(
// fromFirestore: (ds, _) =>
// ReadForceUpdateConfig.fromDocumentSnapshot(ds),
// toFirestore: (obj, _) => throw UnimplementedError(),
// ),
});
}

Expand All @@ -63,10 +63,10 @@ class ReadForceUpdateConfig {
String? androidMinRequiredVersion,
bool? androidForceUpdate,
}) {
return ReadForceUpdateConfig._(
return ReadForceUpdateConfig(
forceUpdateConfigId: forceUpdateConfigId ?? this.forceUpdateConfigId,
forceUpdateConfigReference:
forceUpdateConfigReference ?? this.forceUpdateConfigReference,
// forceUpdateConfigReference:
// forceUpdateConfigReference ?? this.forceUpdateConfigReference,
iOSLatestVersion: iOSLatestVersion ?? this.iOSLatestVersion,
iOSMinRequiredVersion:
iOSMinRequiredVersion ?? this.iOSMinRequiredVersion,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@ import '../firestore_documents/force_update_config.dart';

class ForceUpdateConfigRepository {
final _query = ForceUpdateConfigQuery();

/// [ReadForceUpdateConfig] を購読する。
Stream<ReadForceUpdateConfig?> subscribeForceUpdateConfig() =>
_query.subscribeDocument(forceUpdateConfigId: 'forceUpdateConfig');
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../../../auth/auth.dart';
import '../../../force_update/ui/force_update.dart';
import '../../../map/ui/map.dart';
import '../../../scaffold_messenger_controller.dart';
import '../../../user/user.dart';
Expand Down Expand Up @@ -266,6 +267,18 @@ class DevelopmentItemsPage extends ConsumerWidget {
),
),
),
ListTile(
title: const Text(
'forceUpdateページ',
),
// TODO: 後に auto_route を採用して Navigator.pushNamed を使用する予定
onTap: () => Navigator.push<void>(
context,
MaterialPageRoute<void>(
builder: (context) => const ForceUpdatePage(),
),
),
),
],
),
);
Expand Down
74 changes: 74 additions & 0 deletions packages/mottai_flutter_app/lib/force_update/force_update.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import 'dart:io';

import 'package:firebase_common/firebase_common.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../firestore_repository.dart';
import '../package_info.dart';

final forceUpdateStreamProvider =
StreamProvider.autoDispose<ReadForceUpdateConfig?>((ref) {
final repository = ref.watch(forceUpdateConfigRepositoryProvider);
return repository.subscribeForceUpdateConfig();
});

final isForceUpdateProvider = Provider.autoDispose<bool>(
(ref) {
final forceUpdateInfo = ref.watch(forceUpdateStreamProvider).asData?.value;

// 読み込みが終わっていない場合またはエラーの場合
if (forceUpdateInfo == null) {
return false;
} else {
final packageInfo = ref.watch(packageInfoProvider);
final isIOS = Platform.isIOS;
final version = _formatVersionNumber(packageInfo.version);
// iOSの時
if (isIOS) {
// 強制アップデート
if (forceUpdateInfo.iOSForceUpdate) {
return true;
} else {
// バージョンが範囲内になければアップデート
final iOSLatestVersion =
_formatVersionNumber(forceUpdateInfo.iOSLatestVersion);
final iOSMinRequiredVersion =
_formatVersionNumber(forceUpdateInfo.iOSMinRequiredVersion);
if (iOSMinRequiredVersion <= version && version <= iOSLatestVersion) {
return false;
} else {
return true;
}
}
// Androidの時
} else {
// 強制アップデート
if (forceUpdateInfo.androidForceUpdate) {
return true;
} else {
// バージョンが範囲内になければアップデート
final androidLatestVersion =
_formatVersionNumber(forceUpdateInfo.androidLatestVersion);
final androidMinRequiredVersion =
_formatVersionNumber(forceUpdateInfo.androidMinRequiredVersion);
if (androidMinRequiredVersion <= version &&
version <= androidLatestVersion) {
return false;
} else {
return true;
}
}
}
}
},
);

int _formatVersionNumber(String version) {
final sb = StringBuffer();

final versionNumbers = version.split('.');

sb.writeAll(versionNumbers);

return int.parse(sb.toString());
}
115 changes: 115 additions & 0 deletions packages/mottai_flutter_app/lib/force_update/ui/force_update.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../force_update.dart';

class ForceUpdatePage extends ConsumerWidget {
const ForceUpdatePage({super.key});

static const path = '/forceUpdate';
static const name = 'ForceUpdatePage';
static const location = name;

@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
appBar: AppBar(
title: const Text('フォースアップデート情報'),
),
body: ref.watch(forceUpdateStreamProvider).when(
data: (forceUpdateConfig) => SingleChildScrollView(
child: forceUpdateConfig != null
? Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text(
forceUpdateConfig.androidForceUpdate.toString(),
),
subtitle: const Text('androidForceUpdate'),
),
ListTile(
title: Text(
forceUpdateConfig.androidLatestVersion,
),
subtitle: const Text('androidLatestVersion'),
),
ListTile(
title: Text(
forceUpdateConfig.androidMinRequiredVersion,
),
subtitle: const Text('androidMinRequiredVersion'),
),
ListTile(
title: Text(
forceUpdateConfig.iOSForceUpdate.toString(),
),
subtitle: const Text('iOSForceUpdate'),
),
ListTile(
title: Text(
forceUpdateConfig.iOSLatestVersion,
),
subtitle: const Text('iOSLatestVersion'),
),
ListTile(
title: Text(
forceUpdateConfig.iOSMinRequiredVersion,
),
subtitle: const Text('iOSMinRequiredVersion'),
),
ListTile(
title: Text(
ref.watch(isForceUpdateProvider).toString(),
),
subtitle: const Text('アップデートするかどうか'),
),
// if (ref.watch(isForceUpdateProvider))
ElevatedButton(
onPressed: () async {
await showDialog<Widget>(
barrierDismissible: false,
context: context,
builder: (_) => const _ForceUpdateDialog(),
);
},
child: const Text('ダイアログ表示'),
),
],
)
: const SizedBox(),
),
error: (_, __) => const SizedBox(),
loading: () => const Center(child: CircularProgressIndicator()),
),
);
}
}

class _ForceUpdateDialog extends StatelessWidget {
const _ForceUpdateDialog();

@override
Widget build(BuildContext context) {
return AlertDialog(
title:
const Text('最新バージョンを App Store または Google Play Store でダウンロードしてください'),
actions: <Widget>[
ElevatedButton(
onPressed: () {
Navigator.pop(context);
// TODO:アプリAppStoreへ飛ばす処理を追加
},
child: const Text('App Store'),
),
ElevatedButton(
onPressed: () {
Navigator.pop(context);
// TODO:アプリGoogle Play Storeへ飛ばす処理を追加
},
child: const Text('Google Play Store'),
),
],
);
}
}
Loading