Compare commits
2 Commits
dd9343bef7
...
02e463d3ec
| Author | SHA1 | Date | |
|---|---|---|---|
| 02e463d3ec | |||
| df4405aedf |
@ -1,8 +1,8 @@
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
RELEASE_STORE_FILE=release-key.keystore
|
||||
RELEASE_STORE_PASSWORD=SachikoMiyata123
|
||||
RELEASE_KEY_ALIAS=release_key
|
||||
RELEASE_KEY_PASSWORD=SachikoMiyata123
|
||||
RELEASE_STORE_FILE=upload-keystore.jks
|
||||
RELEASE_STORE_PASSWORD=rogapp
|
||||
RELEASE_KEY_ALIAS=upload
|
||||
RELEASE_KEY_PASSWORD=rogapp
|
||||
org.gradle.jvmargs=--add-opens=java.base/java.util=ALL-UNNAMED
|
||||
8
android/gradle.properties.bck
Normal file
8
android/gradle.properties.bck
Normal file
@ -0,0 +1,8 @@
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
RELEASE_STORE_FILE=release-key.keystore
|
||||
RELEASE_STORE_PASSWORD=SachikoMiyata123
|
||||
RELEASE_KEY_ALIAS=release_key
|
||||
RELEASE_KEY_PASSWORD=SachikoMiyata123
|
||||
org.gradle.jvmargs=--add-opens=java.base/java.util=ALL-UNNAMED
|
||||
@ -14,6 +14,7 @@
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
E99D7D802BF42A06005C8F98 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E99D7D822BF42A06005C8F98 /* InfoPlist.strings */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
@ -47,6 +48,9 @@
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
D464128FC0D5DAEBC1011C26 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
D7C4F924DD034151EFC15038 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
E99D7D7C2BF428D3005C8F98 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E99D7D7D2BF428D3005C8F98 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E99D7D812BF42A06005C8F98 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -85,6 +89,7 @@
|
||||
97C146E51CF9000F007C117D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
E99D7D822BF42A06005C8F98 /* InfoPlist.strings */,
|
||||
9740EEB11CF90186004384FC /* Flutter */,
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
@ -167,11 +172,12 @@
|
||||
};
|
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
developmentRegion = ja;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
ja,
|
||||
);
|
||||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
@ -192,6 +198,7 @@
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
E99D7D802BF42A06005C8F98 /* InfoPlist.strings in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -304,6 +311,7 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C146FB1CF9000F007C117D /* Base */,
|
||||
E99D7D7C2BF428D3005C8F98 /* ja */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
@ -312,10 +320,19 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C147001CF9000F007C117D /* Base */,
|
||||
E99D7D7D2BF428D3005C8F98 /* ja */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E99D7D822BF42A06005C8F98 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
E99D7D812BF42A06005C8F98 /* ja */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
@ -323,6 +340,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
@ -378,11 +396,11 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 453;
|
||||
CURRENT_PROJECT_VERSION = 467;
|
||||
DEVELOPMENT_TEAM = UMNEWT25JR;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 4.5.0;
|
||||
FLUTTER_BUILD_NUMBER = 453;
|
||||
FLUTTER_BUILD_NAME = 4.5.2;
|
||||
FLUTTER_BUILD_NUMBER = 467;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "岐阜ナビ";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness";
|
||||
@ -391,7 +409,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 4.5.0;
|
||||
MARKETING_VERSION = 4.5.2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dvox.gifunavi;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -405,6 +423,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
@ -460,6 +479,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
@ -517,11 +537,11 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 453;
|
||||
CURRENT_PROJECT_VERSION = 467;
|
||||
DEVELOPMENT_TEAM = UMNEWT25JR;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 4.5.0;
|
||||
FLUTTER_BUILD_NUMBER = 453;
|
||||
FLUTTER_BUILD_NAME = 4.5.2;
|
||||
FLUTTER_BUILD_NUMBER = 467;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "岐阜ナビ";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness";
|
||||
@ -530,7 +550,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 4.5.0;
|
||||
MARKETING_VERSION = 4.5.2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dvox.gifunavi;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -549,11 +569,11 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 453;
|
||||
CURRENT_PROJECT_VERSION = 467;
|
||||
DEVELOPMENT_TEAM = UMNEWT25JR;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 4.5.0;
|
||||
FLUTTER_BUILD_NUMBER = 453;
|
||||
FLUTTER_BUILD_NAME = 4.5.2;
|
||||
FLUTTER_BUILD_NUMBER = 467;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "岐阜ナビ";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness";
|
||||
@ -562,7 +582,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 4.5.0;
|
||||
MARKETING_VERSION = 4.5.2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dvox.gifunavi;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
||||
@ -24,28 +24,32 @@
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>FLTEnableImpeller</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>「岐阜ナビは旅のさまざまなチェックポイントで写真を撮影して共有するためにカメラへのアクセスが必要です。これにより、訪問を確認し、体験を向上させることができます。」</string>
|
||||
<string>岐阜ナビはチェックポイントで撮影した写真を写真ライブラリに保存し、通過記録を保持し、競技結果として提出することができます。</string>
|
||||
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
|
||||
<string>「岐阜ナビはアプリが閉じられているときでも位置情報へのアクセスが必要です。これにより、チェックポイントでの自動チェックインを提供し、旅の間のナビゲーション体験を向上させます。」</string>
|
||||
<string>岐阜ナビはアプリが閉じられているときでも位置情報へのアクセスが必要です。これにより、走行履歴の記録ができ、レビュー時の参考にすることができます。</string>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<string>「自動チェックインを有効にし、ナビゲーションを改善するために、岐阜ナビはアプリが使用されていないときでも継続的に位置情報へのアクセスを必要とします。」</string>
|
||||
<string>このアプリではバックグラウンドで位置情報にアクセスします。</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>「岐阜ナビにアプリ使用中の位置情報へのアクセスを許可することで、チェックポイントでのチェックインを有効にし、位置に基づいた情報とガイダンスを提供します。」</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>「岐阜ナビは、ナビゲーション体験を向上させるために、音声コマンドやオーディオフィードバックなどの機能にマイクへのアクセスが必要です。」</string>
|
||||
<string>このアプリはチェックポイントへのチェックインや走行履歴を記録するために、位置情報にアクセスします。</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>「岐阜ナビはチェックポイントで撮影した写真を保存・管理し、他人と旅の様子を共有するために、写真ライブラリへのアクセスが必要です。」</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>Need to save image in phone Album</string>
|
||||
<string>撮影した写真はデバイスのアルバムに保存されます。これにより、不具合時の通過記録を安全に担保することができます。</string>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string></string>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>location</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>「岐阜ナビはチェックポイントで撮影した写真を写真ライブラリに保存し、あなたの旅行の記録を保持し、友人と共有することができます。」</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
@ -63,17 +67,5 @@
|
||||
<false/>
|
||||
<key>io.flutter.embedded_views_preview</key>
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>FLTEnableImpeller</key>
|
||||
<false/>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>location</string>
|
||||
</array>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>This app needs access to location when open.</string>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<string>This app needs access to location when in the background.</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
1
ios/Runner/ja.lproj/LaunchScreen.strings
Normal file
1
ios/Runner/ja.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/ja.lproj/Main.strings
Normal file
1
ios/Runner/ja.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
8
ios/ja.lproj/InfoPlist.strings
Normal file
8
ios/ja.lproj/InfoPlist.strings
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
InfoPlist.strings
|
||||
Runner
|
||||
|
||||
Created by Akira Miyata on 2024/05/15.
|
||||
|
||||
*/
|
||||
NSLocationAlwaysUsageDescription="位置情報は「常に許可」にしてください。";
|
||||
@ -117,8 +117,8 @@ class ChangePasswordPage extends StatelessWidget {
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
child: Text(
|
||||
"login".tr,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
|
||||
9
lib/pages/debug/debug_binding.dart
Normal file
9
lib/pages/debug/debug_binding.dart
Normal file
@ -0,0 +1,9 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/debug/debug_controller.dart';
|
||||
|
||||
class DebugBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<DebugController>(() => DebugController());
|
||||
}
|
||||
}
|
||||
47
lib/pages/debug/debug_controller.dart
Normal file
47
lib/pages/debug/debug_controller.dart
Normal file
@ -0,0 +1,47 @@
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/utils/location_controller.dart';
|
||||
|
||||
class DebugController extends GetxController {
|
||||
final LocationController locationController = Get.find<LocationController>();
|
||||
final gpsSignalStrength = 'high'.obs;
|
||||
final currentPosition = Rx<Position?>(null);
|
||||
final isSimulationMode = false.obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
// 位置情報の更新を監視
|
||||
locationController.locationMarkerPositionStream.listen((position) {
|
||||
if (position != null) {
|
||||
currentPosition.value = Position(
|
||||
latitude: position.latitude,
|
||||
longitude: position.longitude,
|
||||
accuracy: position.accuracy,
|
||||
altitudeAccuracy: 30,
|
||||
headingAccuracy: 30,
|
||||
heading: 0,
|
||||
altitude: 0,
|
||||
speed: 0,
|
||||
speedAccuracy: 0,
|
||||
timestamp: DateTime.now(),
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void setGpsSignalStrength(String value) {
|
||||
gpsSignalStrength.value = value;
|
||||
locationController.setSimulatedSignalStrength(value);
|
||||
}
|
||||
|
||||
void toggleSimulationMode() {
|
||||
isSimulationMode.value = !isSimulationMode.value;
|
||||
locationController.setSimulationMode(isSimulationMode.value);
|
||||
if (!isSimulationMode.value) {
|
||||
// 標準モードに切り替えた場合は、シミュレートされた信号強度をリセット
|
||||
locationController.setSimulatedSignalStrength('low');
|
||||
gpsSignalStrength.value = 'low';
|
||||
}
|
||||
}
|
||||
}
|
||||
63
lib/pages/debug/debug_page.dart
Normal file
63
lib/pages/debug/debug_page.dart
Normal file
@ -0,0 +1,63 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/debug/debug_controller.dart';
|
||||
|
||||
class DebugPage extends GetView<DebugController> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('デバッグモード'),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Text('GPS信号強度'),
|
||||
const SizedBox(height: 20),
|
||||
Obx(
|
||||
() => DropdownButton<String>(
|
||||
value: controller.gpsSignalStrength.value,
|
||||
onChanged: (value) {
|
||||
controller.setGpsSignalStrength(value!);
|
||||
},
|
||||
items: ['high', 'medium', 'low']
|
||||
.map<DropdownMenuItem<String>>((String value) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: value,
|
||||
child: Text(value),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
const Text('現在のGPS座標'),
|
||||
const SizedBox(height: 10),
|
||||
Obx(
|
||||
() => Text(
|
||||
'緯度: ${controller.currentPosition.value?.latitude ?? '-'}, 経度: ${controller.currentPosition.value?.longitude ?? '-'}',
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
const Text('現在のGPS精度'),
|
||||
const SizedBox(height: 10),
|
||||
Obx(
|
||||
() => Text(
|
||||
'精度: ${controller.currentPosition.value?.accuracy.toStringAsFixed(2) ?? '-'} m',
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Obx(
|
||||
() => ElevatedButton(
|
||||
onPressed: controller.toggleSimulationMode,
|
||||
child: Text(controller.isSimulationMode.value
|
||||
? 'シミュレーションモード'
|
||||
: '標準モード'),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -9,6 +9,7 @@ import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/main.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/model/gps_data.dart';
|
||||
@ -221,7 +222,7 @@ class DestinationController extends GetxController {
|
||||
if (accuracy == null) {
|
||||
return true; // 位置情報が取得できていない場合、GPS信号が弱いと見なす
|
||||
}
|
||||
return accuracy > 50;
|
||||
return accuracy > 60;
|
||||
//return locationController.currentPosition.value?.accuracy ?? double.infinity > 50;
|
||||
}
|
||||
|
||||
@ -1071,6 +1072,49 @@ class DestinationController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _saveImageToGallery(String imagePath) async {
|
||||
final status = await Permission.storage.status;
|
||||
if (!status.isGranted) {
|
||||
final result = await Permission.storage.request();
|
||||
if (!result.isGranted) {
|
||||
// ユーザーがストレージの権限を拒否した場合の処理
|
||||
showDialog(
|
||||
context: Get.context!,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('ストレージの権限が必要です'),
|
||||
content: Text(
|
||||
'画像をギャラリーに保存するには、ストレージの権限が必要です。アプリの設定画面で権限を許可してください。'),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text('キャンセル'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text('設定'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
openAppSettings(); // アプリの設定画面を開く
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
final result = await ImageGallerySaver.saveFile(imagePath);
|
||||
print('Image saved to gallery: $result');
|
||||
} catch (e) {
|
||||
print('Failed to save image to gallery: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// 買い物ポイントを作成する関数です。 指定された目的地に対して買い物ポイントの処理を行います。
|
||||
//
|
||||
// 買い物ポイントの作成に失敗した場合のエラーハンドリングを追加することを検討してください。
|
||||
@ -1079,7 +1123,8 @@ class DestinationController extends GetxController {
|
||||
DatabaseHelper db = DatabaseHelper.instance;
|
||||
await db.updateBuyPoint(destination, imageurl);
|
||||
populateDestinations();
|
||||
await _saveImageFromPath(imageurl);
|
||||
//await _saveImageFromPath(imageurl);
|
||||
await _saveImageToGallery(imageurl);
|
||||
|
||||
if (indexController.currentUser.isNotEmpty) {
|
||||
double cpNum = destination.cp!;
|
||||
@ -1135,7 +1180,10 @@ class DestinationController extends GetxController {
|
||||
imageurl = photos[0].path;
|
||||
}
|
||||
debugPrint("imageurl = ${imageurl}");
|
||||
await _saveImageFromPath(imageurl!);
|
||||
//await _saveImageFromPath(imageurl!);
|
||||
}
|
||||
if (imageurl.isNotEmpty) {
|
||||
await _saveImageToGallery(imageurl);
|
||||
}
|
||||
|
||||
populateDestinations();
|
||||
@ -1335,11 +1383,14 @@ class DestinationController extends GetxController {
|
||||
prevLon = currentLon;
|
||||
}
|
||||
lastValidGPSLocation = LatLng(currentLat, currentLon);
|
||||
lastValidLat = currentLat;
|
||||
lastValidLon = currentLon;
|
||||
okToUseGPS = true;
|
||||
lastGPSDataReceivedTime = DateTime.now();
|
||||
hasReceivedGPSData = true;
|
||||
|
||||
} else {
|
||||
debugPrint("....position is null....");
|
||||
checkGPSDataReceived();
|
||||
|
||||
// 信号強度が低い場合、最後に取得した高いまたは中程度の位置情報を使用
|
||||
@ -1351,6 +1402,9 @@ class DestinationController extends GetxController {
|
||||
longitude: lastValidGPSLocation.longitude,
|
||||
accuracy: 0,
|
||||
);
|
||||
currentLat = position.latitude;
|
||||
currentLon = position.longitude;
|
||||
okToUseGPS = false;
|
||||
|
||||
/*
|
||||
if (lastValidLat != 0.0 && lastValidLon != 0.0) {
|
||||
|
||||
@ -281,7 +281,15 @@ class DrawerPage extends StatelessWidget {
|
||||
Get.toNamed(Routes.SETTINGS);
|
||||
},
|
||||
|
||||
)
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.developer_mode),
|
||||
title: const Text('開発者メニュー'),
|
||||
onTap: () {
|
||||
Get.back(); // ドロワーを閉じる
|
||||
Get.toNamed('/debug'); // デバッグ画面に遷移
|
||||
},
|
||||
),
|
||||
// ListTile(
|
||||
// leading: const Icon(Icons.router),
|
||||
// title: Text("my_route".tr),
|
||||
|
||||
@ -104,7 +104,7 @@ class _GpsPageState extends State<GpsPage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("移動履歴"),
|
||||
title: Text("movement_history".tr),
|
||||
),
|
||||
body: Container(
|
||||
child: Obx(
|
||||
|
||||
@ -3,6 +3,7 @@ import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/utils/database_helper.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class HistoryPage extends StatefulWidget {
|
||||
const HistoryPage({super.key});
|
||||
@ -18,7 +19,7 @@ class _HistoryPageState extends State<HistoryPage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("通過履歴"),
|
||||
title: Text("pass_history".tr),
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
@ -68,7 +69,7 @@ class _HistoryPageState extends State<HistoryPage> {
|
||||
);
|
||||
}));
|
||||
} else {
|
||||
return const Center(child: Text("No checkin yet"));
|
||||
return Center(child: Text("no_checkin_yet".tr));
|
||||
}
|
||||
}
|
||||
} else if (snapshot.connectionState ==
|
||||
|
||||
@ -1,46 +1,76 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/search/search_page.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/utils/string_values.dart';
|
||||
|
||||
// 要検討:SearchPageへのナビゲーションにNavigator.pushを使用していますが、一貫性のためにGet.toやGet.toNamedを使用することを検討してください。
|
||||
//
|
||||
class HomePage extends GetView{
|
||||
const HomePage({Key? key}) : super(key: key);
|
||||
class HomePage extends StatefulWidget {
|
||||
@override
|
||||
_HomePageState createState() => _HomePageState();
|
||||
}
|
||||
|
||||
class _HomePageState extends State<HomePage> {
|
||||
bool _isLocationServiceEnabled = true;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_checkLocationService();
|
||||
}
|
||||
|
||||
Future<void> _checkLocationService() async {
|
||||
final serviceEnabled = await Permission.location.serviceStatus.isEnabled;
|
||||
setState(() {
|
||||
_isLocationServiceEnabled = serviceEnabled;
|
||||
});
|
||||
}
|
||||
|
||||
void _showLocationDisabledDialog() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('location_disabled_title'.tr),
|
||||
content: Text('location_disabled_message'.tr),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text('ok'.tr),
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
),
|
||||
TextButton(
|
||||
child: Text('open_settings'.tr),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
openAppSettings();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
title: Text('home'.tr),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text("app_title".tr,
|
||||
style: const TextStyle(
|
||||
color: Colors.blue
|
||||
),
|
||||
),
|
||||
InkWell(
|
||||
onTap: (){
|
||||
Navigator.push(context, MaterialPageRoute(builder: (context) => SearchPage()));
|
||||
},
|
||||
child: Container(
|
||||
height: 32,
|
||||
width: 75,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue,
|
||||
borderRadius: BorderRadius.circular(25),
|
||||
|
||||
),
|
||||
child: const Center(child: Icon(Icons.search),),
|
||||
),
|
||||
Text('welcome'.tr),
|
||||
SizedBox(height: 20),
|
||||
ElevatedButton(
|
||||
onPressed: _isLocationServiceEnabled
|
||||
? () => Get.offNamed(AppPages.INDEX)
|
||||
: () => _showLocationDisabledDialog(),
|
||||
child: Text('start_app'.tr),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
body: Container(),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@ -120,8 +120,8 @@ class LoginPage extends StatelessWidget {
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
child: Text(
|
||||
"login".tr,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
@ -133,7 +133,7 @@ class LoginPage extends StatelessWidget {
|
||||
),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height: 40,
|
||||
height: 36,
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.REGISTER);
|
||||
},
|
||||
@ -154,7 +154,7 @@ class LoginPage extends StatelessWidget {
|
||||
),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height: 40,
|
||||
height: 36,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
},
|
||||
@ -187,6 +187,7 @@ class LoginPage extends StatelessWidget {
|
||||
"rogaining_user_need_tosign_up".tr,
|
||||
style: const TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
fontSize: 10.0
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@ -2,13 +2,12 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'dart:io';
|
||||
|
||||
class PermissionHandlerScreen extends StatefulWidget {
|
||||
const PermissionHandlerScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PermissionHandlerScreen> createState() =>
|
||||
_PermissionHandlerScreenState createState() =>
|
||||
_PermissionHandlerScreenState();
|
||||
}
|
||||
|
||||
@ -21,116 +20,59 @@ class _PermissionHandlerScreenState extends State<PermissionHandlerScreen> {
|
||||
});
|
||||
}
|
||||
|
||||
_checkPermissionStatus() async {
|
||||
Future<void> _checkPermissionStatus() async {
|
||||
PermissionStatus status = await Permission.location.status;
|
||||
|
||||
if (status.isGranted == false) {
|
||||
if (status.isGranted) {
|
||||
if (context.mounted) {
|
||||
showAlert(context);
|
||||
Get.offNamed(AppPages.LOGIN);
|
||||
}
|
||||
} else if (status.isPermanentlyDenied) {
|
||||
await requestPermission();
|
||||
} else {
|
||||
if (mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
if (context.mounted) {
|
||||
_showPermissionRequestDialog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void showAlert(BuildContext context) {
|
||||
void _showPermissionRequestDialog() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: const Text('ロケーション許可'),
|
||||
content: const SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text('ぎふナビ "アプリへようこそ!\n'),
|
||||
Text('収集データ:\n'),
|
||||
Text(
|
||||
'岐阜ナビアプリをより快適にご利用いただくために、チェックポイントでの自動チェックインのための位置情報を収集しています。また、撮影した画像やチェックインした時間を収集し、チャレンジの勝者を決定します。\n'),
|
||||
Text('お客様のデータの使用方法:\n'),
|
||||
Text(
|
||||
'お客様のデータは、アプリを改善し、競争力のある魅力的な体験を提供するのに役立ちます。お客様の位置情報と画像は、個人を特定できない統計データとして処理され、いかなる個人情報にもリンクされないようにしています\n'),
|
||||
Text('お客様の管理:\n'),
|
||||
Text(
|
||||
'お客様はご自身のデータを完全に管理することができます。アプリの設定でいつでも同意を撤回することができます。位置情報の収集に同意しなくても、ぎふナビを楽しむことはできますが、自動チェックインや競技への参加など、一部の機能が制限されることを覚えておいてください。位置情報、画像、時刻情報の利用に同意する場合は「許可」を選択してください。許可しない場合は、「許可しない」を選択してください。あなたの選択は、アプリの他の機能を使用することに影響しません。\n'),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('location_permission_required_title'.tr),
|
||||
content: Text('location_permission_required_message'.tr),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text('cancel'.tr),
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
requestPermission();
|
||||
Navigator.of(context).pop();
|
||||
Get.offNamed(AppPages.HOME);
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text('ok'.tr),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
_requestLocationPermission();
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// 要検討:位置情報の許可が拒否された場合、適切なエラーメッセージを表示することを検討してください。
|
||||
//
|
||||
Future<void> requestPermission() async {
|
||||
PermissionStatus permission = await Permission.location.status;
|
||||
if (permission == PermissionStatus.permanentlyDenied) {
|
||||
showPermanentAlert();
|
||||
void _requestLocationPermission() async {
|
||||
final status = await Permission.location.request();
|
||||
if (status.isGranted) {
|
||||
Get.offNamed(AppPages.LOGIN);
|
||||
} else {
|
||||
PermissionStatus newPermission = await Permission.location.request();
|
||||
if (newPermission != PermissionStatus.granted) {
|
||||
exit(0);
|
||||
} else {
|
||||
if (context.mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
}
|
||||
Get.offNamed(AppPages.HOME);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(
|
||||
body: Text(""),
|
||||
);
|
||||
}
|
||||
|
||||
// 要検討:ユーザーが位置情報の許可を拒否し続けた場合の対処方法を明確にすることをお勧めします。
|
||||
//
|
||||
void showPermanentAlert() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: const Text('無効'),
|
||||
content: const SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text('位置情報が無効になっています'),
|
||||
Text(
|
||||
'このアプリケーションへの位置情報アクセスが無効になっています。続行するには設定>プライバシーとセキュリティ>位置情報サービス>岐阜ナビ で有効にしてください。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () async {
|
||||
await openAppSettings().then(
|
||||
(value) async {
|
||||
if (value) {
|
||||
if (await Permission
|
||||
.location.status.isPermanentlyDenied ==
|
||||
true &&
|
||||
await Permission.location.status.isGranted ==
|
||||
false) {
|
||||
requestPermission(); /* opens app settings until permission is granted */
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
return Scaffold(body: Container());
|
||||
}
|
||||
}
|
||||
188
lib/pages/permission/permission2.dart
Normal file
188
lib/pages/permission/permission2.dart
Normal file
@ -0,0 +1,188 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'dart:io';
|
||||
|
||||
class PermissionHandlerScreen extends StatefulWidget {
|
||||
const PermissionHandlerScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PermissionHandlerScreen> createState() =>
|
||||
_PermissionHandlerScreenState();
|
||||
}
|
||||
|
||||
class _PermissionHandlerScreenState extends State<PermissionHandlerScreen> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_checkPermissionStatus();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _checkPermissionStatus() async {
|
||||
PermissionStatus status = await Permission.location.status;
|
||||
|
||||
if (status.isGranted) {
|
||||
if (context.mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
} else {
|
||||
if (context.mounted) {
|
||||
Get.toNamed(AppPages.HOME);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
_checkPermissionStatus() async {
|
||||
PermissionStatus status = await Permission.location.status;
|
||||
|
||||
if (status.isGranted == false) {
|
||||
if (context.mounted) {
|
||||
showAlert(context);
|
||||
}
|
||||
} else if (status.isPermanentlyDenied) {
|
||||
await requestPermission();
|
||||
} else {
|
||||
if (mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void showAlert(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: Text('location_permission_title'.tr),
|
||||
content: SingleChildScrollView(
|
||||
child: Text('location_permission_content'.tr),
|
||||
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
requestPermission();
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
|
||||
// 要検討:位置情報の許可が拒否された場合、適切なエラーメッセージを表示することを検討してください。
|
||||
//
|
||||
/*
|
||||
Future<void> requestPermission() async {
|
||||
PermissionStatus permission = await Permission.location.status;
|
||||
if (permission == PermissionStatus.permanentlyDenied) {
|
||||
showPermanentAlert();
|
||||
} else {
|
||||
PermissionStatus newPermission = await Permission.location.request();
|
||||
if (newPermission != PermissionStatus.granted) {
|
||||
exit(0);
|
||||
} else {
|
||||
if (context.mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
Future<void> requestPermission() async {
|
||||
PermissionStatus permission = await Permission.location.request();
|
||||
if (permission == PermissionStatus.granted) {
|
||||
if (context.mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
} else if (permission == PermissionStatus.denied) {
|
||||
await showLocationPermissionDeniedDialog();
|
||||
} else if (permission == PermissionStatus.permanentlyDenied) {
|
||||
await showPermanentlyDeniedDialog();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> showLocationPermissionDeniedDialog() async {
|
||||
await showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('location_permission_denied_title'.tr),
|
||||
content: Text('location_permission_denied_message'.tr),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text('ok'.tr),
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> showPermanentlyDeniedDialog() async {
|
||||
await showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('location_permission_permanently_denied_title'.tr),
|
||||
content: Text('location_permission_permanently_denied_message'.tr),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text('open_settings'.tr),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
openAppSettings();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(
|
||||
body: Text(""),
|
||||
);
|
||||
}
|
||||
|
||||
// 要検討:ユーザーが位置情報の許可を拒否し続けた場合の対処方法を明確にすることをお勧めします。
|
||||
//
|
||||
void showPermanentAlert() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: Text('location_disabled_title'.tr),
|
||||
content: SingleChildScrollView(
|
||||
child: Text('location_disabled_content'.tr),
|
||||
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () async {
|
||||
await openAppSettings().then(
|
||||
(value) async {
|
||||
if (value) {
|
||||
if (await Permission
|
||||
.location.status.isPermanentlyDenied ==
|
||||
true &&
|
||||
await Permission.location.status.isGranted ==
|
||||
false) {
|
||||
requestPermission(); /* opens app settings until permission is granted */
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -43,8 +43,8 @@ class RegisterPage extends StatelessWidget {
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
const Text(
|
||||
"サインアップ",
|
||||
Text(
|
||||
"sign_up".tr,
|
||||
style: TextStyle(
|
||||
fontSize: 30,
|
||||
fontWeight: FontWeight.bold,
|
||||
@ -54,7 +54,7 @@ class RegisterPage extends StatelessWidget {
|
||||
height: 20,
|
||||
),
|
||||
Text(
|
||||
"アカウントを作成し、無料です",
|
||||
"create_account".tr,
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
color: Colors.grey[700],
|
||||
@ -69,13 +69,13 @@ class RegisterPage extends StatelessWidget {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Column(
|
||||
children: [
|
||||
makeInput(label: "Eメール", controller: emailController),
|
||||
makeInput(label: "email".tr, controller: emailController),
|
||||
makeInput(
|
||||
label: "パスワード",
|
||||
label: "password".tr,
|
||||
controller: passwordController,
|
||||
obsureText: true),
|
||||
makeInput(
|
||||
label: "パスワードを認証する",
|
||||
label: "confirm_password".tr,
|
||||
controller: confirmPasswordController,
|
||||
obsureText: true)
|
||||
],
|
||||
@ -150,13 +150,13 @@ class RegisterPage extends StatelessWidget {
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Flexible(child: Text("すでにアカウントをお持ちですか?")),
|
||||
Flexible(child: Text("already_have_account".tr)),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
},
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
child: Text(
|
||||
"login".tr,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600, fontSize: 18),
|
||||
),
|
||||
|
||||
@ -18,8 +18,8 @@ class SettingsPage extends GetView<SettingsController> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(
|
||||
'タイマーの長さ',
|
||||
Text(
|
||||
'timer_duration'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
|
||||
@ -21,6 +21,8 @@ import 'package:rogapp/pages/search/search_binding.dart';
|
||||
import 'package:rogapp/pages/search/search_page.dart';
|
||||
import 'package:rogapp/pages/settings/settings_page.dart';
|
||||
import 'package:rogapp/pages/settings/settings_binding.dart';
|
||||
import 'package:rogapp/pages/debug/debug_page.dart';
|
||||
import 'package:rogapp/pages/debug/debug_binding.dart';
|
||||
import 'package:rogapp/pages/subperf/subperf_page.dart';
|
||||
import 'package:rogapp/spa/spa_binding.dart';
|
||||
import 'package:rogapp/spa/spa_page.dart';
|
||||
@ -51,6 +53,7 @@ class AppPages {
|
||||
static const HISTORY = Routes.HISTORY;
|
||||
static const GPS = Routes.GPS;
|
||||
static const SETTINGS = Routes.SETTINGS;
|
||||
static const DEBUG = Routes.DEBUG;
|
||||
|
||||
static final routes = [
|
||||
GetPage(
|
||||
@ -80,7 +83,7 @@ class AppPages {
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.HOME,
|
||||
page: () => const HomePage(),
|
||||
page: () => HomePage(),
|
||||
binding: HomeBinding(),
|
||||
),
|
||||
GetPage(
|
||||
@ -116,6 +119,12 @@ class AppPages {
|
||||
name: Routes.SETTINGS,
|
||||
page: () => const SettingsPage(),
|
||||
binding: SettingsBinding(),
|
||||
)
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.DEBUG,
|
||||
page: () => DebugPage(),
|
||||
binding: DebugBinding(),
|
||||
),
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
@ -27,4 +27,5 @@ abstract class Routes {
|
||||
static const HISTORY = '/history';
|
||||
static const GPS = '/gp';
|
||||
static const SETTINGS = '/settings';
|
||||
static const DEBUG = '/debug';
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ class LocationController extends GetxController {
|
||||
LatLng? lastValidLocation;
|
||||
DateTime lastGPSDataReceivedTime = DateTime.now(); // 最後にGPSデータを受け取った時刻
|
||||
|
||||
bool gpsDebugMode = false;
|
||||
bool gpsDebugMode = true;
|
||||
/*
|
||||
// GPSシミュレーション用のメソッドを追加
|
||||
void setSimulationMode(bool value) {
|
||||
@ -93,6 +93,10 @@ class LocationController extends GetxController {
|
||||
// GPS信号の強弱を判断するメソッドを追加. 10m 以内:強、30m以内:中、それ以上:弱
|
||||
//
|
||||
String getGpsSignalStrength(Position? position) {
|
||||
if (isSimulationMode.value) {
|
||||
return getSimulatedSignalStrength();
|
||||
}
|
||||
|
||||
if (position == null) {
|
||||
gpsDebugMode ? debugPrint("getGpsSignalStrength position is null.") : null;
|
||||
latestSignalStrength.value = "low";
|
||||
@ -110,7 +114,7 @@ class LocationController extends GetxController {
|
||||
latestSignalStrength.value = "high";
|
||||
isGpsSignalWeak = false;
|
||||
return 'high';
|
||||
} else if (accuracy <= 30) {
|
||||
} else if (accuracy <= 50) {
|
||||
latestSignalStrength.value = "medium";
|
||||
isGpsSignalWeak = false;
|
||||
return 'medium';
|
||||
@ -189,9 +193,8 @@ class LocationController extends GetxController {
|
||||
// Use GetX's context to show a dialog
|
||||
Get.dialog(
|
||||
AlertDialog(
|
||||
title: const Text('Location Services Disabled'),
|
||||
content: const Text(
|
||||
'Please enable location services to continue using the app.'),
|
||||
title: Text('location_services_disabled_title'.tr),
|
||||
content: Text('location_services_disabled_title'.tr),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text('OK'),
|
||||
@ -218,9 +221,8 @@ class LocationController extends GetxController {
|
||||
// Show a dialog if permissions are still denied
|
||||
Get.dialog(
|
||||
AlertDialog(
|
||||
title: const Text('Location Permission Denied'),
|
||||
content: const Text(
|
||||
'This app requires location permissions to function properly. Please enable location permissions in your device settings.'),
|
||||
title: Text('location_permission_denied_title'.tr),
|
||||
content: Text('location_permission_denied_main'.tr),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text('OK'),
|
||||
@ -243,12 +245,11 @@ class LocationController extends GetxController {
|
||||
// Show a dialog if permissions are permanently denied
|
||||
Get.dialog(
|
||||
AlertDialog(
|
||||
title: const Text('Location Permission Needed'),
|
||||
content: const Text(
|
||||
'Location permissions have been permanently denied. Please open app settings to enable location permissions.'),
|
||||
title: Text('location_permission_needed_title'.tr),
|
||||
content: Text( 'location_permission_needed_main'.tr),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text('Open Settings'),
|
||||
child: Text('open_settings'.tr),
|
||||
onPressed: () {
|
||||
// Close the dialog and open app settings
|
||||
Get.back();
|
||||
@ -412,4 +413,26 @@ class LocationController extends GetxController {
|
||||
positionStream?.cancel();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
// シミュレーションモードのフラグ
|
||||
RxBool isSimulationMode = RxBool(false);
|
||||
|
||||
// シミュレーションモードを切り替えるための関数
|
||||
void setSimulationMode(bool value) {
|
||||
isSimulationMode.value = value;
|
||||
}
|
||||
|
||||
// GPS信号強度をシミュレートするための変数
|
||||
final Rx<String> _simulatedSignalStrength = Rx<String>('high');
|
||||
|
||||
// GPS信号強度をシミュレートするための関数
|
||||
void setSimulatedSignalStrength(String strength) {
|
||||
_simulatedSignalStrength.value = strength;
|
||||
}
|
||||
|
||||
// シミュレートされた信号強度を取得するための関数
|
||||
String getSimulatedSignalStrength() {
|
||||
return _simulatedSignalStrength.value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -73,7 +73,136 @@ class StringValues extends Translations{
|
||||
"accounted_deleted": "Account deleted",
|
||||
"account_deleted_message": "your account has beed successfully deleted",
|
||||
"privacy": "Privacy policy",
|
||||
"app_developed_by_gifu_dx": "This app was developed by the Gifu Prefecture DX subsidy project."
|
||||
"app_developed_by_gifu_dx": "This app was developed by the Gifu Prefecture DX subsidy project.",
|
||||
|
||||
'location_permission_title': 'Location Permission',
|
||||
'location_permission_content': 'Gifu Navi app collects location data to provide better services.\nLocation data is used for automatic check-in at checkpoints and delivery of notifications.\nLocation data may be collected even when the app is closed or not in use.\nCollected location data is only used as statistical information that cannot identify individuals and is never linked to personal information.\nIf you do not allow the use of location data, please select "Do not allow" on the next screen.',
|
||||
'location_disabled_title': 'Location Service Disabled',
|
||||
'location_disabled_content': 'Location information is disabled.\nTo continue, please enable location services for Gifu Navi in Settings > Privacy and Security > Location Services.',
|
||||
'drawer_title': 'Rogaining participants can view checkpoints by logging in',
|
||||
'app_title': 'Travel Itinerary',
|
||||
'want_to_go': 'Want to Go',
|
||||
'schedule_point': 'Schedule Point',
|
||||
'rog_web': 'Rogaining Website',
|
||||
'rogaining_user_need_tosign_up': "Rogaining participants do not need to sign up.",
|
||||
'add_location': 'Gifu',
|
||||
'finish': 'Finish',
|
||||
'my_route': 'My Route',
|
||||
'visit_history': 'Visit History',
|
||||
'search': 'Search',
|
||||
'login': 'Login',
|
||||
'password': 'Password',
|
||||
'already_have_account': 'Already have an account?',
|
||||
'sign_up': 'Sign Up',
|
||||
'create_account': 'Create an account, it\'s free',
|
||||
'email': 'Email',
|
||||
'confirm_password': 'Confirm Password',
|
||||
'cancel_checkin': 'Cancel Check-in',
|
||||
'go_here': 'Go Here',
|
||||
'start_rogaining': 'Start Rogaining',
|
||||
'in_game': 'In Game',
|
||||
'finish_rogaining': 'Finish Rogaining',
|
||||
'checkin': 'Check-in',
|
||||
'rogaining_not_started': 'Rogaining not started',
|
||||
'confirm': 'Confirm',
|
||||
'clear_rog_data_message': 'Starting rogaining will clear all previous rogaining data. Are you sure you want to start?',
|
||||
'no': 'No',
|
||||
'yes': 'Yes',
|
||||
'retake': 'Retake',
|
||||
'take_photo': 'Take Photo',
|
||||
'take_receipt_photo': 'Please take a photo of the receipt',
|
||||
'buypoint_added': 'Buypoint added.',
|
||||
'no_purchase': 'No Purchase',
|
||||
'complete': 'Complete',
|
||||
'movement_history': 'Movement History',
|
||||
'pass_history': 'Pass History',
|
||||
'no_checkin_yet': 'No check-in yet',
|
||||
'game_status': 'Game Status',
|
||||
'take_cp_photo': 'This is a CP. Please take a photo.',
|
||||
'save_goal_success': 'Goal saved successfully',
|
||||
'save_goal_failed': 'Goal not added',
|
||||
'please_try_again': 'Please try again',
|
||||
'click_start_to_start_rogaining': 'Click start to start rogaining',
|
||||
'at_rogaining_point_start': 'You are at a rogaining point, start rogaining',
|
||||
'start': 'Start',
|
||||
'rogaining_started': 'Rogaining Started',
|
||||
'rogaining_session_started': 'Rogaining session started',
|
||||
'not_started_yet': 'Not started yet',
|
||||
'not_started_rogaining_yet': 'You have not started rogaining yet.',
|
||||
'not_reached_goal_yet': 'Not reached the goal yet',
|
||||
'not_reached_goal_yet_message': 'You have not reached the goal yet.',
|
||||
'reload_qr': 'Reload QR',
|
||||
'read_qr': 'Read QR',
|
||||
'read_qr_code': 'Please read the QR code',
|
||||
'canceled': 'Canceled',
|
||||
'checkin_failed_try_again': 'Check-in failed. Please tap the checkpoint again if necessary.',
|
||||
'rogaining_not_started': 'Rogaining not started',
|
||||
'need_to_start_rogaining': 'You need to tap the start button to begin rogaining',
|
||||
'no_destination': 'No destination',
|
||||
'near_cp_not_checkin': 'Near a CP or distance-ignored CP, in-game but not checked in yet.',
|
||||
'auto_checkin_case': 'Auto check-in case',
|
||||
'non_auto_checkin_case': 'Non-auto check-in case',
|
||||
'normal_cp_case': 'Normal CP case',
|
||||
'non_normal_cp_case': 'Non-normal CP case... what case?',
|
||||
'goal_clock_photo_case': 'Goal clock photo case',
|
||||
'start_case_24_hours_passed': 'Start case and 24 hours have passed since the last goal',
|
||||
'start_cp_24_hours_passed': 'At the start CP, and 24 hours have passed since the last goal,',
|
||||
'standard_cp_not_checkin': 'Standard CP not checked in yet.',
|
||||
'after_checkin_buypoint_case': 'After check-in, buypoint case.',
|
||||
'goal_case': 'Goal case',
|
||||
'start_case': 'Start case',
|
||||
'no_match_skip_process': 'Does not match any conditions, skipping process',
|
||||
'server_error_occurred': 'A server error occurred',
|
||||
'could_not_communicate_with_server': 'Could not communicate with the server',
|
||||
'communication_error_occurred': 'A communication error occurred',
|
||||
'checked_in': 'Checked in.',
|
||||
'cancel_checkin': 'Cancel Check-in',
|
||||
'checkin_canceled_for': 'Check-in canceled for',
|
||||
'error': 'Error',
|
||||
'failed_to_cancel_checkin': 'Failed to cancel check-in.',
|
||||
'buypoint_added': 'Buypoint added',
|
||||
'error_occurred': 'An error occurred',
|
||||
'failed_to_process_checkpoint': 'Failed to process the checkpoint.',
|
||||
'start_rogaining': 'Start Rogaining',
|
||||
'in_competition': 'In Competition',
|
||||
'map_auto_return_message': 'If there is no map operation, it will automatically return to the current location. Please enter the timer seconds. If you check the checkbox, auto-return will not be performed.',
|
||||
'no_auto_return': 'No Auto Return',
|
||||
'failed_to_load_markers': 'Failed to load markers',
|
||||
'screen_switching_error': 'Screen switching error',
|
||||
'failed_to_switch_screen': 'Failed to switch the screen',
|
||||
'timer_duration': 'Timer Duration',
|
||||
'user_data_deletion': 'User Data Deletion',
|
||||
'user_consent_set_for_data_deletion': 'User consent is set for data deletion. User data has been deleted from the app and server',
|
||||
'go_to_gps_signal_area': 'Please go to an area with GPS signal.',
|
||||
'location_service_disabled': 'Location service is disabled. Please enable location service from the settings screen. If you are unsure, please contact the engineering staff.',
|
||||
'location_permission_not_granted': 'Location permission is not granted. Please allow location service for Gifu Navi from the settings screen. If you are unsure, please contact the engineering staff.',
|
||||
'location_service_issue_occurred': 'An issue occurred with the location service. The location service is being restarted, please wait a moment.',
|
||||
'login_failed': 'Login Failed',
|
||||
'check_login_id_or_password': 'Please check your login ID or password.',
|
||||
'communication_error_occurred': 'A communication error occurred',
|
||||
'could_not_communicate_with_server': 'Could not communicate with the server',
|
||||
'before_game': 'Before Game',
|
||||
'location_permission_denied_title': 'Location Permission Denied',
|
||||
'location_permission_denied_message': 'This app requires location permission to function properly. Please grant location permission to continue.',
|
||||
'location_permission_permanently_denied_title': 'Location Permission Permanently Denied',
|
||||
'location_permission_permanently_denied_message': 'Location permission has been permanently denied. Please open app settings to grant location permission.',
|
||||
'open_settings': 'Open Settings',
|
||||
'location_permission_needed_title': 'Location Permission Needed',
|
||||
'location_permission_needed_main': 'Location permissions have been permanently denied. Please open app settings to enable location permissions.',
|
||||
'open_settings': 'Open Settings',
|
||||
'location_services_disabled_title': 'Location Services Disabled',
|
||||
'location_service_disabled_main': 'Please enable location services to continue using the app.',
|
||||
'location_permission_denied_title': 'Location Permission Denied',
|
||||
'location_permission_denied_main': 'This app requires location permissions to function properly. Please enable location permissions in your device settings.',
|
||||
'home': 'Home',
|
||||
'welcome': 'Welcome to Gifu Navi',
|
||||
'location_disabled_message': 'Location services are disabled. Some features may not work properly.',
|
||||
'enable_location_service': 'Enable Location Service',
|
||||
'start_app': 'Start App',
|
||||
'location_permission_required_title': 'Location Permission Required',
|
||||
'location_permission_required_message': 'This app requires access to your location. Please grant permission to continue.',
|
||||
'cancel': 'Cancel',
|
||||
'checkins': 'Check-ins'
|
||||
},
|
||||
'ja_JP': {
|
||||
'drawer_title':'ロゲイニング参加者はログイン するとチェックポイントが参照 できます',
|
||||
@ -135,7 +264,7 @@ class StringValues extends Translations{
|
||||
'goal_not_added' : '目標が追加されていません',
|
||||
'please_try_again' : 'もう一度お試しください',
|
||||
"Click start to start rogaining":"開始をクリックして、ロゲイニングを開始します",
|
||||
"you are at roganing point, start rogaining":"あなたはロガニングポイントにいます、ロガニングを始めてください",
|
||||
"you are at roganing point, start rogaining":"あなたはロゲイニングポイントにいます、ロゲイニングを始めてください",
|
||||
"Start":"始める",
|
||||
"Rogaining Started":"ロゲイニング開始",
|
||||
"Rogaining session started":"ロゲイニングセッション開始",
|
||||
@ -147,7 +276,136 @@ class StringValues extends Translations{
|
||||
"accounted_deleted": "アカウントが削除されました",
|
||||
"account_deleted_message": "あなたのアカウントは正常に削除されました",
|
||||
"privacy": "プライバシーポリシー",
|
||||
"app_developed_by_gifu_dx": "※このアプリは令和4年度岐阜県DX補助金事業で開発されました。"
|
||||
"app_developed_by_gifu_dx": "※このアプリは令和4年度岐阜県DX補助金事業で開発されました。",
|
||||
|
||||
'location_permission_title': 'ロケーション許可',
|
||||
'location_permission_content': 'このアプリでは、位置情報の収集を行います。\n岐阜ナビアプリではチェックポイントの自動チェックインの機能を可能にするために、現在地のデータが収集されます。アプリを閉じている時や、使用していないときにも収集されます。位置情報は、個人を特定できない統計的な情報として、ユーザーの個人情報とは一切結びつかない形で送信されます。お知らせの配信、位置情報の利用を許可しない場合は、この後表示されるダイアログで「許可しない」を選択してください。',
|
||||
'location_disabled_title': '位置情報サービスが無効です',
|
||||
'location_disabled_content': '位置情報が無効になっています\nこのアプリケーションへの位置情報アクセスが無効になっています。続行するには設定>プライバシーとセキュリティ>位置情報サービス>岐阜ナビ で有効にしてください。',
|
||||
'drawer_title': 'ロゲイニング参加者はログイン するとチェックポイントが参照 できます',
|
||||
'app_title': '旅行工程表',
|
||||
'want_to_go': '行きたい',
|
||||
'schedule_point': '予定地点',
|
||||
'rog_web': 'ロゲイニングウェブサイト',
|
||||
'rogaining_user_need_tosign_up': "ロゲイニング参加者はサインアップの必要はありません。",
|
||||
'add_location': '岐阜',
|
||||
'finish': '終了する',
|
||||
'my_route': 'マイルート',
|
||||
'visit_history': '訪問履歴',
|
||||
'search': '検索',
|
||||
'login': 'ログイン',
|
||||
'password': 'パスワード',
|
||||
'already_have_account': 'すでにアカウントをお持ちですか?',
|
||||
'sign_up': 'サインアップ',
|
||||
'create_account': 'アカウントを無料で作成します',
|
||||
'email': 'ゼッケン番号',
|
||||
'confirm_password': 'パスワードを認証する',
|
||||
'cancel_checkin': 'チェックイン取消',
|
||||
'go_here': 'ここへ行く',
|
||||
'start_rogaining': 'ロゲ開始',
|
||||
'in_game': '競技中',
|
||||
'finish_rogaining': 'ロゲゴール',
|
||||
'checkin': 'チェックイン',
|
||||
'rogaining_not_started': 'ロゲは始まっていません',
|
||||
'confirm': '確認',
|
||||
'clear_rog_data_message': 'ロゲを開始すると、今までのロゲデータが全てクリアされます。本当に開始しますか?',
|
||||
'no': 'いいえ',
|
||||
'yes': 'はい',
|
||||
'retake': '再撮影',
|
||||
'take_photo': '撮影',
|
||||
'take_receipt_photo': 'レシートの写真を撮ってください',
|
||||
'buypoint_added': 'お買い物加点を行いました。',
|
||||
'no_purchase': '買い物なし',
|
||||
'complete': '完了',
|
||||
'movement_history': '移動履歴',
|
||||
'pass_history': '通過履歴',
|
||||
'no_checkin_yet': 'チェックインはまだされてません',
|
||||
'game_status': 'ゲームステータス',
|
||||
'take_cp_photo': 'CPです。撮影してください。',
|
||||
'save_goal_success': '目標が保存されました',
|
||||
'save_goal_failed': '目標が追加されていません',
|
||||
'please_try_again': 'もう一度お試しください',
|
||||
'click_start_to_start_rogaining': 'ロゲを開始するには開始をクリックしてください',
|
||||
'at_rogaining_point_start': 'あなたはロガニングポイントにいます、ロガニングを始めてください',
|
||||
'start': '開始',
|
||||
'rogaining_started': 'ロゲイニングを開始しました',
|
||||
'rogaining_session_started': 'ロゲイニングセッションを開始しました',
|
||||
'not_started_yet': 'まだ開始されていません',
|
||||
'not_started_rogaining_yet': 'あなたはまだロゲイニングを始めていません。',
|
||||
'not_reached_goal_yet': 'まだゴールに達していません',
|
||||
'not_reached_goal_yet_message': 'あなたはまだゴールに達していません。',
|
||||
'reload_qr': '再QR読込',
|
||||
'read_qr': 'QR読込',
|
||||
'read_qr_code': 'QRコードを読み取ってください',
|
||||
'canceled': 'キャンセルされました',
|
||||
'checkin_failed_try_again': 'チェックインしていません。必要ならもう一度チェックポイントをタップして下さい。',
|
||||
'rogaining_not_started': 'ロゲが始まっていません',
|
||||
'need_to_start_rogaining': 'ロゲ開始ボタンをタップして、ロゲイニングを始める必要があります',
|
||||
'no_destination': '目的地がない場合',
|
||||
'near_cp_not_checkin': '検知範囲または距離無視CPで、ゲーム中でまだチェックインしていない。',
|
||||
'auto_checkin_case': '自動チェックインの場合',
|
||||
'non_auto_checkin_case': '自動チェックイン以外の場合',
|
||||
'normal_cp_case': '通常CPの場合',
|
||||
'non_normal_cp_case': '通常CP以外の場合....どんな場合?',
|
||||
'goal_clock_photo_case': 'ゴールで時計撮影の場合',
|
||||
'start_case_24_hours_passed': 'スタートの場合で最後のゴールから24時間経過している場合',
|
||||
'start_cp_24_hours_passed': '開始CPで、最後にゴールしてから24時間経過していれば、',
|
||||
'standard_cp_not_checkin': '標準CP まだチェックインしていない。',
|
||||
'after_checkin_buypoint_case': 'チェックイン後で買い物ポイントの場合。',
|
||||
'goal_case': 'ゴールの場合',
|
||||
'start_case': 'スタートの場合',
|
||||
'no_match_skip_process': 'いずれにも当てはまらないので、処理スキップ',
|
||||
'server_error_occurred': 'サーバーエラーがおきました',
|
||||
'could_not_communicate_with_server': 'サーバーと通信できませんでした',
|
||||
'communication_error_occurred': '通信エラーがおきました',
|
||||
'checked_in': 'チェックインしました。',
|
||||
'cancel_checkin': 'チェックイン取り消し',
|
||||
'checkin_canceled_for': 'のチェックインは取り消されました',
|
||||
'error': 'エラー',
|
||||
'failed_to_cancel_checkin': 'チェックイン取り消しに失敗しました。',
|
||||
'buypoint_added': 'お買い物加点を行いました',
|
||||
'error_occurred': 'エラーがおきました',
|
||||
'failed_to_process_checkpoint': 'チェックポイントの処理に失敗しました。',
|
||||
'start_rogaining': 'ロゲ開始',
|
||||
'in_competition': '競技中',
|
||||
'map_auto_return_message': 'マップ操作がなければ自動的に現在地に復帰します。そのタイマー秒数を入れて下さい。チェックボックスをチェックすると、自動復帰は行われなくなります。',
|
||||
'no_auto_return': '自動復帰なし',
|
||||
'failed_to_load_markers': 'マーカーの読み込みに失敗しました',
|
||||
'screen_switching_error': '画面切り替えでエラー',
|
||||
'failed_to_switch_screen': '画面の切り替えができませんでした',
|
||||
'timer_duration': 'タイマーの長さ',
|
||||
'user_data_deletion': 'ユーザーデータを削除する',
|
||||
'user_consent_set_for_data_deletion': 'データを削除するためにユーザーの同意が設定されています アプリとサーバーでユーザーデータが削除されました',
|
||||
'go_to_gps_signal_area': 'GPSの届く場所に行って、信号を拾ってください。',
|
||||
'location_service_disabled': '位置情報サービスが無効になっています。設定画面から位置情報サービスを有効にして下さい。不明な場合にはエンジニアスタッフにお問い合わせください。',
|
||||
'location_permission_not_granted': '位置情報サービスが許可されていません。設定画面から岐阜ナビの位置情報サービスを許可して下さい。不明な場合にはエンジニアスタッフにお問い合わせください。',
|
||||
'location_service_issue_occurred': '位置情報サービスに問題が発生しました。位置情報サービスを再起動していますので少しお待ちください。',
|
||||
'login_failed': 'ログイン失敗',
|
||||
'check_login_id_or_password': 'ログインIDかパスワードを確認して下さい。',
|
||||
'communication_error_occurred': '通信エラーがおきました',
|
||||
'could_not_communicate_with_server': 'サーバーと通信できませんでした',
|
||||
'before_game': 'ゲーム前',
|
||||
'location_permission_denied_title': '位置情報の許可が拒否されました',
|
||||
'location_permission_denied_message': 'このアプリを適切に機能させるには、位置情報の許可が必要です。続行するには、位置情報の許可を付与してください。',
|
||||
'location_permission_permanently_denied_title': '位置情報の許可が永久に拒否されました',
|
||||
'location_permission_permanently_denied_message': '位置情報の許可が永久に拒否されました。位置情報の許可を付与するには、アプリ設定を開いてください。',
|
||||
'open_settings': '設定を開く',
|
||||
'location_permission_needed_title': '位置情報への許可が必要です',
|
||||
'location_permission_needed_main': '位置情報への許可が拒否されています。設定を開いて、位置情報の許可を「岐阜ナビ」に与えてください。',
|
||||
'open_settings': '設定を開く',
|
||||
'location_permission_denied_title': '位置情報へのアクセスが拒否されています。',
|
||||
'location_permission_denied_main': 'この岐阜ナビアプリは正常に動かすには位置情報への許可が必要です。「設定」画面で位置情報の許可を指定してください。',
|
||||
'location_services_disabled_title': '位置情報サービスが拒否されています',
|
||||
'location_service_disabled_main': '岐阜ナビアプリを使用するには位置情報サービスを許可してください。',
|
||||
'home': 'ホーム',
|
||||
'welcome': '岐阜ナビへようこそ',
|
||||
'location_disabled_message': '位置情報サービスが無効になっています。一部の機能が正しく動作しない可能性があります。',
|
||||
'enable_location_service': '位置情報サービスを有効にする',
|
||||
'start_app': 'アプリを開始する',
|
||||
'location_permission_required_title': '位置情報の許可が必要です',
|
||||
'location_permission_required_message': 'このアプリを使用するには、位置情報へのアクセスが必要です。続行するには許可を付与してください。',
|
||||
'cancel': 'キャンセル',
|
||||
'checkins': 'チェックイン',
|
||||
},
|
||||
};
|
||||
}
|
||||
@ -179,18 +179,18 @@ class BottomSheetNew extends GetView<BottomSheetController> {
|
||||
// Show confirmation dialog
|
||||
Get.dialog(
|
||||
AlertDialog(
|
||||
title: const Text("確認"), //confirm
|
||||
content: const Text(
|
||||
"ロゲを開始すると、今までのロゲデータが全てクリアされます。本当に開始しますか?"), //are you sure
|
||||
title: Text("confirm".tr), //confirm
|
||||
content: Text(
|
||||
"clear_rog_data_message".tr), //are you sure
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text("いいえ"), //no
|
||||
child: Text("no".tr), //no
|
||||
onPressed: () {
|
||||
Get.back(); // Close the dialog
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: const Text("はい"), //yes
|
||||
child: Text("yes".tr), //yes
|
||||
onPressed: () async {
|
||||
|
||||
await saveTemporaryImage(destination);
|
||||
@ -219,7 +219,7 @@ class BottomSheetNew extends GetView<BottomSheetController> {
|
||||
: null,
|
||||
child: Obx(
|
||||
()=> Text(
|
||||
destinationController.isInRog.value ? '競技中' : 'ロゲ開始',
|
||||
destinationController.isInRog.value ? 'in_game'.tr : 'start_rogaining'.tr,
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
@ -258,8 +258,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
|
||||
});
|
||||
}
|
||||
: null,
|
||||
child: const Text(
|
||||
"ロゲゴール",
|
||||
child: Text(
|
||||
"finish_rogaining".tr,
|
||||
style: TextStyle(color: Colors.white),
|
||||
));
|
||||
} else if (distanceToDest <=
|
||||
@ -353,12 +353,12 @@ class BottomSheetNew extends GetView<BottomSheetController> {
|
||||
? "ロゲ開始"
|
||||
: destinationController.isInRog.value == true &&
|
||||
destination.cp == -1
|
||||
? "ゲーム中"
|
||||
? "in_game".tr
|
||||
: isAlreadyCheckedIn == true
|
||||
? "ゲーム中"
|
||||
? "in_game".tr
|
||||
: destinationController.isInRog.value == true
|
||||
? "チェックイン"
|
||||
: "ロゲは始まっていません",
|
||||
? "checkin".tr
|
||||
: "rogaining_not_started".tr,
|
||||
style: TextStyle(color: Theme.of(context).colorScheme.onSecondary),
|
||||
),
|
||||
);
|
||||
@ -513,8 +513,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
|
||||
print('Error canceling check-in: $e');
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
"チェックイン取消",
|
||||
child: Text(
|
||||
"cancel_checkin".tr,
|
||||
style: TextStyle(color: Colors.white),
|
||||
)) //remove checkin
|
||||
: Container(),
|
||||
@ -553,7 +553,7 @@ class BottomSheetNew extends GetView<BottomSheetController> {
|
||||
},
|
||||
//go here
|
||||
child: Text(
|
||||
"ここへ行く",
|
||||
"go_here".tr,
|
||||
style: TextStyle(
|
||||
color:
|
||||
Theme.of(context).colorScheme.onPrimary),
|
||||
|
||||
@ -125,7 +125,7 @@ class _GameStateWidgetState extends State<GameStateWidget> {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const Text('ゲームステータス', style: TextStyle(color: Colors.white)),
|
||||
Text('game_status'.tr, style: TextStyle(color: Colors.white)),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.clear, color: Colors.white),
|
||||
onPressed: toggleExpanded,
|
||||
|
||||
@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
||||
# Read more about iOS versioning at
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
version: 1.0.33+33
|
||||
version: 1.0.36+36
|
||||
|
||||
environment:
|
||||
sdk: ">=3.1.0 <4.0.0"
|
||||
|
||||
Reference in New Issue
Block a user