Skip to content

Commit

Permalink
強制アップデート時に表示するダイアログ作成
Browse files Browse the repository at this point in the history
  • Loading branch information
narunblog committed Jul 19, 2023
1 parent 3747abb commit 0f1707e
Show file tree
Hide file tree
Showing 3 changed files with 155 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ class ForceUpdateConfigRepository {
final _query = ForceUpdateConfigQuery();

/// [ReadForceUpdateConfig] を購読する。
Stream<List<ReadForceUpdateConfig>> subscribeForceUpdateConfig() =>
_query.subscribeDocuments();
Stream<ReadForceUpdateConfig?> subscribeForceUpdateConfig() =>
_query.subscribeDocument(forceUpdateConfigId: 'forceUpdateConfig');
}
66 changes: 65 additions & 1 deletion packages/mottai_flutter_app/lib/force_update/force_update.dart
Original file line number Diff line number Diff line change
@@ -1,10 +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 forceUpdateFutureProvider =
StreamProvider.autoDispose<List<ReadForceUpdateConfig>>((ref) {
StreamProvider.autoDispose<ReadForceUpdateConfig?>((ref) {
final repository = ref.watch(forceUpdateConfigRepositoryProvider);
return repository.subscribeForceUpdateConfig();
});

final isForceUpdateProvider = Provider.autoDispose<bool>(
(ref) {
final forceUpdateInfo = ref.watch(forceUpdateFutureProvider).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());
}
132 changes: 88 additions & 44 deletions packages/mottai_flutter_app/lib/force_update/ui/force_update.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import 'package:dart_flutter_common/dart_flutter_common.dart';
import 'package:firebase_common/firebase_common.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../force_update.dart';
Expand All @@ -21,51 +18,98 @@ class ForceUpdatePage extends ConsumerWidget {
),
body: ref.watch(forceUpdateFutureProvider).when(
data: (forceUpdateConfig) => SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text(
forceUpdateConfig[0].androidForceUpdate.toString(),
),
subtitle: const Text('androidForceUpdate'),
),
ListTile(
title: Text(
forceUpdateConfig[0].androidLatestVersion,
),
subtitle: const Text('androidLatestVersion'),
),
ListTile(
title: Text(
forceUpdateConfig[0].androidMinRequiredVersion,
),
subtitle: const Text('androidMinRequiredVersion'),
),
ListTile(
title: Text(
forceUpdateConfig[0].iOSForceUpdate.toString(),
),
subtitle: const Text('iOSForceUpdate'),
),
ListTile(
title: Text(
forceUpdateConfig[0].iOSLatestVersion,
),
subtitle: const Text('iOSLatestVersion'),
),
ListTile(
title: Text(
forceUpdateConfig[0].iOSMinRequiredVersion,
),
subtitle: const Text('iOSMinRequiredVersion'),
),
],
),
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'),
),
],
);
}
}

0 comments on commit 0f1707e

Please sign in to comment.