Skip to content
This repository has been archived by the owner on Feb 14, 2022. It is now read-only.

Commit

Permalink
增加版本检测
Browse files Browse the repository at this point in the history
  • Loading branch information
januwA committed Jul 6, 2019
1 parent 3510467 commit 797bdd2
Show file tree
Hide file tree
Showing 8 changed files with 195 additions and 8 deletions.
20 changes: 14 additions & 6 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.flutter_video_app">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application android:name="io.flutter.app.FlutterApplication" android:label="Anime" android:icon="@mipmap/ic_launcher">
<activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
Expand All @@ -19,5 +16,16 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<provider android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider" android:authorities="${applicationId}.flutter_downloader.provider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
</provider>

<provider android:name="androidx.work.impl.WorkManagerInitializer" android:authorities="${applicationId}.workmanager-init" android:enabled="false" android:exported="false" />

<provider android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer" android:authorities="${applicationId}.flutter-downloader-init" android:exported="false">
<meta-data android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS" android:value="5" />
</provider>
</application>

</manifest>
8 changes: 8 additions & 0 deletions android/app/src/main/res/values-b+zh+ZH/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<resources>
<string name="flutter_downloader_notification_started">下载开始</string>
<string name="flutter_downloader_notification_in_progress">正在下载</string>
<string name="flutter_downloader_notification_canceled">下载取消</string>
<string name="flutter_downloader_notification_failed">下载错误</string>
<string name="flutter_downloader_notification_complete">下载完成</string>
<string name="flutter_downloader_notification_paused">下载暂停</string>
</resources>
8 changes: 8 additions & 0 deletions android/app/src/main/res/values-b+zh+ZH/styles.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
</resources>
8 changes: 8 additions & 0 deletions android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<resources>
<string name="flutter_downloader_notification_started">Download started</string>
<string name="flutter_downloader_notification_in_progress">Download in progress</string>
<string name="flutter_downloader_notification_canceled">Download canceled</string>
<string name="flutter_downloader_notification_failed">Download failed</string>
<string name="flutter_downloader_notification_complete">Download complete</string>
<string name="flutter_downloader_notification_paused">Download paused</string>
</resources>
114 changes: 114 additions & 0 deletions lib/pages/home/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_video_app/models/week_data_dto/week_data_dto.dart';
import 'package:flutter_video_app/pages/home/home.store.dart';
import 'package:flutter_video_app/pages/list_search/list_search.dart';
import 'package:flutter_video_app/pages/nicotv/nicotv_page.dart';
import 'package:flutter_video_app/shared/widgets/anime_card.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:package_info/package_info.dart';
import 'package:http/http.dart' as http;
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:path/path.dart' as path;
import 'package:install_plugin/install_plugin.dart' show InstallPlugin;

final homeStore = HomeStore();

Expand All @@ -15,6 +25,7 @@ class HomePage extends StatefulWidget {

class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
TabController tabController;
bool _permissisonReady = false;
@override
void initState() {
super.initState();
Expand All @@ -25,11 +36,114 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
tabController.addListener(() {
homeStore.setInitialIndex(tabController.index);
});
_checkVertion();
}

Future<void> _checkVertion() async {
_permissisonReady = await _checkPermission();
if (!_permissisonReady) return;
final PackageInfo info = await PackageInfo.fromPlatform();
String localVertion = info.version;
var r = await http.get(
'https://api.github.com/repos/januwA/flutter_anime_app/releases/latest');
var body = jsonDecode(r.body);
String latestVertion = body['tag_name'];
if (localVertion != latestVertion) {
_showDIalog(localVertion, latestVertion, body);
}
}

_showDIalog(localVertion, latestVertion, body) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('有新版本可以更新!'),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text('当前版本: v$localVertion'),
Text('最新版本: v$latestVertion'),
],
),
),
actions: <Widget>[
FlatButton(
child: Text('取消'),
onPressed: () {
Navigator.of(context).pop();
},
),
RaisedButton(
child: Text(
'确定',
style: TextStyle(color: Colors.white),
),
onPressed: () {
Navigator.of(context).pop();
List assets = body['assets'];
String browserDownloadUrl = assets[0]['browser_download_url'];
_downloadApp(browserDownloadUrl, assets[0]['id']);
},
),
],
);
},
);
}

_downloadApp(String browserDownloadUrl, appId) async {
String _localPath = (await _findLocalPath()) + '/AnimeApp';

final savedDir = Directory(_localPath);
bool hasExisted = await savedDir.exists();
if (!hasExisted) {
savedDir.create();
}
final taskId = await FlutterDownloader.enqueue(
url: browserDownloadUrl,
savedDir: _localPath,
showNotification: true, // 显示状态栏中的下载进度(适用于Android)
openFileFromNotification: true, // 点击通知打开下载的文件(适用于Android)
);
FlutterDownloader.registerCallback((id, status, progress) async {
if (taskId == id && status == DownloadTaskStatus.complete) {
File df = File(path.joinAll([_localPath, 'app-release.apk']));
final PackageInfo info = await PackageInfo.fromPlatform();
InstallPlugin.installApk(df.path, info.packageName);
}
});
}

Future<String> _findLocalPath() async {
final directory = await getExternalStorageDirectory();
return directory.path;
}

Future<bool> _checkPermission() async {
if (Platform.isAndroid) {
PermissionStatus permission = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.storage);
if (permission != PermissionStatus.granted) {
Map<PermissionGroup, PermissionStatus> permissions =
await PermissionHandler()
.requestPermissions([PermissionGroup.storage]);
if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
return true;
}
} else {
return true;
}
} else {
return true;
}
return false;
}

@override
void dispose() {
tabController.dispose();
FlutterDownloader.registerCallback(null);
super.dispose();
}

Expand Down
37 changes: 36 additions & 1 deletion pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_downloader:
dependency: "direct main"
description:
name: flutter_downloader
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.7"
flutter_mobx:
dependency: "direct main"
description:
Expand Down Expand Up @@ -228,6 +235,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.3"
install_plugin:
dependency: "direct main"
description:
name: install_plugin
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.1"
io:
dependency: transitive
description:
Expand Down Expand Up @@ -305,6 +319,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.5"
package_info:
dependency: "direct main"
description:
name: package_info
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.0+4"
package_resolver:
dependency: transitive
description:
Expand All @@ -313,19 +334,33 @@ packages:
source: hosted
version: "1.0.10"
path:
dependency: transitive
dependency: "direct main"
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.6.2"
path_provider:
dependency: "direct main"
description:
name: path_provider
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0+1"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.0"
pool:
dependency: transitive
description:
Expand Down
8 changes: 7 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: flutter_video_app
description: A new Flutter project.
version: 1.0.0+1
version: 0.2.2

environment:
sdk: ">=2.2.2 <3.0.0"
Expand All @@ -23,6 +23,12 @@ dependencies:
video_box: ^0.2.2
html: ^0.14.0+1
webview_flutter:
package_info: ^0.4.0+4
flutter_downloader: ^1.1.7
path_provider: ^1.1.0
permission_handler:
path:
install_plugin: ^2.0.1

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit 797bdd2

Please sign in to comment.