Initial project

This commit is contained in:
Cody
2026-03-06 14:56:17 +08:00
parent 977b627b15
commit bf9e099747
1180 changed files with 50973 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
export 'src/presentation/facade/l10n_sdk_api.dart';

View File

@@ -0,0 +1,17 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'l10n_sdk_platform_interface.dart';
/// An implementation of [L10nSdkPlatform] that uses method channels.
class MethodChannelL10nSdk extends L10nSdkPlatform {
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel('l10n_sdk');
@override
Future<String?> getPlatformVersion() async {
final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
return version;
}
}

View File

@@ -0,0 +1,29 @@
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import 'l10n_sdk_method_channel.dart';
abstract class L10nSdkPlatform extends PlatformInterface {
/// Constructs a L10nSdkPlatform.
L10nSdkPlatform() : super(token: _token);
static final Object _token = Object();
static L10nSdkPlatform _instance = MethodChannelL10nSdk();
/// The default instance of [L10nSdkPlatform] to use.
///
/// Defaults to [MethodChannelL10nSdk].
static L10nSdkPlatform get instance => _instance;
/// Platform-specific implementations should set this with their own
/// platform-specific class that extends [L10nSdkPlatform] when
/// they register themselves.
static set instance(L10nSdkPlatform instance) {
PlatformInterface.verifyToken(instance, _token);
_instance = instance;
}
Future<String?> getPlatformVersion() {
throw UnimplementedError('platformVersion() has not been implemented.');
}
}

View File

@@ -0,0 +1,24 @@
class L10nSdkMethodChannel
{
// Channel Name
static const String channelName = 'l10n_sdk';
//---------------- Flutter call native ----------------
static const String requestPermission = 'requestPermission';
//---------------- Flutter call native ----------------
//---------------- native call Flutter ----------------
//---------------- native call Flutter ----------------
}

View File

@@ -0,0 +1,14 @@
import '../../../l10n_sdk_platform_interface.dart';
class L10nSdkMethodChannelDataSource
{
final L10nSdkPlatform platform;
L10nSdkMethodChannelDataSource(this.platform);
Future<String?> getPlatformVersion() async {
return await getPlatformVersion();
}
}

View File

@@ -0,0 +1,26 @@
/// Data Transfer Object
/// - 只負責資料傳輸 / 解析
/// - 結構可變
/// - 可以依賴 JSON / platform
class L10nSdkPermissionStatusDto {
final bool granted;
final bool permanentlyDenied;
final String? grantedAt; // 通常是 raw string
L10nSdkPermissionStatusDto({
required this.granted,
required this.permanentlyDenied,
this.grantedAt,
});
factory L10nSdkPermissionStatusDto.fromJson(
Map<String, dynamic> json,
) {
return L10nSdkPermissionStatusDto(
granted: json['granted'] as bool,
permanentlyDenied: json['permanentlyDenied'] as bool,
grantedAt: json['grantedAt'] as String?,
);
}
}

View File

@@ -0,0 +1,16 @@
//Repository Impl
import '../../domain/repositories/l10n_sdk_repository.dart';
import '../datasources/l10n_sdk_method_channel_datasource.dart';
class L10nSdkRepositoryImpl implements L10nSdkRepository
{
final L10nSdkMethodChannelDataSource _datasource;
const L10nSdkRepositoryImpl(this._datasource);
@override
Future<String?> platformVersion() {
return _datasource.getPlatformVersion();
}
}

View File

@@ -0,0 +1,18 @@
/// Domain Entity
/// - 表達「通知權限狀態」這個業務概念
/// - 穩定、可被 Facade 回傳
/// - 不要包含 JSON / platform / plugin
class L10nSdkPermissionStatus {
final bool isGranted;
final bool isPermanentlyDenied;
final DateTime? grantedAt;
const L10nSdkPermissionStatus({
required this.isGranted,
required this.isPermanentlyDenied,
this.grantedAt,
});
/// 純業務邏輯允許
bool get canRequestAgain => !isGranted && !isPermanentlyDenied;
}

View File

@@ -0,0 +1,5 @@
// Repository InterfaceDomain
abstract class L10nSdkRepository {
Future<String?> platformVersion();
}

View File

@@ -0,0 +1,15 @@
//UseCase
import '../repositories/l10n_sdk_repository.dart';
class PlatformVersion
{
final L10nSdkRepository _repository;
const PlatformVersion(this._repository);
Future<String?> call() {
return _repository.platformVersion();
}
}

View File

@@ -0,0 +1,12 @@
import '../wiring/l10n_sdk_wiring.dart';
/// SDK API
abstract class L10nSdkApi
{
factory L10nSdkApi() => L10nSdkWiring.build();
Future<String?> platformVersion();
}

View File

@@ -0,0 +1,14 @@
import '../../../l10n_sdk.dart';
import 'l10n_sdk_core.dart';
/// SDK API Implementation
class L10nSdkApiImpl implements L10nSdkApi
{
final L10nSdkCore _core;
L10nSdkApiImpl({required L10nSdkCore core}) : _core = core;
@override
Future<String?> platformVersion() => _core.repo.platformVersion();
}

View File

@@ -0,0 +1,14 @@
import '../../../l10n_sdk_platform_interface.dart';
import '../../domain/repositories/l10n_sdk_repository.dart';
class L10nSdkCore
{
final L10nSdkPlatform platform;
final L10nSdkRepository repo;
L10nSdkCore({
required this.platform,
required this.repo,
});
}

View File

@@ -0,0 +1,30 @@
import '../../../l10n_sdk.dart';
import '../../../l10n_sdk_method_channel.dart';
import '../../../l10n_sdk_platform_interface.dart';
import '../../data/datasources/l10n_sdk_method_channel_datasource.dart';
import '../../data/repositories/l10n_sdk_repository_impl.dart';
import 'l10n_sdk_core.dart';
import 'l10n_sdk_api_impl.dart';
class L10nSdkWiring
{
static L10nSdkApi build() {
// platform instancemethod channel
final platform = L10nSdkPlatform.instance;
if (platform is MethodChannelL10nSdk) {
// platform.init(); // or defer to NotificationApiImpl.init
}
// data layer
final ds = L10nSdkMethodChannelDataSource(platform);
final repo = L10nSdkRepositoryImpl(ds);
final core = L10nSdkCore(platform: platform, repo: repo,);
return L10nSdkApiImpl(core: core);
}
}