Initial project
This commit is contained in:
2
packages/media_sdk/lib/media_sdk.dart
Normal file
2
packages/media_sdk/lib/media_sdk.dart
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
export 'src/presentation/facade/media_sdk_api.dart';
|
||||
17
packages/media_sdk/lib/media_sdk_method_channel.dart
Normal file
17
packages/media_sdk/lib/media_sdk_method_channel.dart
Normal file
@@ -0,0 +1,17 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'media_sdk_platform_interface.dart';
|
||||
|
||||
/// An implementation of [MediaSdkPlatform] that uses method channels.
|
||||
class MethodChannelMediaSdk extends MediaSdkPlatform {
|
||||
/// The method channel used to interact with the native platform.
|
||||
@visibleForTesting
|
||||
final methodChannel = const MethodChannel('media_sdk');
|
||||
|
||||
@override
|
||||
Future<String?> getPlatformVersion() async {
|
||||
final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
|
||||
return version;
|
||||
}
|
||||
}
|
||||
29
packages/media_sdk/lib/media_sdk_platform_interface.dart
Normal file
29
packages/media_sdk/lib/media_sdk_platform_interface.dart
Normal file
@@ -0,0 +1,29 @@
|
||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
||||
|
||||
import 'media_sdk_method_channel.dart';
|
||||
|
||||
abstract class MediaSdkPlatform extends PlatformInterface {
|
||||
/// Constructs a MediaSdkPlatform.
|
||||
MediaSdkPlatform() : super(token: _token);
|
||||
|
||||
static final Object _token = Object();
|
||||
|
||||
static MediaSdkPlatform _instance = MethodChannelMediaSdk();
|
||||
|
||||
/// The default instance of [MediaSdkPlatform] to use.
|
||||
///
|
||||
/// Defaults to [MethodChannelMediaSdk].
|
||||
static MediaSdkPlatform get instance => _instance;
|
||||
|
||||
/// Platform-specific implementations should set this with their own
|
||||
/// platform-specific class that extends [MediaSdkPlatform] when
|
||||
/// they register themselves.
|
||||
static set instance(MediaSdkPlatform instance) {
|
||||
PlatformInterface.verifyToken(instance, _token);
|
||||
_instance = instance;
|
||||
}
|
||||
|
||||
Future<String?> getPlatformVersion() {
|
||||
throw UnimplementedError('platformVersion() has not been implemented.');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
class MediaSdkMethodChannel
|
||||
{
|
||||
// Channel Name
|
||||
static const String channelName = 'media_sdk';
|
||||
|
||||
//---------------- Flutter call native ----------------
|
||||
|
||||
static const String requestPermission = 'requestPermission';
|
||||
|
||||
|
||||
//---------------- Flutter call native ----------------
|
||||
|
||||
|
||||
|
||||
//---------------- native call Flutter ----------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//---------------- native call Flutter ----------------
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import '../../../media_sdk_platform_interface.dart';
|
||||
|
||||
class MediaSdkMethodChannelDataSource
|
||||
{
|
||||
|
||||
final MediaSdkPlatform platform;
|
||||
|
||||
MediaSdkMethodChannelDataSource(this.platform);
|
||||
|
||||
|
||||
Future<String?> getPlatformVersion() async {
|
||||
return await getPlatformVersion();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
/// Data Transfer Object
|
||||
/// - 只負責資料傳輸 / 解析
|
||||
/// - 結構可變
|
||||
/// - 可以依賴 JSON / platform
|
||||
class MediaSdkPermissionStatusDto {
|
||||
final bool granted;
|
||||
final bool permanentlyDenied;
|
||||
final String? grantedAt; // 通常是 raw string
|
||||
|
||||
MediaSdkPermissionStatusDto({
|
||||
required this.granted,
|
||||
required this.permanentlyDenied,
|
||||
this.grantedAt,
|
||||
});
|
||||
|
||||
factory MediaSdkPermissionStatusDto.fromJson(
|
||||
Map<String, dynamic> json,
|
||||
) {
|
||||
return MediaSdkPermissionStatusDto(
|
||||
granted: json['granted'] as bool,
|
||||
permanentlyDenied: json['permanentlyDenied'] as bool,
|
||||
grantedAt: json['grantedAt'] as String?,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
//Repository Impl
|
||||
|
||||
import '../../domain/repositories/media_sdk_repository.dart';
|
||||
import '../datasources/media_sdk_method_channel_datasource.dart';
|
||||
|
||||
class MediaSdkRepositoryImpl implements MediaSdkRepository
|
||||
{
|
||||
final MediaSdkMethodChannelDataSource _datasource;
|
||||
|
||||
const MediaSdkRepositoryImpl(this._datasource);
|
||||
|
||||
@override
|
||||
Future<String?> platformVersion() {
|
||||
return _datasource.getPlatformVersion();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
/// Domain Entity
|
||||
/// - 表達「通知權限狀態」這個業務概念
|
||||
/// - 穩定、可被 Facade 回傳
|
||||
/// - 不要包含 JSON / platform / plugin
|
||||
class MediaSdkPermissionStatus {
|
||||
final bool isGranted;
|
||||
final bool isPermanentlyDenied;
|
||||
final DateTime? grantedAt;
|
||||
|
||||
const MediaSdkPermissionStatus({
|
||||
required this.isGranted,
|
||||
required this.isPermanentlyDenied,
|
||||
this.grantedAt,
|
||||
});
|
||||
|
||||
/// 純業務邏輯允許
|
||||
bool get canRequestAgain => !isGranted && !isPermanentlyDenied;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
// Repository Interface(Domain)
|
||||
|
||||
abstract class MediaSdkRepository {
|
||||
Future<String?> platformVersion();
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
//UseCase
|
||||
|
||||
import '../repositories/media_sdk_repository.dart';
|
||||
|
||||
class PlatformVersion
|
||||
{
|
||||
final MediaSdkRepository _repository;
|
||||
|
||||
const PlatformVersion(this._repository);
|
||||
|
||||
Future<String?> call() {
|
||||
return _repository.platformVersion();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
|
||||
|
||||
import '../wiring/media_sdk_wiring.dart';
|
||||
|
||||
/// SDK API
|
||||
abstract class MediaSdkApi
|
||||
{
|
||||
factory MediaSdkApi() => MediaSdkWiring.build();
|
||||
|
||||
Future<String?> platformVersion();
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
|
||||
import '../../../media_sdk.dart';
|
||||
import 'media_sdk_core.dart';
|
||||
/// SDK API Implementation
|
||||
class MediaSdkApiImpl implements MediaSdkApi
|
||||
{
|
||||
final MediaSdkCore _core;
|
||||
|
||||
MediaSdkApiImpl({required MediaSdkCore core}) : _core = core;
|
||||
|
||||
@override
|
||||
Future<String?> platformVersion() => _core.repo.platformVersion();
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
import '../../../media_sdk_platform_interface.dart';
|
||||
import '../../domain/repositories/media_sdk_repository.dart';
|
||||
|
||||
class MediaSdkCore
|
||||
{
|
||||
final MediaSdkPlatform platform;
|
||||
final MediaSdkRepository repo;
|
||||
|
||||
MediaSdkCore({
|
||||
required this.platform,
|
||||
required this.repo,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
|
||||
import '../../../media_sdk.dart';
|
||||
|
||||
import '../../../media_sdk_method_channel.dart';
|
||||
import '../../../media_sdk_platform_interface.dart';
|
||||
|
||||
import '../../data/datasources/media_sdk_method_channel_datasource.dart';
|
||||
import '../../data/repositories/media_sdk_repository_impl.dart';
|
||||
|
||||
import 'media_sdk_core.dart';
|
||||
import 'media_sdk_api_impl.dart';
|
||||
|
||||
class MediaSdkWiring
|
||||
{
|
||||
static MediaSdkApi build() {
|
||||
|
||||
// platform instance(method channel)
|
||||
final platform = MediaSdkPlatform.instance;
|
||||
if (platform is MethodChannelMediaSdk) {
|
||||
// platform.init(); // or defer to NotificationApiImpl.init
|
||||
}
|
||||
|
||||
// data layer
|
||||
final ds = MediaSdkMethodChannelDataSource(platform);
|
||||
final repo = MediaSdkRepositoryImpl(ds);
|
||||
final core = MediaSdkCore(platform: platform, repo: repo,);
|
||||
|
||||
return MediaSdkApiImpl(core: core);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user