flutter_aliplayer/example/lib/page/setting_page.dart

582 lines
17 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_aliplayer/flutter_aliplayer.dart';
import 'package:flutter_aliplayer_example/config.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:path_provider/path_provider.dart';
class SettingPage extends StatefulWidget {
@override
_SettingHomePageState createState() => _SettingHomePageState();
}
class _SettingHomePageState extends State<SettingPage> {
TextEditingController _dnsTextEditingController = TextEditingController();
TextEditingController _mLocalCacheDirController = TextEditingController();
TextEditingController _mLocalCacheMaxLocalSizeController =
TextEditingController();
TextEditingController _mLocalCacheExpirationController =
TextEditingController();
TextEditingController _mLocalCacheMaxCacheCapacityController =
TextEditingController();
TextEditingController _mLocalCacheMinDiskCapacityController =
TextEditingController();
String _sdkVersion;
List<String> _playerName = List();
String _currentPlayerName = "Default";
//保存地址
String _savePath;
//iOS保存沙盒目录类型。安卓默认设置DocTypeForIOS.documents供参数传递
DocTypeForIOS _saveDocTypeForIOS = DocTypeForIOS.documents;
int _mLogLevel;
@override
void initState() {
super.initState();
_mLogLevel = GlobalSettings.mLogLevel;
if (GlobalSettings.mPlayerName.isNotEmpty) {
_currentPlayerName = GlobalSettings.mPlayerName;
}
_playerName.add("Default");
if (Platform.isAndroid) {
_playerName.add("SuperMediaPlayer");
_playerName.add("ExoPlayer");
_playerName.add("MediaPlayer");
}
if (Platform.isIOS) {
_playerName
..add("SuperMediaPlayer")
..add("AppleAVPlayer");
}
if (Platform.isAndroid) {
getExternalStorageDirectories().then((value) {
if (value.length > 0) {
_savePath = value[0].path + "/localCache/";
return Directory(_savePath);
}
}).then((value) {
return value.exists();
}).then((value) {
if (!value) {
Directory directory = Directory(_savePath);
directory.create();
}
return _savePath;
}).then((value) {
_mLocalCacheDirController.text = _savePath;
});
} else if (Platform.isIOS) {
_savePath = "localCache";
_saveDocTypeForIOS = DocTypeForIOS.documents;
_mLocalCacheDirController.text = _savePath;
GlobalSettings.mCacheDir = _savePath;
GlobalSettings.mDocTypeForIOS = _saveDocTypeForIOS;
}
_mLocalCacheDirController.text = GlobalSettings.mCacheDir;
_mLocalCacheMaxLocalSizeController.text = GlobalSettings.mMaxCacheSize;
_mLocalCacheExpirationController.text = GlobalSettings.mExpiration;
_mLocalCacheMaxCacheCapacityController.text = GlobalSettings.mMaxCapacity;
_mLocalCacheMinDiskCapacityController.text =
GlobalSettings.mMinDiskCapacity;
FlutterAliplayer.getSDKVersion().then((value) {
setState(() {
_sdkVersion = value;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
title: Text("Settings"),
centerTitle: true,
),
body: SingleChildScrollView(
padding: const EdgeInsets.only(
left: 5.0, top: 10.0, right: 5.0, bottom: 10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//VersionCode
Text("版本号:$_sdkVersion"),
//硬解开关
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("硬解开关"),
Switch(
value: GlobalSettings.mEnableHardwareDecoder,
onChanged: (value) {
setState(() {
GlobalSettings.mEnableHardwareDecoder = value;
});
}),
],
),
//HTTP 2 开关
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("HTTP 2"),
Switch(
value: GlobalSettings.mEnableHTTP2,
onChanged: (value) {
setState(() {
GlobalSettings.mEnableHTTP2 = value;
});
FlutterAliplayer.setUseHttp2(value);
}),
],
),
//httpdns 开关
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("HTTPDNS"),
Switch(
value: GlobalSettings.mEnableHTTPDNS,
onChanged: (value) {
setState(() {
GlobalSettings.mEnableHTTPDNS = value;
});
FlutterAliplayer.enableHttpDns(value);
}),
],
),
//播放器切换
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [Text("播放器切换"), _buildChangePlayer()],
),
SizedBox(
height: 5.0,
),
//黑名单,Android显示iOS不显示
Text(Platform.operatingSystemVersion),
_blackListForAndroid(),
SizedBox(
height: 5.0,
),
//本地缓存
_localCache(),
SizedBox(
height: 10.0,
),
//DSResolve
_buildDNSResolve(),
//Log
Row(
children: [
Text("Log日志开关"),
Switch(
value: GlobalSettings.mEnableAliPlayerLog,
onChanged: (value) {
FlutterAliplayer.enableConsoleLog(value);
GlobalSettings.mEnableAliPlayerLog = value;
setState(() {
GlobalSettings.mEnableAliPlayerLog = value;
});
})
],
),
_buildLog(),
],
),
),
);
}
//播放器切换
Widget _buildChangePlayer() {
return Column(
children: _playerName.map((e) {
return Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("$e"),
value: e,
groupValue: _currentPlayerName,
onChanged: (value) {
setState(() {
if (value == "Default") {
GlobalSettings.mPlayerName = "";
} else {
GlobalSettings.mPlayerName = value;
}
_currentPlayerName = value;
});
}),
);
}).toList(),
);
}
//黑名单
Widget _blackListForAndroid() {
if (Platform.isAndroid) {
return Row(
children: [
ElevatedButton(
child: Text("HEVC黑名单"),
onPressed: () {
FlutterAliplayer.createDeviceInfo().then((value) {
FlutterAliplayer.addBlackDevice(
FlutterAvpdef.BLACK_DEVICES_HEVC, value);
});
},
),
SizedBox(
width: 10.0,
),
ElevatedButton(
child: Text("H264黑名单"),
onPressed: () {
FlutterAliplayer.createDeviceInfo().then((value) {
FlutterAliplayer.addBlackDevice(
FlutterAvpdef.BLACK_DEVICES_H264, value);
});
},
),
],
);
} else {
return SizedBox();
}
}
//本地缓存
Widget _localCache() {
return Column(
children: [
//是否开启缓存
Row(
children: [
Text("是否开启本地缓存:"),
SizedBox(
width: 5.0,
),
Switch(
value: GlobalSettings.mEnableLocalCache,
onChanged: (value) {
setState(() {
GlobalSettings.mEnableLocalCache = value;
});
}),
],
),
SizedBox(
height: 10.0,
),
TextField(
readOnly: true,
controller: _mLocalCacheDirController,
keyboardType: TextInputType.multiline,
maxLines: 1,
decoration: InputDecoration(
label: Text("缓存目录"),
border: OutlineInputBorder(),
),
),
SizedBox(
height: 10.0,
),
TextField(
controller: _mLocalCacheMaxLocalSizeController,
keyboardType: TextInputType.multiline,
maxLines: 1,
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(9),
],
decoration: InputDecoration(
label: Text("最大缓存大小(M)"),
border: OutlineInputBorder(),
),
),
SizedBox(
height: 10.0,
),
TextField(
controller: _mLocalCacheExpirationController,
keyboardType: TextInputType.multiline,
maxLines: 1,
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(9),
],
decoration: InputDecoration(
label: Text("缓存过期时间(天)"),
border: OutlineInputBorder(),
),
),
SizedBox(
height: 10.0,
),
TextField(
controller: _mLocalCacheMaxCacheCapacityController,
keyboardType: TextInputType.multiline,
maxLines: 1,
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(9),
],
decoration: InputDecoration(
label: Text("最大缓存容量(M)"),
border: OutlineInputBorder(),
),
),
SizedBox(
height: 10.0,
),
TextField(
controller: _mLocalCacheMinDiskCapacityController,
keyboardType: TextInputType.multiline,
maxLines: 1,
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(9),
],
decoration: InputDecoration(
label: Text("磁盘最小空余容量(M)"),
border: OutlineInputBorder(),
),
),
SizedBox(
height: 10.0,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
child: Text("恢复默认"),
onPressed: () {
_mLocalCacheMaxLocalSizeController.text =
LocalCacheDefaultValue.mDefaultMaxCacheSize;
_mLocalCacheExpirationController.text =
LocalCacheDefaultValue.mDefaultExpiration;
_mLocalCacheMaxCacheCapacityController.text =
LocalCacheDefaultValue.mDefaultMaxCapacity;
_mLocalCacheMinDiskCapacityController.text =
LocalCacheDefaultValue.mDefaultMinDiskCapacity;
},
),
ElevatedButton(
child: Text("应用配置"),
onPressed: () {
GlobalSettings.mCacheDir = _mLocalCacheDirController.text;
GlobalSettings.mDocTypeForIOS = _saveDocTypeForIOS;
GlobalSettings.mMaxCacheSize =
_mLocalCacheMaxLocalSizeController.text;
GlobalSettings.mExpiration =
_mLocalCacheExpirationController.text;
GlobalSettings.mMaxCapacity =
_mLocalCacheMaxCacheCapacityController.text;
GlobalSettings.mMinDiskCapacity =
_mLocalCacheMinDiskCapacityController.text;
FlutterAliplayer.enableLocalCache(
GlobalSettings.mEnableLocalCache,
GlobalSettings.mMaxCacheSize,
GlobalSettings.mCacheDir,
GlobalSettings.mDocTypeForIOS);
FlutterAliplayer.setCacheFileClearConfig(
GlobalSettings.mExpiration,
GlobalSettings.mMaxCapacity,
GlobalSettings.mMinDiskCapacity);
Fluttertoast.showToast(msg: "本地缓存配置成功");
},
),
ElevatedButton(
child: Text("删除缓存"),
onPressed: () {
FlutterAliplayer.clearCaches();
},
),
],
)
],
);
}
//DNS
Widget _buildDNSResolve() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("DNSResolve"),
Text("输入格式:域名1:端口1,ip1;域名2:端口2,ip2;..."),
SizedBox(
height: 5.0,
),
TextField(
controller: _dnsTextEditingController,
keyboardType: TextInputType.multiline,
maxLines: 3,
decoration: InputDecoration(
border: OutlineInputBorder(),
),
),
ElevatedButton(
//TODO 设置无效
child: Text("设置DNS"),
onPressed: () {
String dns = _dnsTextEditingController.text;
print("dns = $dns");
},
),
],
);
}
//Log
Widget _buildLog() {
if (GlobalSettings.mEnableAliPlayerLog) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_NONE"),
value: FlutterAvpdef.AF_LOG_LEVEL_NONE,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_FATAL"),
value: FlutterAvpdef.AF_LOG_LEVEL_FATAL,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_ERROR"),
value: FlutterAvpdef.AF_LOG_LEVEL_ERROR,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_WARNING"),
value: FlutterAvpdef.AF_LOG_LEVEL_WARNING,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_INFO"),
value: FlutterAvpdef.AF_LOG_LEVEL_INFO,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_DEBUG"),
value: FlutterAvpdef.AF_LOG_LEVEL_DEBUG,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
Container(
height: 35.0,
child: RadioListTile(
dense: true,
title: Text("AF_LOG_LEVEL_TRACE"),
value: FlutterAvpdef.AF_LOG_LEVEL_TRACE,
groupValue: _mLogLevel,
onChanged: (value) {
FlutterAliplayer.setLogLevel(value);
setState(() {
_mLogLevel = value;
GlobalSettings.mLogLevel = value;
});
}),
),
],
);
} else {
return Container();
}
}
}