Skip to content

Commit

Permalink
Web page
Browse files Browse the repository at this point in the history
  • Loading branch information
jing332 committed Jan 15, 2024
1 parent 2197f4d commit 29850d8
Show file tree
Hide file tree
Showing 16 changed files with 289 additions and 97 deletions.
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def alistVersion = rootProject.file("../alist_version").readLines()[0]

android {
namespace "com.github.jing332.alistflutter"
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileSdkVersion 34
ndkVersion "25.1.8937393"

signingConfigs {
release {
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" />

<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,9 @@ public interface Android {

void setAdminPwd(@NonNull String pwd);

@NonNull
Long getAListHttpPort();

@NonNull
Boolean isRunning();

Expand Down Expand Up @@ -339,6 +342,28 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable Android ap
api.setAdminPwd(pwdArg);
wrapped.add(0, null);
}
catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger, "dev.flutter.pigeon.alist_flutter.Android.getAListHttpPort", getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
try {
Long output = api.getAListHttpPort();
wrapped.add(0, output);
}
catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
Expand Down Expand Up @@ -488,44 +513,6 @@ static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable Android ap
}
}
/** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
public static class Flutter {
private final @NonNull BinaryMessenger binaryMessenger;

public Flutter(@NonNull BinaryMessenger argBinaryMessenger) {
this.binaryMessenger = argBinaryMessenger;
}

/** Public interface for sending reply. */
/** The codec used by Flutter. */
static @NonNull MessageCodec<Object> getCodec() {
return new StandardMessageCodec();
}
public void getLocalIpAddress(@NonNull Result<String> result) {
final String channelName = "dev.flutter.pigeon.alist_flutter.Flutter.getLocalIpAddress";
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger, channelName, getCodec());
channel.send(
null,
channelReply -> {
if (channelReply instanceof List) {
List<Object> listReply = (List<Object>) channelReply;
if (listReply.size() > 1) {
result.error(new FlutterError((String) listReply.get(0), (String) listReply.get(1), (String) listReply.get(2)));
} else if (listReply.get(0) == null) {
result.error(new FlutterError("null-error", "Flutter api returned null value for non-null return value.", ""));
} else {
@SuppressWarnings("ConstantConditions")
String output = (String) listReply.get(0);
result.success(output);
}
} else {
result.error(createConnectionError(channelName));
}
});
}
}
/** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
public static class Event {
private final @NonNull BinaryMessenger binaryMessenger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ class AndroidBridge(private val context: Context) : GeneratedApi.Android {
AList.setAdminPassword(pwd)
}

override fun getAListHttpPort(): Long {
return AList.getHttpPort().toLong()
}

override fun isRunning() = AListService.isRunning
override fun getAListVersion() = BuildConfig.ALIST_VERSION
override fun getVersionName() = BuildConfig.VERSION_NAME
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ object AList {

private var mProcess: Process? = null

private fun handleLog(log:String){
private fun handleLog(log: String) {
log.removeAnsiCodes().evalLog()?.let {
Logger.log(level = it.level, time = it.time, msg = it.message)
} ?: run {
Expand Down Expand Up @@ -112,4 +112,8 @@ object AList {
return ProcessBuilder(*cmdline).redirectErrorStream(redirect).start()
?: throw IOException("Process is null!")
}

fun getHttpPort(): Int {
return AListConfigManager.config().scheme.httpPort
}
}
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ buildscript {
}

dependencies {
classpath "com.android.tools.build:gradle:3.5.3"
classpath "com.android.tools.build:gradle:$agp_version"
// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

}
Expand Down
55 changes: 27 additions & 28 deletions lib/generated_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,33 @@ class Android {
}
}

Future<int> getAListHttpPort() async {
const String __pigeon_channelName = 'dev.flutter.pigeon.alist_flutter.Android.getAListHttpPort';
final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>(
__pigeon_channelName,
pigeonChannelCodec,
binaryMessenger: __pigeon_binaryMessenger,
);
final List<Object?>? __pigeon_replyList =
await __pigeon_channel.send(null) as List<Object?>?;
if (__pigeon_replyList == null) {
throw _createConnectionError(__pigeon_channelName);
} else if (__pigeon_replyList.length > 1) {
throw PlatformException(
code: __pigeon_replyList[0]! as String,
message: __pigeon_replyList[1] as String?,
details: __pigeon_replyList[2],
);
} else if (__pigeon_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (__pigeon_replyList[0] as int?)!;
}
}

Future<bool> isRunning() async {
const String __pigeon_channelName = 'dev.flutter.pigeon.alist_flutter.Android.isRunning';
final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>(
Expand Down Expand Up @@ -412,34 +439,6 @@ class Android {
}
}

abstract class Flutter {
static const MessageCodec<Object?> pigeonChannelCodec = StandardMessageCodec();

String getLocalIpAddress();

static void setup(Flutter? api, {BinaryMessenger? binaryMessenger}) {
{
final BasicMessageChannel<Object?> __pigeon_channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.alist_flutter.Flutter.getLocalIpAddress', pigeonChannelCodec,
binaryMessenger: binaryMessenger);
if (api == null) {
__pigeon_channel.setMessageHandler(null);
} else {
__pigeon_channel.setMessageHandler((Object? message) async {
try {
final String output = api.getLocalIpAddress();
return wrapResponse(result: output);
} on PlatformException catch (e) {
return wrapResponse(error: e);
} catch (e) {
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
}
});
}
}
}
}

abstract class Event {
static const MessageCodec<Object?> pigeonChannelCodec = StandardMessageCodec();

Expand Down
19 changes: 13 additions & 6 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import 'dart:async';

import 'package:alist_flutter/generated_api.dart';
import 'package:alist_flutter/pages/alist.dart';
import 'package:alist_flutter/pages/alist/alist.dart';
import 'package:alist_flutter/pages/settings/settings.dart';
import 'package:alist_flutter/pages/web.dart';
import 'package:alist_flutter/pages/web/web.dart';
import 'package:alist_flutter/router.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:get/get.dart';

void main() {
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Android
if (!kIsWeb &&
kDebugMode &&
defaultTargetPlatform == TargetPlatform.android) {
await InAppWebViewController.setWebContentsDebuggingEnabled(kDebugMode);
}

runApp(const MyApp());
}

Expand Down
4 changes: 2 additions & 2 deletions lib/pages/alist.dart → lib/pages/alist/alist.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'dart:developer';

import 'package:alist_flutter/generated_api.dart';
import 'package:alist_flutter/pages/pwd_edit_dialog.dart';
import 'package:alist_flutter/pages/alist/pwd_edit_dialog.dart';
import 'package:alist_flutter/widgets/switch_floating_action_button.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'alist/log_list_view.dart';
import 'log_list_view.dart';

class AListScreen extends StatelessWidget {
const AListScreen({Key? key}) : super(key: key);
Expand Down
File renamed without changes.
12 changes: 0 additions & 12 deletions lib/pages/web.dart

This file was deleted.

127 changes: 127 additions & 0 deletions lib/pages/web/web.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import 'package:alist_flutter/generated_api.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:get/get.dart';

class WebScreen extends StatefulWidget {
const WebScreen({Key? key}) : super(key: key);

@override
State<StatefulWidget> createState() {
return _WebScreenState();
}
}

class _WebScreenState extends State<WebScreen> {
InAppWebViewController? _webViewController;
double _progress = 0;
String _url = "http://localhost:5244";

@override
void initState() {
Android()
.getAListHttpPort()
.then((port) => {_url = "http://localhost:$port"});
super.initState();
}

@override
Widget build(BuildContext context) {
return PopScope(
onPopInvoked: (b) {
_webViewController?.canGoBack().then((value) => {
if (value) {_webViewController?.goBack()} else {Get.back()}
});
},
child: Scaffold(
body: Column(children: <Widget>[
SizedBox(height: MediaQuery.of(context).padding.top),
LinearProgressIndicator(
value: _progress,
backgroundColor: Colors.grey[200],
valueColor: const AlwaysStoppedAnimation<Color>(Colors.blue),
),
Expanded(
child: InAppWebView(
initialUrlRequest: URLRequest(url: WebUri(_url)),
onWebViewCreated: (InAppWebViewController controller) {
_webViewController = controller;
},
onLoadStart: (InAppWebViewController controller, Uri? url) {
setState(() {
_progress = 0;
});
},
shouldOverrideUrlLoading: (controller, navigationAction) async {
if (navigationAction.request.url?.scheme.startsWith("http") ==
true) {
return NavigationActionPolicy.ALLOW;
}
Get.showSnackbar(GetSnackBar(
message:
"shouldOverrideUrlLoading ${navigationAction.request.url}",
duration: const Duration(seconds: 3),
mainButton: TextButton(
onPressed: () {},
child: const Text('前往'),
)));

return NavigationActionPolicy.CANCEL;
},
onDownloadStartRequest: (controller, url) async {
Get.showSnackbar(GetSnackBar(
message: "是否下载文件? ${url.contentDisposition}",
duration: const Duration(seconds: 3),
mainButton: TextButton(
onPressed: () {},
child: const Text('下载'),
)));
},
onLoadStop:
(InAppWebViewController controller, Uri? url) async {
setState(() {
_progress = 0;
});
},
onProgressChanged:
(InAppWebViewController controller, int progress) {
setState(() {
_progress = progress / 100;
if (_progress == 1) _progress = 0;
});
},
),
),
ButtonBar(
alignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
child: const Icon(Icons.arrow_back),
onPressed: () {
if (_webViewController != null) {
_webViewController!.goBack();
}
},
),
ElevatedButton(
child: const Icon(Icons.arrow_forward),
onPressed: () {
if (_webViewController != null) {
_webViewController!.goForward();
}
},
),
ElevatedButton(
child: const Icon(Icons.refresh),
onPressed: () {
if (_webViewController != null) {
_webViewController!.reload();
}
},
),
],
),
]),
));
}
}
Loading

0 comments on commit 29850d8

Please sign in to comment.