mirror of
https://github.com/Cateners/tiny_computer.git
synced 2026-05-21 00:45:49 +08:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70c2018ddf | ||
|
|
b1895af653 | ||
|
|
62995e0a5d | ||
|
|
5ebbaf7073 | ||
|
|
cb1f4b23ee | ||
|
|
0d2f5f4e91 |
@@ -33,6 +33,7 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<activity android:name="com.example.tiny_computer.Signal9Activity" />
|
||||||
<activity-alias
|
<activity-alias
|
||||||
android:name="com.gaurav.avnc.UriReceiverActivity"
|
android:name="com.gaurav.avnc.UriReceiverActivity"
|
||||||
android:targetActivity="com.gaurav.avnc.ui.vnc.IntentReceiverActivity">
|
android:targetActivity="com.gaurav.avnc.ui.vnc.IntentReceiverActivity">
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ class MainActivity: FlutterActivity() {
|
|||||||
startActivity(Intent(this, com.gaurav.avnc.ui.about.AboutActivity::class.java))
|
startActivity(Intent(this, com.gaurav.avnc.ui.about.AboutActivity::class.java))
|
||||||
result.success(0)
|
result.success(0)
|
||||||
}
|
}
|
||||||
|
"launchSignal9Page" -> {
|
||||||
|
startActivity(Intent(this, Signal9Activity::class.java))
|
||||||
|
result.success(0)
|
||||||
|
}
|
||||||
else -> {
|
else -> {
|
||||||
// 不支持的方法名
|
// 不支持的方法名
|
||||||
result.notImplemented()
|
result.notImplemented()
|
||||||
|
|||||||
@@ -0,0 +1,129 @@
|
|||||||
|
package com.example.tiny_computer
|
||||||
|
|
||||||
|
import android.content.ClipData
|
||||||
|
import android.content.ClipboardManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.Button
|
||||||
|
import android.widget.ScrollView
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.ContextCompat.startActivity
|
||||||
|
|
||||||
|
class Signal9Activity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private val helperLink = "https://www.vmos.cn/zhushou.htm"
|
||||||
|
private val helperLink2 = "https://b23.tv/WwqOqW6"
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
val rootLayout = LinearLayout(this).apply {
|
||||||
|
layoutParams = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
)
|
||||||
|
gravity = Gravity.CENTER
|
||||||
|
orientation = LinearLayout.VERTICAL
|
||||||
|
setPadding(16, 16, 16, 16)
|
||||||
|
setBackgroundColor(Color.parseColor("#4A148C"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val scrollView = ScrollView(this).apply {
|
||||||
|
layoutParams = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val fullScreen = LinearLayout(this).apply {
|
||||||
|
layoutParams = LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
orientation = LinearLayout.VERTICAL
|
||||||
|
setBackgroundColor(Color.parseColor("#4A148C"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val text1 = TextView(this).apply {
|
||||||
|
text = ":(\n发生了什么?"
|
||||||
|
textSize = 32f
|
||||||
|
setTextColor(Color.WHITE)
|
||||||
|
textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||||
|
}
|
||||||
|
|
||||||
|
val text2 = TextView(this).apply {
|
||||||
|
text = "终端异常退出, 返回错误码9\n此错误通常是高版本安卓系统(12+)限制进程造成的, \n可以使用以下工具修复:"
|
||||||
|
textSize = 16f
|
||||||
|
setTextColor(Color.WHITE)
|
||||||
|
textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||||
|
setPadding(0, 16, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
val helperLinkText = TextView(this).apply {
|
||||||
|
text = helperLink
|
||||||
|
textSize = 16f
|
||||||
|
setTextColor(Color.WHITE)
|
||||||
|
textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||||
|
setPadding(0, 16, 0, 0)
|
||||||
|
setOnClickListener { copyToClipboard(helperLink) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val copyHintText = TextView(this).apply {
|
||||||
|
text = "(复制链接到浏览器查看)"
|
||||||
|
textSize = 16f
|
||||||
|
setTextColor(Color.WHITE)
|
||||||
|
textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||||
|
setPadding(0, 8, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
val copyButton = Button(this).apply {
|
||||||
|
text = "复制"
|
||||||
|
textSize = 16f
|
||||||
|
setOnClickListener { copyToClipboard(helperLink) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val tutorialText = TextView(this).apply {
|
||||||
|
text = "如果你的设备版本大于等于安卓14,可以在开发者选项里开启“停止限制子进程”选项即可,无需额外修复。\n\n如果不能解决请参考此教程: "
|
||||||
|
textSize = 16f
|
||||||
|
setTextColor(Color.WHITE)
|
||||||
|
textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||||
|
setPadding(0, 16, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
val viewButton = Button(this).apply {
|
||||||
|
text = "查看"
|
||||||
|
textSize = 16f
|
||||||
|
setOnClickListener { copyToClipboard(helperLink2) }
|
||||||
|
}
|
||||||
|
|
||||||
|
rootLayout.addView(text1)
|
||||||
|
rootLayout.addView(text2)
|
||||||
|
rootLayout.addView(helperLinkText)
|
||||||
|
rootLayout.addView(copyHintText)
|
||||||
|
rootLayout.addView(copyButton)
|
||||||
|
rootLayout.addView(tutorialText)
|
||||||
|
rootLayout.addView(viewButton)
|
||||||
|
|
||||||
|
scrollView.addView(rootLayout)
|
||||||
|
fullScreen.addView(scrollView)
|
||||||
|
|
||||||
|
setContentView(fullScreen)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun copyToClipboard(text: String) {
|
||||||
|
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
|
val clip = ClipData.newPlainText("Copied Text", text)
|
||||||
|
clipboard.setPrimaryClip(clip)
|
||||||
|
Toast.makeText(this, "已复制", Toast.LENGTH_SHORT).show()
|
||||||
|
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(text))
|
||||||
|
startActivity(this, intent, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -12,26 +12,46 @@ rm -rf $HOME/.local/share/tiny/tmp
|
|||||||
mkdir $HOME/.local/share/tiny/tmp
|
mkdir $HOME/.local/share/tiny/tmp
|
||||||
cd $HOME/.local/share/tiny/tmp
|
cd $HOME/.local/share/tiny/tmp
|
||||||
|
|
||||||
git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box86
|
box86_url="https://github.com/ptitSeb/box86"
|
||||||
if [ $? -ne 0 ]; then
|
box64_url="https://github.com/ptitSeb/box64"
|
||||||
git clone https://github.com/ptitSeb/box86
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
|
||||||
echo '仓库克隆失败...退出安装...'
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box64
|
mirror_sites=(
|
||||||
if [ $? -ne 0 ]; then
|
"https://github.moeyy.xyz/"
|
||||||
git clone https://github.com/ptitSeb/box64
|
"https://mirror.ghproxy.com/"
|
||||||
if [ $? -ne 0 ]; then
|
""
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
)
|
||||||
echo '仓库克隆失败...退出安装...'
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
|
url="${mirror}${box86_url}"
|
||||||
|
echo "尝试从 $url 下载box86..."
|
||||||
|
git clone "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载box86"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '仓库克隆失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
|
url="${mirror}${box64_url}"
|
||||||
|
echo "尝试从 $url 下载box64..."
|
||||||
|
git clone "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载box64"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '仓库克隆失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "正在编译box86..."
|
||||||
cd box86
|
cd box86
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
@@ -41,6 +61,7 @@ cd ../..
|
|||||||
mv box86/build/box86 ../cross
|
mv box86/build/box86 ../cross
|
||||||
mv box86/x86lib ../cross
|
mv box86/x86lib ../cross
|
||||||
|
|
||||||
|
echo "正在编译box64..."
|
||||||
cd box64
|
cd box64
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
|
|||||||
@@ -4,27 +4,37 @@ rm -rf $HOME/.local/share/tiny/tmp
|
|||||||
mkdir $HOME/.local/share/tiny/tmp
|
mkdir $HOME/.local/share/tiny/tmp
|
||||||
cd $HOME/.local/share/tiny/tmp
|
cd $HOME/.local/share/tiny/tmp
|
||||||
|
|
||||||
MIRROR_SITE=https://mirror.ghproxy.com
|
|
||||||
RELEASE_PAGE=https://github.com/doitsujin/dxvk/releases
|
RELEASE_PAGE=https://github.com/doitsujin/dxvk/releases
|
||||||
LATEST_DXVK_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Version \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1)
|
LATEST_DXVK_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Version \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1)
|
||||||
if [ -z "$LATEST_DXVK_TAG" ]
|
if [ -z "$LATEST_DXVK_TAG" ]
|
||||||
then
|
then
|
||||||
LATEST_DXVK_TAG="2.3"
|
LATEST_DXVK_TAG="2.4"
|
||||||
fi
|
fi
|
||||||
LATEST_DXVK_NAME="dxvk-$LATEST_DXVK_TAG.tar.gz"
|
LATEST_DXVK_NAME="dxvk-$LATEST_DXVK_TAG.tar.gz"
|
||||||
LATEST_DXVK_LINK="https://github.com/doitsujin/dxvk/releases/download/v$LATEST_DXVK_TAG/$LATEST_DXVK_NAME"
|
LATEST_DXVK_LINK="https://github.com/doitsujin/dxvk/releases/download/v$LATEST_DXVK_TAG/$LATEST_DXVK_NAME"
|
||||||
|
|
||||||
wget $MIRROR_SITE/$LATEST_DXVK_LINK
|
mirror_sites=(
|
||||||
if [ $? -ne 0 ]; then
|
"https://github.moeyy.xyz/"
|
||||||
wget $LATEST_DXVK_LINK
|
"https://mirror.ghproxy.com/"
|
||||||
if [ $? -ne 0 ]; then
|
""
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
)
|
||||||
echo '下载失败...退出安装...'
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
wineboot
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
|
url="${mirror}$LATEST_DXVK_LINK"
|
||||||
|
echo "尝试从 $url 下载dxvk..."
|
||||||
|
wget "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载dxvk"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '下载失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
wine64 wineboot
|
||||||
tar xvf $LATEST_DXVK_NAME
|
tar xvf $LATEST_DXVK_NAME
|
||||||
mv dxvk-$LATEST_DXVK_TAG/x32/* ~/.wine/drive_c/windows/syswow64
|
mv dxvk-$LATEST_DXVK_TAG/x32/* ~/.wine/drive_c/windows/syswow64
|
||||||
mv dxvk-$LATEST_DXVK_TAG/x64/* ~/.wine/drive_c/windows/system32
|
mv dxvk-$LATEST_DXVK_TAG/x64/* ~/.wine/drive_c/windows/system32
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ rm -rf $HOME/.local/share/tiny/tmp
|
|||||||
mkdir $HOME/.local/share/tiny/tmp
|
mkdir $HOME/.local/share/tiny/tmp
|
||||||
cd $HOME/.local/share/tiny/tmp
|
cd $HOME/.local/share/tiny/tmp
|
||||||
|
|
||||||
MIRROR_SITE=https://mirror.ghproxy.com
|
|
||||||
RELEASE_PAGE=https://github.com/Kron4ek/Wine-Builds/releases
|
RELEASE_PAGE=https://github.com/Kron4ek/Wine-Builds/releases
|
||||||
#LATEST_WINE_TAG=proton-$(curl -L $RELEASE_PAGE | grep -oP 'Proton \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #proton
|
#LATEST_WINE_TAG=proton-$(curl -L $RELEASE_PAGE | grep -oP 'Proton \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #proton
|
||||||
LATEST_WINE_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Wine \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #vanilla
|
LATEST_WINE_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Wine \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #vanilla
|
||||||
@@ -43,15 +42,26 @@ fi
|
|||||||
LATEST_WINE_NAME=wine-$LATEST_WINE_TAG-amd64.tar.xz
|
LATEST_WINE_NAME=wine-$LATEST_WINE_TAG-amd64.tar.xz
|
||||||
LATEST_WINE_LINK=$RELEASE_PAGE/download/$LATEST_WINE_TAG/$LATEST_WINE_NAME
|
LATEST_WINE_LINK=$RELEASE_PAGE/download/$LATEST_WINE_TAG/$LATEST_WINE_NAME
|
||||||
|
|
||||||
wget $MIRROR_SITE/$LATEST_WINE_LINK
|
mirror_sites=(
|
||||||
if [ $? -ne 0 ]; then
|
"https://github.moeyy.xyz/"
|
||||||
wget $LATEST_WINE_LINK
|
"https://mirror.ghproxy.com/"
|
||||||
if [ $? -ne 0 ]; then
|
""
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
)
|
||||||
echo '下载失败...退出安装...'
|
|
||||||
exit
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
fi
|
url="${mirror}$LATEST_WINE_LINK"
|
||||||
fi
|
echo "尝试从 $url 下载wine..."
|
||||||
|
wget "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载wine"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '下载失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
tar xvf $LATEST_WINE_NAME
|
tar xvf $LATEST_WINE_NAME
|
||||||
mv wine-$LATEST_WINE_TAG-amd64 ../cross/wine
|
mv wine-$LATEST_WINE_TAG-amd64 ../cross/wine
|
||||||
|
|||||||
@@ -132,21 +132,26 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
headerBuilder: ((context, isExpanded) {
|
headerBuilder: ((context, isExpanded) {
|
||||||
return const ListTile(title: Text("高级设置"), subtitle: Text("修改后重启生效"));
|
return const ListTile(title: Text("高级设置"), subtitle: Text("修改后重启生效"));
|
||||||
}), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [
|
}), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [
|
||||||
OutlinedButton(style: D.commandButtonStyle, child: const Text("重置启动命令"), onPressed: () {
|
Wrap(alignment: WrapAlignment.center, spacing: 4.0, runSpacing: 4.0, children: [
|
||||||
showDialog(context: context, builder: (context) {
|
OutlinedButton(style: D.commandButtonStyle, child: const Text("重置启动命令"), onPressed: () {
|
||||||
return AlertDialog(title: const Text("注意"), content: const Text("是否重置启动命令?"), actions: [
|
showDialog(context: context, builder: (context) {
|
||||||
TextButton(onPressed:() {
|
return AlertDialog(title: const Text("注意"), content: const Text("是否重置启动命令?"), actions: [
|
||||||
Navigator.of(context).pop();
|
TextButton(onPressed:() {
|
||||||
}, child: const Text("取消")),
|
Navigator.of(context).pop();
|
||||||
TextButton(onPressed:() async {
|
}, child: const Text("取消")),
|
||||||
await Util.setCurrentProp("boot", D.boot);
|
TextButton(onPressed:() async {
|
||||||
G.bootTextChange.value = !G.bootTextChange.value;
|
await Util.setCurrentProp("boot", D.boot);
|
||||||
if (!context.mounted) return;
|
G.bootTextChange.value = !G.bootTextChange.value;
|
||||||
Navigator.of(context).pop();
|
if (!context.mounted) return;
|
||||||
}, child: const Text("是")),
|
Navigator.of(context).pop();
|
||||||
]);
|
}, child: const Text("是")),
|
||||||
});
|
]);
|
||||||
}),
|
});
|
||||||
|
}),
|
||||||
|
OutlinedButton(style: D.commandButtonStyle, child: const Text("Signal9错误页面"), onPressed: () async {
|
||||||
|
await D.avncChannel.invokeMethod("launchSignal9Page", {});
|
||||||
|
}),
|
||||||
|
]),
|
||||||
const SizedBox.square(dimension: 8),
|
const SizedBox.square(dimension: 8),
|
||||||
TextFormField(maxLines: null, initialValue: Util.getCurrentProp("name"), decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "容器名称"), onChanged: (value) async {
|
TextFormField(maxLines: null, initialValue: Util.getCurrentProp("name"), decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "容器名称"), onChanged: (value) async {
|
||||||
await Util.setCurrentProp("name", value);
|
await Util.setCurrentProp("name", value);
|
||||||
@@ -459,14 +464,11 @@ sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)""");
|
|||||||
ExpansionPanel(
|
ExpansionPanel(
|
||||||
isExpanded: _expandState[5],
|
isExpanded: _expandState[5],
|
||||||
headerBuilder: ((context, isExpanded) {
|
headerBuilder: ((context, isExpanded) {
|
||||||
return const ListTile(title: Text("virgl加速"), subtitle: Text("实验性功能"));
|
return const ListTile(title: Text("图形加速"), subtitle: Text("实验性功能"));
|
||||||
}), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [
|
}), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [
|
||||||
const Text("""virgl加速可部分利用设备GPU提升系统图形处理表现,但由于设备差异也可能导致容器系统及软件运行不稳定甚至异常退出。
|
const Text("""图形加速可部分利用设备GPU提升系统图形处理表现,但由于设备差异也可能导致容器系统及软件运行不稳定甚至异常退出。
|
||||||
|
|
||||||
请先开启测试按钮启动virgl服务器,如果按钮没有自动关闭说明至少启动没问题;
|
Virgl可为使用OpenGL ES的应用提供加速。"""),
|
||||||
|
|
||||||
不过运行情况依然无法保证。
|
|
||||||
"""),
|
|
||||||
const SizedBox.square(dimension: 16),
|
const SizedBox.square(dimension: 16),
|
||||||
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglCommand") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl服务器参数"),
|
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglCommand") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl服务器参数"),
|
||||||
onChanged: (value) async {
|
onChanged: (value) async {
|
||||||
@@ -474,37 +476,34 @@ sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)""");
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
const SizedBox.square(dimension: 8),
|
const SizedBox.square(dimension: 8),
|
||||||
SwitchListTile(title: const Text("测试"), subtitle: const Text("启动virgl_test_server"), value: G.isVirglServerStarted, onChanged:(value) {
|
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl环境变量"),
|
||||||
switch (value) {
|
|
||||||
case true: {
|
|
||||||
G.virglServerPty = Pty.start("/system/bin/sh");
|
|
||||||
G.virglServerPty.write(const Utf8Encoder().convert("export CONTAINER_DIR=${G.dataPath}/containers/${G.currentContainer}\n${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}\nexit\n"));
|
|
||||||
G.virglServerPty.exitCode.then((value) {
|
|
||||||
G.isVirglServerStarted = false;
|
|
||||||
setState(() {});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case false: {
|
|
||||||
G.virglServerPty.write(const Utf8Encoder().convert("\x03exit\n"));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
G.isVirglServerStarted = value;
|
|
||||||
setState(() {});
|
|
||||||
},),
|
|
||||||
const SizedBox.square(dimension: 16),
|
|
||||||
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "图形环境变量"),
|
|
||||||
onChanged: (value) async {
|
onChanged: (value) async {
|
||||||
await G.prefs.setString("defaultVirglOpt", value);
|
await G.prefs.setString("defaultVirglOpt", value);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
const SizedBox.square(dimension: 8),
|
const SizedBox.square(dimension: 8),
|
||||||
SwitchListTile(title: const Text("启用virgl加速"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("virgl") as bool, onChanged:(value) {
|
SwitchListTile(title: const Text("启用Virgl加速"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("virgl") as bool, onChanged:(value) {
|
||||||
G.prefs.setBool("virgl", value);
|
G.prefs.setBool("virgl", value);
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},),
|
},),
|
||||||
const SizedBox.square(dimension: 16),
|
const SizedBox.square(dimension: 16),
|
||||||
|
const Divider(height: 2, indent: 8, endIndent: 8),
|
||||||
|
const SizedBox.square(dimension: 16),
|
||||||
|
const Text("""搭载Adreno GPU的设备通常可以使用Turnip驱动加速使用Vulkan的软件。配合Zink驱动可实现加速使用OpenGL的软件。
|
||||||
|
|
||||||
|
(也就是搭载不太新也不太旧的骁龙处理器的设备)"""),
|
||||||
|
const SizedBox.square(dimension: 8),
|
||||||
|
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultTurnipOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "Turnip环境变量"),
|
||||||
|
onChanged: (value) async {
|
||||||
|
await G.prefs.setString("defaultTurnipOpt", value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox.square(dimension: 8),
|
||||||
|
SwitchListTile(title: const Text("启用Turnip+Zink驱动"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("turnip") as bool, onChanged:(value) async {
|
||||||
|
G.prefs.setBool("turnip", value);
|
||||||
|
setState(() {});
|
||||||
|
},),
|
||||||
|
const SizedBox.square(dimension: 16),
|
||||||
],))),
|
],))),
|
||||||
ExpansionPanel(
|
ExpansionPanel(
|
||||||
isExpanded: _expandState[6],
|
isExpanded: _expandState[6],
|
||||||
@@ -668,9 +667,8 @@ class _InfoPageState extends State<InfoPage> {
|
|||||||
elevation: 1,
|
elevation: 1,
|
||||||
expandedHeaderPadding: const EdgeInsets.all(0),
|
expandedHeaderPadding: const EdgeInsets.all(0),
|
||||||
expansionCallback: (panelIndex, isExpanded) {
|
expansionCallback: (panelIndex, isExpanded) {
|
||||||
setState(() {
|
_expandState[panelIndex] = isExpanded;
|
||||||
_expandState[panelIndex] = isExpanded;
|
WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {}));
|
||||||
});
|
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
ExpansionPanel(
|
ExpansionPanel(
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import 'package:retry/retry.dart';
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
|
||||||
import 'package:webview_flutter/webview_flutter.dart';
|
import 'package:webview_flutter/webview_flutter.dart';
|
||||||
|
|
||||||
import 'package:xterm/xterm.dart';
|
import 'package:xterm/xterm.dart';
|
||||||
@@ -39,9 +38,8 @@ import 'package:permission_handler/permission_handler.dart';
|
|||||||
|
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
import 'package:clipboard/clipboard.dart';
|
|
||||||
|
|
||||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||||
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
|
|
||||||
class Util {
|
class Util {
|
||||||
|
|
||||||
@@ -116,12 +114,14 @@ class Util {
|
|||||||
case "isBoxEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "isBoxEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "isWineEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "isWineEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "virgl" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "virgl" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
|
case "turnip" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "wakelock" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "wakelock" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "isHidpiEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "isHidpiEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "useAvnc" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(true);
|
case "useAvnc" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(true);
|
||||||
case "defaultFFmpegCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("-hide_banner -an -max_delay 1000000 -r 30 -f android_camera -camera_index 0 -i 0:0 -vf scale=iw/2:-1 -rtsp_transport udp -f rtsp rtsp://127.0.0.1:8554/stream");
|
case "defaultFFmpegCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("-hide_banner -an -max_delay 1000000 -r 30 -f android_camera -camera_index 0 -i 0:0 -vf scale=iw/2:-1 -rtsp_transport udp -f rtsp rtsp://127.0.0.1:8554/stream");
|
||||||
case "defaultVirglCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("--socket-path=\$CONTAINER_DIR/tmp/.virgl_test");
|
case "defaultVirglCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("--socket-path=\$CONTAINER_DIR/tmp/.virgl_test");
|
||||||
case "defaultVirglOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GALLIUM_DRIVER=virpipe");
|
case "defaultVirglOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GALLIUM_DRIVER=virpipe");
|
||||||
|
case "defaultTurnipOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("MESA_LOADER_DRIVER_OVERRIDE=zink VK_ICD_FILENAMES=/home/tiny/.local/share/tiny/extra/freedreno_icd.aarch64.json TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw");
|
||||||
case "defaultHidpiOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GDK_SCALE=2 QT_FONT_DPI=192");
|
case "defaultHidpiOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GDK_SCALE=2 QT_FONT_DPI=192");
|
||||||
case "containersInfo" : return G.prefs.getStringList(key)!;
|
case "containersInfo" : return G.prefs.getStringList(key)!;
|
||||||
}
|
}
|
||||||
@@ -272,45 +272,7 @@ class TermPty {
|
|||||||
}
|
}
|
||||||
//Signal 9 hint
|
//Signal 9 hint
|
||||||
if (code == -9) {
|
if (code == -9) {
|
||||||
Navigator.push(G.homePageStateContext, MaterialPageRoute(builder: (context) {
|
D.avncChannel.invokeMethod("launchSignal9Page", {});
|
||||||
const TextStyle ts = TextStyle(fontSize: 16, color: Colors.white, fontWeight: FontWeight.normal);
|
|
||||||
const String helperLink = "https://www.vmos.cn/zhushou.htm";
|
|
||||||
const String helperLink2 = "https://b23.tv/WwqOqW6";
|
|
||||||
return Scaffold(backgroundColor: Colors.deepPurple,
|
|
||||||
body: Center(
|
|
||||||
child: Scrollbar(child:
|
|
||||||
SingleChildScrollView(
|
|
||||||
child: Column(children: [
|
|
||||||
const Text(":(\n发生了什么?", textScaler: TextScaler.linear(2), style: ts, textAlign: TextAlign.center,),
|
|
||||||
const Text("终端异常退出, 返回错误码9\n此错误通常是高版本安卓系统(12+)限制进程造成的, \n可以使用以下工具修复:", style: ts, textAlign: TextAlign.center),
|
|
||||||
const SelectableText(helperLink, style: ts, textAlign: TextAlign.center),
|
|
||||||
const Text("(复制链接到浏览器查看)", style: ts, textAlign: TextAlign.center),
|
|
||||||
OutlinedButton(onPressed: () {
|
|
||||||
FlutterClipboard.copy(helperLink).then(( value ) {
|
|
||||||
ScaffoldMessenger.of(context).hideCurrentSnackBar();
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(content: const Text("已复制"), action: SnackBarAction(label: "跳转", onPressed: () {
|
|
||||||
launchUrl(Uri.parse(helperLink), mode: LaunchMode.externalApplication);
|
|
||||||
},))
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}, child: const Text("复制", style: ts, textAlign: TextAlign.center)),
|
|
||||||
const Text("如果不能解决请参考此教程: ", style: ts, textAlign: TextAlign.center),
|
|
||||||
OutlinedButton(onPressed: () {
|
|
||||||
FlutterClipboard.copy(helperLink2).then(( value ) {
|
|
||||||
ScaffoldMessenger.of(context).hideCurrentSnackBar();
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(content: const Text("已复制"), action: SnackBarAction(label: "跳转", onPressed: () {
|
|
||||||
launchUrl(Uri.parse(helperLink2), mode: LaunchMode.externalApplication);
|
|
||||||
},))
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}, child: const Text("查看", style: ts, textAlign: TextAlign.center))
|
|
||||||
]),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
));
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
terminal.onOutput = (data) {
|
terminal.onOutput = (data) {
|
||||||
@@ -339,26 +301,35 @@ class D {
|
|||||||
|
|
||||||
//帮助信息
|
//帮助信息
|
||||||
static const faq = [
|
static const faq = [
|
||||||
{"q":"错误码9", "a":"""如果你的系统版本大于等于android 12
|
{"q":"安卓12及以上注意事项:错误码9", "a":"""如果你的系统版本大于等于android 12
|
||||||
可能会在使用过程中异常退出(返回错误码9)
|
可能会在使用过程中异常退出(返回错误码9)
|
||||||
届时本软件会提供方案指引你修复
|
届时本软件会提供方案指引你修复
|
||||||
并不难
|
并不难
|
||||||
但是软件没有权限
|
但是软件没有权限
|
||||||
不能帮你修复"""},
|
不能帮你修复
|
||||||
{"q":"用一会就断掉", "a":"""这应该是出现了错误9的情况
|
|
||||||
下次出现此情况时
|
你也可以在高级设置里手动前往错误页面"""},
|
||||||
按设备的返回键(或用返回手势)
|
|
||||||
应该能看到软件提供的修复引导"""},
|
|
||||||
{"q":"安卓13注意事项", "a":"""如果你的系统版本大于等于android 13
|
{"q":"安卓13注意事项", "a":"""如果你的系统版本大于等于android 13
|
||||||
那么很可能一些网页应用如jupyter notebook
|
那么很可能一些网页应用如jupyter notebook
|
||||||
bilibili客户端等等不可用
|
bilibili客户端等等不可用
|
||||||
可以去全局设置开启getifaddrs桥接"""},
|
可以去全局设置开启getifaddrs桥接"""},
|
||||||
|
{"q":"用一会就断掉", "a":"""这应该是出现了错误9的情况
|
||||||
|
下次出现此情况时
|
||||||
|
按设备的返回键(或用返回手势)
|
||||||
|
应该能看到软件提供的修复引导"""},
|
||||||
{"q":"如何访问设备文件?", "a":"""如果你给了存储权限
|
{"q":"如何访问设备文件?", "a":"""如果你给了存储权限
|
||||||
那么通过主目录下的文件夹
|
那么通过主目录下的文件夹
|
||||||
就可以访问设备存储
|
就可以访问设备存储
|
||||||
要访问整个设备存储可以访问sd文件夹
|
要访问整个设备存储可以访问sd文件夹
|
||||||
此外主文件夹的很多文件夹与设备文件夹绑定
|
此外主文件夹的很多文件夹与设备文件夹绑定
|
||||||
比如主文件夹的下载文件夹就是设备的下载文件夹"""},
|
比如主文件夹的下载文件夹就是设备的下载文件夹"""},
|
||||||
|
{"q":"如何访问SD卡文件?", "a":"""首先用其他文件管理器查看SD卡路径
|
||||||
|
(通常为/storage/xxxx...)
|
||||||
|
然后把该地址输入到小小电脑的文件管理器回车即可
|
||||||
|
|
||||||
|
注意不要只输/storage
|
||||||
|
或者从/storage文件夹点进去
|
||||||
|
那样是没有权限的"""},
|
||||||
{"q":"自带的火狐浏览器无法下载文件", "a":"""检查是否授予小小电脑存储权限
|
{"q":"自带的火狐浏览器无法下载文件", "a":"""检查是否授予小小电脑存储权限
|
||||||
|
|
||||||
火狐下载的文件会保存在设备的下载文件夹
|
火狐下载的文件会保存在设备的下载文件夹
|
||||||
@@ -398,10 +369,11 @@ VSCode、输入法
|
|||||||
|
|
||||||
请几个小时后再试一次"""},
|
请几个小时后再试一次"""},
|
||||||
{"q":"找不到sys/cdefs.h", "a":"""点击上面无法编译C语言程序的快捷指令"""},
|
{"q":"找不到sys/cdefs.h", "a":"""点击上面无法编译C语言程序的快捷指令"""},
|
||||||
|
{"q":"安装box86/box64/wine很慢", "a":"""请尝试使用魔法"""},
|
||||||
];
|
];
|
||||||
|
|
||||||
//默认快捷指令
|
//默认快捷指令
|
||||||
static const commands = [{"name":"检查更新并升级", "command":"sudo dpkg --configure -a && sudo apt update && sudo apt upgrade -y && sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8"},
|
static const commands = [{"name":"检查更新并升级", "command":"sudo dpkg --configure -a && sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8"},
|
||||||
{"name":"查看系统信息", "command":"neofetch -L && neofetch --off"},
|
{"name":"查看系统信息", "command":"neofetch -L && neofetch --off"},
|
||||||
{"name":"清屏", "command":"clear"},
|
{"name":"清屏", "command":"clear"},
|
||||||
{"name":"中断任务", "command":"\x03"},
|
{"name":"中断任务", "command":"\x03"},
|
||||||
@@ -412,8 +384,7 @@ VSCode、输入法
|
|||||||
{"name":"安装科学计算软件Octave", "command":"sudo apt update && sudo apt install -y octave"},
|
{"name":"安装科学计算软件Octave", "command":"sudo apt update && sudo apt install -y octave"},
|
||||||
{"name":"卸载Octave", "command":"sudo apt autoremove --purge -y octave"},
|
{"name":"卸载Octave", "command":"sudo apt autoremove --purge -y octave"},
|
||||||
{"name":"安装WPS", "command":r"""cat << 'EOF' | sh && sudo dpkg --configure -a && sudo apt update && sudo apt install -y /tmp/wps.deb
|
{"name":"安装WPS", "command":r"""cat << 'EOF' | sh && sudo dpkg --configure -a && sudo apt update && sudo apt install -y /tmp/wps.deb
|
||||||
url=https://wps-linux-personal.wpscdn.cn/wps/download/ep/Linux2019/11720/wps-office_11.1.0.11720_arm64.deb
|
wget https://mirrors.sdu.edu.cn/spark-store-repository/aarch64-store/office/wps-office/wps-office_11.1.0.11720_arm64.deb -O /tmp/wps.deb
|
||||||
wget "${url}?k=$(eval echo -n '7f8faaaa468174dc1c9cd62e5f218a5b/$(echo -n ${url} | cut -d/ -f4-)0x7f53d55201314' | md5sum -t | cut -d' ' -f1)&t=0x7f53d55201314" --header="User-Agent: Mozilla/5.0 (X11; Linux aarch64; rv:109.0) Gecko/20100101 Firefox/115.0" --header="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" --header="Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2" --header="Accept-Encoding: gzip, deflate, br" --header="Connection: keep-alive" --header="Referer: https://www.wps.cn/" --header="Upgrade-Insecure-Requests: 1" --header="Sec-Fetch-Dest: document" --header="Sec-Fetch-Mode: navigate" --header="Sec-Fetch-Site: cross-site" --header="Sec-Fetch-User: ?1" -O /tmp/wps.deb
|
|
||||||
EOF
|
EOF
|
||||||
rm /tmp/wps.deb"""},
|
rm /tmp/wps.deb"""},
|
||||||
{"name":"卸载WPS", "command":"sudo apt autoremove --purge -y wps-office"},
|
{"name":"卸载WPS", "command":"sudo apt autoremove --purge -y wps-office"},
|
||||||
@@ -474,7 +445,7 @@ rm /tmp/wps.deb"""},
|
|||||||
{"name": "F12", "key": TerminalKey.f12},
|
{"name": "F12", "key": TerminalKey.f12},
|
||||||
];
|
];
|
||||||
|
|
||||||
static const String boot = "\$DATA_DIR/bin/proot -H --change-id=1000:1000 --pwd=/home/tiny --rootfs=\$CONTAINER_DIR --mount=/system --mount=/apex --mount=/sys --kill-on-exit --mount=/storage:/storage --sysvipc -L --link2symlink --mount=/proc:/proc --mount=/dev:/dev --mount=\$CONTAINER_DIR/tmp:/dev/shm --mount=/dev/urandom:/dev/random --mount=/proc/self/fd:/dev/fd --mount=/proc/self/fd/0:/dev/stdin --mount=/proc/self/fd/1:/dev/stdout --mount=/proc/self/fd/2:/dev/stderr --mount=/dev/null:/dev/tty0 --mount=/dev/null:/proc/sys/kernel/cap_last_cap --mount=/storage/self/primary:/media/sd --mount=\$DATA_DIR/share:/home/tiny/公共 --mount=\$DATA_DIR/tiny:/home/tiny/.local/share/tiny --mount=/storage/self/primary/Fonts:/usr/share/fonts/wpsm --mount=/storage/self/primary/AppFiles/Fonts:/usr/share/fonts/yozom --mount=/system/fonts:/usr/share/fonts/androidm --mount=/storage/self/primary/Pictures:/home/tiny/图片 --mount=/storage/self/primary/Music:/home/tiny/音乐 --mount=/storage/self/primary/Movies:/home/tiny/视频 --mount=/storage/self/primary/Download:/home/tiny/下载 --mount=/storage/self/primary/DCIM:/home/tiny/照片 --mount=/storage/self/primary/Documents:/home/tiny/文档 --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/.tmoe-container.stat:/proc/stat --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/.tmoe-container.version:/proc/version --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/bus:/proc/bus --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/buddyinfo:/proc/buddyinfo --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/cgroups:/proc/cgroups --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/consoles:/proc/consoles --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/crypto:/proc/crypto --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/devices:/proc/devices --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/diskstats:/proc/diskstats --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/execdomains:/proc/execdomains --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/fb:/proc/fb --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/filesystems:/proc/filesystems --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/interrupts:/proc/interrupts --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/iomem:/proc/iomem --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/ioports:/proc/ioports --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/kallsyms:/proc/kallsyms --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/keys:/proc/keys --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/key-users:/proc/key-users --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/kpageflags:/proc/kpageflags --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/loadavg:/proc/loadavg --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/locks:/proc/locks --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/misc:/proc/misc --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/modules:/proc/modules --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/pagetypeinfo:/proc/pagetypeinfo --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/partitions:/proc/partitions --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/sched_debug:/proc/sched_debug --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/softirqs:/proc/softirqs --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/timer_list:/proc/timer_list --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/uptime:/proc/uptime --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/vmallocinfo:/proc/vmallocinfo --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/vmstat:/proc/vmstat --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/zoneinfo:/proc/zoneinfo \$EXTRA_MOUNT /usr/bin/env -i HOSTNAME=TINY HOME=/home/tiny USER=tiny TERM=xterm-256color SDL_IM_MODULE=fcitx XMODIFIERS=@im=fcitx QT_IM_MODULE=fcitx GTK_IM_MODULE=fcitx TMOE_CHROOT=false TMOE_PROOT=true TMPDIR=/tmp MOZ_FAKE_NO_SANDBOX=1 DISPLAY=:4 PULSE_SERVER=tcp:127.0.0.1:4718 LANG=zh_CN.UTF-8 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/games \$EXTRA_OPT /bin/bash -l";
|
static const String boot = "\$DATA_DIR/bin/proot -H --change-id=1000:1000 --pwd=/home/tiny --rootfs=\$CONTAINER_DIR --mount=/system --mount=/apex --mount=/sys --mount=/data --kill-on-exit --mount=/storage --sysvipc -L --link2symlink --mount=/proc --mount=/dev --mount=\$CONTAINER_DIR/tmp:/dev/shm --mount=/dev/urandom:/dev/random --mount=/proc/self/fd:/dev/fd --mount=/proc/self/fd/0:/dev/stdin --mount=/proc/self/fd/1:/dev/stdout --mount=/proc/self/fd/2:/dev/stderr --mount=/dev/null:/dev/tty0 --mount=/dev/null:/proc/sys/kernel/cap_last_cap --mount=/storage/self/primary:/media/sd --mount=\$DATA_DIR/share:/home/tiny/公共 --mount=\$DATA_DIR/tiny:/home/tiny/.local/share/tiny --mount=/storage/self/primary/Fonts:/usr/share/fonts/wpsm --mount=/storage/self/primary/AppFiles/Fonts:/usr/share/fonts/yozom --mount=/system/fonts:/usr/share/fonts/androidm --mount=/storage/self/primary/Pictures:/home/tiny/图片 --mount=/storage/self/primary/Music:/home/tiny/音乐 --mount=/storage/self/primary/Movies:/home/tiny/视频 --mount=/storage/self/primary/Download:/home/tiny/下载 --mount=/storage/self/primary/DCIM:/home/tiny/照片 --mount=/storage/self/primary/Documents:/home/tiny/文档 --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/.tmoe-container.stat:/proc/stat --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/.tmoe-container.version:/proc/version --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/bus:/proc/bus --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/buddyinfo:/proc/buddyinfo --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/cgroups:/proc/cgroups --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/consoles:/proc/consoles --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/crypto:/proc/crypto --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/devices:/proc/devices --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/diskstats:/proc/diskstats --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/execdomains:/proc/execdomains --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/fb:/proc/fb --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/filesystems:/proc/filesystems --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/interrupts:/proc/interrupts --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/iomem:/proc/iomem --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/ioports:/proc/ioports --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/kallsyms:/proc/kallsyms --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/keys:/proc/keys --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/key-users:/proc/key-users --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/kpageflags:/proc/kpageflags --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/loadavg:/proc/loadavg --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/locks:/proc/locks --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/misc:/proc/misc --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/modules:/proc/modules --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/pagetypeinfo:/proc/pagetypeinfo --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/partitions:/proc/partitions --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/sched_debug:/proc/sched_debug --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/softirqs:/proc/softirqs --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/timer_list:/proc/timer_list --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/uptime:/proc/uptime --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/vmallocinfo:/proc/vmallocinfo --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/vmstat:/proc/vmstat --mount=\$CONTAINER_DIR/usr/local/etc/tmoe-linux/proot_proc/zoneinfo:/proc/zoneinfo \$EXTRA_MOUNT /usr/bin/env -i HOSTNAME=TINY HOME=/home/tiny USER=tiny TERM=xterm-256color SDL_IM_MODULE=fcitx XMODIFIERS=@im=fcitx QT_IM_MODULE=fcitx GTK_IM_MODULE=fcitx TMOE_CHROOT=false TMOE_PROOT=true TMPDIR=/tmp MOZ_FAKE_NO_SANDBOX=1 DISPLAY=:4 PULSE_SERVER=tcp:127.0.0.1:4718 LANG=zh_CN.UTF-8 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/games \$EXTRA_OPT /bin/bash -l";
|
||||||
|
|
||||||
static final ButtonStyle commandButtonStyle = OutlinedButton.styleFrom(
|
static final ButtonStyle commandButtonStyle = OutlinedButton.styleFrom(
|
||||||
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||||
@@ -511,8 +482,6 @@ class G {
|
|||||||
//static int? streamingPid;
|
//static int? streamingPid;
|
||||||
static String streamingOutput = "";
|
static String streamingOutput = "";
|
||||||
static late Pty streamServerPty;
|
static late Pty streamServerPty;
|
||||||
static bool isVirglServerStarted = false;
|
|
||||||
static late Pty virglServerPty;
|
|
||||||
//static int? virglPid;
|
//static int? virglPid;
|
||||||
static ValueNotifier<int> pageIndex = ValueNotifier(0); //主界面索引
|
static ValueNotifier<int> pageIndex = ValueNotifier(0); //主界面索引
|
||||||
static ValueNotifier<bool> terminalPageChange = ValueNotifier(true); //更改值,用于刷新小键盘
|
static ValueNotifier<bool> terminalPageChange = ValueNotifier(true); //更改值,用于刷新小键盘
|
||||||
@@ -709,6 +678,7 @@ done
|
|||||||
final String h = (min(s.width, s.height) * 0.75).round().toString();
|
final String h = (min(s.width, s.height) * 0.75).round().toString();
|
||||||
G.postCommand = """sed -i -E "s@(geometry)=.*@\\1=${w}x${h}@" /etc/tigervnc/vncserver-config-tmoe
|
G.postCommand = """sed -i -E "s@(geometry)=.*@\\1=${w}x${h}@" /etc/tigervnc/vncserver-config-tmoe
|
||||||
sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)""";
|
sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)""";
|
||||||
|
await G.prefs.setBool("getifaddrsBridge", (await DeviceInfoPlugin().androidInfo).version.sdkInt >= 31);
|
||||||
}
|
}
|
||||||
G.currentContainer = Util.getGlobal("defaultContainer") as int;
|
G.currentContainer = Util.getGlobal("defaultContainer") as int;
|
||||||
|
|
||||||
@@ -773,6 +743,9 @@ export CONTAINER_DIR=\$DATA_DIR/containers/${G.currentContainer}
|
|||||||
${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}""");
|
${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}""");
|
||||||
extraOpt += "${Util.getGlobal("defaultVirglOpt")} ";
|
extraOpt += "${Util.getGlobal("defaultVirglOpt")} ";
|
||||||
}
|
}
|
||||||
|
if (Util.getGlobal("turnip")) {
|
||||||
|
extraOpt += "${Util.getGlobal("defaultTurnipOpt")} ";
|
||||||
|
}
|
||||||
if (Util.getGlobal("isBoxEnabled")) {
|
if (Util.getGlobal("isBoxEnabled")) {
|
||||||
G.wasBoxEnabled = true;
|
G.wasBoxEnabled = true;
|
||||||
extraMount += "--x86=/home/tiny/.local/bin/box86 --x64=/home/tiny/.local/bin/box64 ";
|
extraMount += "--x86=/home/tiny/.local/bin/box86 --x64=/home/tiny/.local/bin/box64 ";
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
import device_info_plus
|
||||||
import dynamic_color
|
import dynamic_color
|
||||||
import ffmpeg_kit_flutter_full_gpl
|
import ffmpeg_kit_flutter_full_gpl
|
||||||
import network_info_plus
|
import network_info_plus
|
||||||
@@ -15,6 +16,7 @@ import url_launcher_macos
|
|||||||
import wakelock_plus
|
import wakelock_plus
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
|
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||||
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
|
||||||
FFmpegKitFlutterPlugin.register(with: registry.registrar(forPlugin: "FFmpegKitFlutterPlugin"))
|
FFmpegKitFlutterPlugin.register(with: registry.registrar(forPlugin: "FFmpegKitFlutterPlugin"))
|
||||||
NetworkInfoPlusPlugin.register(with: registry.registrar(forPlugin: "NetworkInfoPlusPlugin"))
|
NetworkInfoPlusPlugin.register(with: registry.registrar(forPlugin: "NetworkInfoPlusPlugin"))
|
||||||
|
|||||||
88
pubspec.lock
88
pubspec.lock
@@ -73,6 +73,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.10"
|
version: "0.7.10"
|
||||||
|
device_info_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: device_info_plus
|
||||||
|
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.1.2"
|
||||||
|
device_info_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: device_info_plus_platform_interface
|
||||||
|
sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "7.0.1"
|
||||||
dynamic_color:
|
dynamic_color:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -276,10 +292,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: package_info_plus
|
name: package_info_plus
|
||||||
sha256: "4de6c36df77ffbcef0a5aefe04669d33f2d18397fea228277b852a2d4e58e860"
|
sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.0.1"
|
version: "8.0.2"
|
||||||
package_info_plus_platform_interface:
|
package_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -300,10 +316,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: path_provider
|
name: path_provider
|
||||||
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
|
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.3"
|
version: "2.1.4"
|
||||||
path_provider_android:
|
path_provider_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -356,10 +372,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54
|
sha256: eaf2a1ec4472775451e88ca6a7b86559ef2f1d1ed903942ed135e38ea0097dca
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.0.7"
|
version: "12.0.8"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -380,10 +396,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_platform_interface
|
name: permission_handler_platform_interface
|
||||||
sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20"
|
sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.2.1"
|
version: "4.2.2"
|
||||||
permission_handler_windows:
|
permission_handler_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -436,58 +452,58 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
|
sha256: c272f9cabca5a81adc9b0894381e9c1def363e980f960fa903c604c471b22f68
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.3"
|
version: "2.3.1"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "3d4571b3c5eb58ce52a419d86e655493d0bc3020672da79f72fa0c16ca3a8ec1"
|
sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.4"
|
version: "2.3.1"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_foundation
|
name: shared_preferences_foundation
|
||||||
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
|
sha256: "776786cff96324851b656777648f36ac772d88bc4c669acff97b7fce5de3c849"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.5.1"
|
||||||
shared_preferences_linux:
|
shared_preferences_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_linux
|
name: shared_preferences_linux
|
||||||
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
|
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.1"
|
||||||
shared_preferences_platform_interface:
|
shared_preferences_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_platform_interface
|
name: shared_preferences_platform_interface
|
||||||
sha256: "034650b71e73629ca08a0bd789fd1d83cc63c2d1e405946f7cef7bc37432f93a"
|
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.4.1"
|
||||||
shared_preferences_web:
|
shared_preferences_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_web
|
name: shared_preferences_web
|
||||||
sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
|
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.0"
|
version: "2.4.2"
|
||||||
shared_preferences_windows:
|
shared_preferences_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_windows
|
name: shared_preferences_windows
|
||||||
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
|
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.1"
|
||||||
sky_engine:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -561,10 +577,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: "678979703e10d7862c551c736fe6b9f185261bddf141b46672063b99790bc700"
|
sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.7"
|
version: "6.3.8"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -577,10 +593,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_linux
|
name: url_launcher_linux
|
||||||
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
|
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.1"
|
version: "3.2.0"
|
||||||
url_launcher_macos:
|
url_launcher_macos:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -601,10 +617,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_web
|
name: url_launcher_web
|
||||||
sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
|
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.1"
|
version: "2.3.3"
|
||||||
url_launcher_windows:
|
url_launcher_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -665,10 +681,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: "060e1a621add859dc822f3e4c59b01468e8515ea78cfc5ac4c6b28bc903b5f74"
|
sha256: c66651fba15f9d7ddd31daec42da8d6bce46c85610a7127e3ebcb39a4395c3c9
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.16.5"
|
version: "3.16.6"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -689,10 +705,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4
|
sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.5.1"
|
version: "5.5.3"
|
||||||
|
win32_registry:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: win32_registry
|
||||||
|
sha256: "723b7f851e5724c55409bb3d5a32b203b3afe8587eaf5dafb93a5fed8ecda0d6"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.4"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.0.16+12
|
version: 1.0.17+13
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.1.0 <4.0.0'
|
sdk: '>=3.1.0 <4.0.0'
|
||||||
@@ -46,6 +46,7 @@ dependencies:
|
|||||||
dynamic_color: ^1.7.0
|
dynamic_color: ^1.7.0
|
||||||
flutter_speed_dial: ^7.0.0
|
flutter_speed_dial: ^7.0.0
|
||||||
network_info_plus: ^6.0.0
|
network_info_plus: ^6.0.0
|
||||||
|
device_info_plus: ^10.1.2
|
||||||
|
|
||||||
# The following adds the Cupertino Icons font to your application.
|
# The following adds the Cupertino Icons font to your application.
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
# Use with the CupertinoIcons class for iOS style icons.
|
||||||
|
|||||||
Reference in New Issue
Block a user