mirror of https://github.com/BOINC/boinc.git
Merge pull request #5768 from BOINC/vko_remove_flutter
Remove Flutter sample.
This commit is contained in:
commit
33f2ce63a6
|
@ -1,86 +0,0 @@
|
|||
# This file is part of BOINC.
|
||||
# http://boinc.berkeley.edu
|
||||
# Copyright (C) 2023 University of California
|
||||
#
|
||||
# BOINC is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation,
|
||||
# either version 3 of the License, or (at your option) any later version.
|
||||
#
|
||||
# BOINC is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
name: Flutter-macOS
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '0 0 * * 0'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{ matrix.type }}-flutter-build
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
type: [macos, ios]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Setup xcode
|
||||
uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd
|
||||
with:
|
||||
xcode-version: '12.5.1'
|
||||
|
||||
- name: Setup flutter
|
||||
uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1
|
||||
with:
|
||||
channel: 'beta'
|
||||
|
||||
- name: Setup macos desktop
|
||||
if: matrix.type == 'macos'
|
||||
run: flutter config --enable-macos-desktop
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
|
||||
if: matrix.type == 'macos'
|
||||
with:
|
||||
path: 3rdParty/buildCache
|
||||
key: osx-flutter-${{ hashFiles('3rdParty/*Mac*.sh', 'mac_build/setupForBOINC.sh', 'mac_build/dependencyNames.sh', 'mac_build/[bB]uild*.sh', '.github/workflows/flutter-macos.yml') }}
|
||||
|
||||
- name: Build macos client
|
||||
if: matrix.type == 'macos'
|
||||
run: samples/flutter/ci_build_macos.sh
|
||||
|
||||
- name: Install flutter dependencies
|
||||
run: cd samples/flutter/boinc/ && flutter pub get
|
||||
|
||||
- name: Build macos
|
||||
if: matrix.type == 'macos'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc
|
||||
cd boinc/
|
||||
flutter build macos
|
||||
|
||||
- name: Build ios
|
||||
if: matrix.type == 'ios'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc
|
||||
cd boinc/
|
||||
flutter build ios --release --no-codesign
|
|
@ -1,147 +0,0 @@
|
|||
# This file is part of BOINC.
|
||||
# http://boinc.berkeley.edu
|
||||
# Copyright (C) 2023 University of California
|
||||
#
|
||||
# BOINC is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation,
|
||||
# either version 3 of the License, or (at your option) any later version.
|
||||
#
|
||||
# BOINC is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
name: Flutter-Ubuntu
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '0 0 * * 0'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_KEY }}
|
||||
AWS_DEFAULT_REGION: us-west-2
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{ matrix.type }}-flutter-build
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
type: [linux, android]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Setup Java
|
||||
if: matrix.type == 'android'
|
||||
uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
|
||||
- name: Setup android SDK
|
||||
if: matrix.type == 'android'
|
||||
uses: android-actions/setup-android@00854ea68c109d98c75d956347303bf7c45b0277
|
||||
|
||||
- name: Setup flutter
|
||||
uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1
|
||||
with:
|
||||
channel: 'beta'
|
||||
|
||||
- name: Setup linux desktop
|
||||
if: matrix.type == 'linux'
|
||||
run: flutter config --enable-linux-desktop
|
||||
|
||||
- name: Install linux dependencies
|
||||
if: matrix.type == 'linux'
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install -y clang cmake ninja-build pkg-config libgtk-3-dev
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
|
||||
if: matrix.type == 'linux'
|
||||
with:
|
||||
path: |
|
||||
3rdParty/buildCache
|
||||
!3rdParty/buildCache/linux/vcpkgcache/
|
||||
key: linux-flutter-client-vcpkg-${{ hashFiles('3rdParty/*Linux*.sh', 'linux/*.sh', '.github/workflows/flutter-ubuntu.yml') }}
|
||||
|
||||
- name: Check if build is running from origin repo
|
||||
if: ${{ success() && env.AWS_ACCESS_KEY_ID != 0 && env.AWS_SECRET_ACCESS_KEY != 0 }}
|
||||
run: |
|
||||
echo "VCPKG_BINARY_SOURCES=clear;x-aws,s3://vcpkg.cache.boinc/,readwrite" >> $GITHUB_ENV
|
||||
|
||||
- name: Check if build is running from fork
|
||||
if: ${{ success() && (env.AWS_ACCESS_KEY_ID == 0 || env.AWS_SECRET_ACCESS_KEY == 0) }}
|
||||
run: |
|
||||
echo "VCPKG_BINARY_SOURCES=clear;x-aws-config,no-sign-request;x-aws,s3://vcpkg.cache.boinc/,read" >> $GITHUB_ENV
|
||||
|
||||
- name: Build linux client
|
||||
if: matrix.type == 'linux'
|
||||
run: samples/flutter/ci_build_linux.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
|
||||
if: matrix.type == 'android'
|
||||
with:
|
||||
path: |
|
||||
3rdParty/buildCache
|
||||
!3rdParty/buildCache/android/vcpkgcache/
|
||||
key: android-manager-vcpkg-${{ hashFiles('android/*.sh') }}
|
||||
|
||||
- name: Build android client
|
||||
if: matrix.type == 'android'
|
||||
run: samples/flutter/ci_build_android.sh
|
||||
|
||||
- name: Install flutter dependencies
|
||||
run: cd samples/flutter/boinc/ && flutter pub get
|
||||
|
||||
- name: Build linux
|
||||
if: matrix.type == 'linux'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc
|
||||
cd boinc/
|
||||
flutter build linux
|
||||
|
||||
- name: Build android
|
||||
if: matrix.type == 'android'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc --org edu.berkeley
|
||||
cd boinc/
|
||||
flutter build apk
|
||||
|
||||
- name: Prepare android
|
||||
if: success() && matrix.type == 'android'
|
||||
uses: edgarrc/action-7z@93485892b5468e89cfb2c28a8d1c0e3904906458
|
||||
with:
|
||||
args: 7z a -t7z -mx=9 deploy/flutter_${{ matrix.type }}.7z -r0 samples/flutter/boinc/build/app/outputs/flutter-apk/app-release.apk
|
||||
|
||||
- name: Prepare linux
|
||||
if: success() && matrix.type == 'linux'
|
||||
uses: edgarrc/action-7z@93485892b5468e89cfb2c28a8d1c0e3904906458
|
||||
with:
|
||||
args: 7z a -t7z -mx=9 deploy/flutter_${{ matrix.type }}.7z -r0 samples/flutter/boinc/build/linux/x64/release/bundle/*
|
||||
|
||||
- name: Upload ${{ matrix.type }}
|
||||
if: success()
|
||||
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a
|
||||
with:
|
||||
name: ${{ matrix.type }}_flutter_${{ github.event.pull_request.head.sha }}
|
||||
path: deploy/flutter_${{ matrix.type }}.7z
|
|
@ -1,134 +0,0 @@
|
|||
# This file is part of BOINC.
|
||||
# http://boinc.berkeley.edu
|
||||
# Copyright (C) 2023 University of California
|
||||
#
|
||||
# BOINC is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation,
|
||||
# either version 3 of the License, or (at your option) any later version.
|
||||
#
|
||||
# BOINC is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
name: Flutter-Windows
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '0 0 * * 0'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_KEY }}
|
||||
AWS_DEFAULT_REGION: us-west-2
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{ matrix.type }}-flutter-build
|
||||
runs-on: windows-2019
|
||||
strategy:
|
||||
matrix:
|
||||
type: [windows, web, winuwp]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Setup msbuild
|
||||
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce
|
||||
|
||||
- name: Setup flutter
|
||||
uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1
|
||||
with:
|
||||
channel: 'dev'
|
||||
|
||||
- name: Setup winuwp Desktop
|
||||
if: matrix.type == 'winuwp'
|
||||
run: flutter config --enable-windows-uwp-desktop
|
||||
|
||||
- name: Setup windows Desktop
|
||||
if: matrix.type == 'windows'
|
||||
run: flutter config --enable-windows-desktop
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
|
||||
if: matrix.type == 'windows'
|
||||
with:
|
||||
path: |
|
||||
${{ github.workspace }}\3rdParty\Windows\cuda\
|
||||
key: windows-flutter-x64-Release-${{ hashFiles('win_build/vcpkg_3rdparty_dependencies_vs2019.vcxproj', '.github/workflows/flutter-windows.yml') }}
|
||||
|
||||
- name: Check if build is running from origin repo
|
||||
if: ${{ success() && env.AWS_ACCESS_KEY_ID != 0 && env.AWS_SECRET_ACCESS_KEY != 0 }}
|
||||
run: |
|
||||
echo "VCPKG_BINARY_SOURCES=clear;x-aws,s3://vcpkg.cache.boinc/,readwrite" >> $GITHUB_ENV
|
||||
|
||||
- name: Check if build is running from fork
|
||||
if: ${{ success() && (env.AWS_ACCESS_KEY_ID == 0 || env.AWS_SECRET_ACCESS_KEY == 0) }}
|
||||
run: |
|
||||
echo "VCPKG_BINARY_SOURCES=clear;x-aws-config,no-sign-request;x-aws,s3://vcpkg.cache.boinc/,read" >> $GITHUB_ENV
|
||||
|
||||
- name: Build windows client
|
||||
if: matrix.type == 'windows'
|
||||
run: samples\flutter\ci_build_windows.bat
|
||||
|
||||
- name: Install flutter dependencies
|
||||
run: cd samples/flutter/boinc/ && flutter pub get
|
||||
|
||||
- name: Build winuwp
|
||||
if: matrix.type == 'winuwp'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc
|
||||
cd boinc/
|
||||
flutter build winuwp
|
||||
|
||||
- name: Build windows
|
||||
if: matrix.type == 'windows'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc
|
||||
cd boinc/
|
||||
flutter build windows
|
||||
|
||||
- name: Build web
|
||||
if: matrix.type == 'web'
|
||||
run: |
|
||||
cd samples/flutter/
|
||||
flutter create boinc
|
||||
cd boinc/
|
||||
flutter build web
|
||||
|
||||
- name: Prepare windows
|
||||
if: success() && matrix.type == 'windows'
|
||||
run: |
|
||||
7z.exe a -t7z -mx=9 deploy/flutter_${{ matrix.type }}.7z -r0 samples/flutter/boinc/build/windows/runner/Release/*
|
||||
|
||||
- name: Prepare web
|
||||
if: success() && matrix.type == 'web'
|
||||
run: |
|
||||
7z.exe a -t7z -mx=9 deploy/flutter_${{ matrix.type }}.7z -r0 samples/flutter/boinc/build/web/*
|
||||
|
||||
- name: Prepare winuwp
|
||||
if: success() && matrix.type == 'winuwp'
|
||||
run: |
|
||||
7z.exe a -t7z -mx=9 deploy/flutter_${{ matrix.type }}.7z -r0 samples/flutter/boinc/build/winuwp/runner_uwp/Release/*
|
||||
|
||||
- name: Upload ${{ matrix.type }}
|
||||
if: success()
|
||||
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a
|
||||
with:
|
||||
name: ${{ matrix.type }}_flutter_${{ github.event.pull_request.head.sha }}
|
||||
path: deploy/flutter_${{ matrix.type }}.7z
|
|
@ -1,59 +0,0 @@
|
|||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.packages
|
||||
.pub-cache/
|
||||
.pub/
|
||||
/build/
|
||||
|
||||
# Web related
|
||||
lib/generated_plugin_registrant.dart
|
||||
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
||||
# Windows
|
||||
windows/
|
||||
winuwp/
|
||||
web/
|
||||
|
||||
# Linux
|
||||
linux/
|
||||
android/
|
||||
|
||||
# MacOS
|
||||
macos/
|
||||
ios/
|
|
@ -1,10 +0,0 @@
|
|||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: b22742018b3edf16c6cadd7b76d9db5e7f9064b5
|
||||
channel: beta
|
||||
|
||||
project_type: app
|
|
@ -1,16 +0,0 @@
|
|||
# boinc
|
||||
|
||||
boinc
|
||||
|
||||
## Getting Started
|
||||
|
||||
This project is a starting point for a Flutter application.
|
||||
|
||||
A few resources to get you started if this is your first Flutter project:
|
||||
|
||||
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
|
||||
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
|
||||
|
||||
For help getting started with Flutter, view our
|
||||
[online documentation](https://flutter.dev/docs), which offers tutorials,
|
||||
samples, guidance on mobile development, and a full API reference.
|
|
@ -1,29 +0,0 @@
|
|||
# This file configures the analyzer, which statically analyzes Dart code to
|
||||
# check for errors, warnings, and lints.
|
||||
#
|
||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||
# invoked from the command line by running `flutter analyze`.
|
||||
|
||||
# The following line activates a set of recommended lints for Flutter apps,
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
# included above or to enable additional rules. A list of all available lints
|
||||
# and their documentation is published at
|
||||
# https://dart-lang.github.io/linter/lints/index.html.
|
||||
#
|
||||
# Instead of disabling a lint rule for the entire project in the
|
||||
# section below, it can also be suppressed for a single line of code
|
||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||
# producing the lint.
|
||||
rules:
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
|
@ -1,9 +0,0 @@
|
|||
- assets/arm64-v8a/boinc
|
||||
- assets/armeabi/boinc
|
||||
- assets/armeabi-v7a/boinc
|
||||
- assets/x86/boinc
|
||||
- assets/x86_64/boinc
|
||||
- assets/all_projects_list.xml
|
||||
- assets/ca-bundle.crt
|
||||
- assets/cc_config.xml
|
||||
- assets/nomedia
|
|
@ -1,69 +0,0 @@
|
|||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||
if (flutterRoot == null) {
|
||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '1'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion 31
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "edu.berkeley.boinc"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 28
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig signingConfigs.debug
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation 'commons-io:commons-io:2.7'
|
||||
}
|
|
@ -1,202 +0,0 @@
|
|||
package edu.berkeley.boinc
|
||||
|
||||
import androidx.annotation.NonNull
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import android.util.Log
|
||||
|
||||
import org.apache.commons.io.FileUtils
|
||||
import java.util.*
|
||||
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
private val CHANNEL = "edu.berkeley.boinc/client"
|
||||
private val TAG = "Android kotlin FlutterActivity"
|
||||
private val INSTALL_FAILED = "Failed to install: "
|
||||
private val IOEXCEPTION_LOG = "IOException: "
|
||||
private var isInstall = false
|
||||
private val boincWorkingDir = "/data/data/edu.berkeley.boinc/client/"
|
||||
private val fileNameClient = "boinc"
|
||||
private val fileNameClientCmd = "boinccmd"
|
||||
private val fileNameCABundle = "ca-bundle.crt"
|
||||
private val fileNameClientConfig = "cc_config.xml"
|
||||
private val fileNameAllProjectsList = "all_projects_list.xml"
|
||||
private val fileNameNoMedia = "nomedia"
|
||||
|
||||
internal fun InputStream.copyToFile(destFile: File) = FileUtils.copyInputStreamToFile(this, destFile)
|
||||
internal fun CharSequence.containsAny(vararg sequences: CharSequence) = sequences.any { it in this }
|
||||
|
||||
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
|
||||
super.configureFlutterEngine(flutterEngine)
|
||||
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
|
||||
// Note: this methods is invoked on the main thread.
|
||||
when (call.method) {
|
||||
"runClient" -> {
|
||||
val isRunning = runClient()
|
||||
result.success(isRunning)
|
||||
}
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun runClient(): Boolean {
|
||||
var success = false
|
||||
|
||||
if (!isInstall) {
|
||||
success = installClient()
|
||||
isInstall = success
|
||||
}
|
||||
|
||||
Log.i(TAG, "isInstall: $isInstall")
|
||||
|
||||
if (isInstall) {
|
||||
success = false
|
||||
val param = "--allow_remote_gui_rpc"
|
||||
val cmd = arrayOf(boincWorkingDir + fileNameClient, "--daemon", param)
|
||||
try {
|
||||
Log.i(TAG, "Launching '${cmd[0]}' from '$boincWorkingDir'")
|
||||
|
||||
Runtime.getRuntime().exec(cmd, null, File(boincWorkingDir))
|
||||
success = true
|
||||
} catch (e: IOException) {
|
||||
Log.e(TAG, "Starting BOINC client failed with exception: " + e.message)
|
||||
Log.e(TAG, "IOException", e)
|
||||
}
|
||||
}
|
||||
return success
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Copies given file from APK assets to internal storage.
|
||||
*
|
||||
* @param file name of file as it appears in assets directory
|
||||
* @param executable set executable flag of file in internal storage
|
||||
* @param targetFile name of target file
|
||||
* @return Boolean success
|
||||
*/
|
||||
private fun installFile(file: String, executable: Boolean, targetFile: String): Boolean {
|
||||
var success = false
|
||||
val flutter_prefix = "flutter_assets/assets/"
|
||||
// If file is executable, cpu architecture has to be evaluated
|
||||
// and assets directory select accordingly
|
||||
val source = flutter_prefix + if (executable) assetsDirForCpuArchitecture + file else file
|
||||
val target = if (targetFile.isNotEmpty()) {
|
||||
File(boincWorkingDir + targetFile)
|
||||
} else {
|
||||
File(boincWorkingDir + file)
|
||||
}
|
||||
try {
|
||||
// Copy file from the asset manager to clientPath
|
||||
applicationContext.assets.open(source).copyToFile(target)
|
||||
success = true //copy succeeded without exception
|
||||
|
||||
// Set executable, if requested
|
||||
if (executable) {
|
||||
success = target.setExecutable(true) // return false, if not executable
|
||||
}
|
||||
|
||||
Log.d(TAG, "Installation of " + source + " successful. Executable: " +
|
||||
executable + "/" + success)
|
||||
} catch (ioe: IOException) {
|
||||
Log.e(TAG, IOEXCEPTION_LOG + ioe.message)
|
||||
Log.e(TAG, "Install of $source failed.")
|
||||
}
|
||||
return success
|
||||
}
|
||||
|
||||
/**
|
||||
* Installs required files from APK's asset directory to the applications' internal storage.
|
||||
* File attributes override and executable are defined here
|
||||
*
|
||||
* @return Boolean success
|
||||
*/
|
||||
private fun installClient(): Boolean {
|
||||
if (!installFile(fileNameClient, true, "")) {
|
||||
Log.e(TAG, INSTALL_FAILED + fileNameClient)
|
||||
|
||||
return false
|
||||
}
|
||||
if (!installFile(fileNameClientCmd, true, "")) {
|
||||
Log.e(TAG, INSTALL_FAILED + fileNameClientCmd)
|
||||
|
||||
return false
|
||||
}
|
||||
if (!installFile(fileNameCABundle, false, "")) {
|
||||
Log.e(TAG, INSTALL_FAILED + fileNameCABundle)
|
||||
|
||||
return false
|
||||
}
|
||||
if (!installFile(fileNameClientConfig, false, "")) {
|
||||
Log.e(TAG, INSTALL_FAILED + fileNameClientConfig)
|
||||
|
||||
return false
|
||||
}
|
||||
if (!installFile(fileNameAllProjectsList, false, "")) {
|
||||
Log.e(TAG, INSTALL_FAILED + fileNameAllProjectsList)
|
||||
|
||||
return false
|
||||
}
|
||||
if (!installFile(fileNameNoMedia, false, ".$fileNameNoMedia")) {
|
||||
Log.e(TAG, INSTALL_FAILED + fileNameNoMedia)
|
||||
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines BOINC platform name corresponding to device's cpu architecture (ARM, x86).
|
||||
* Defaults to ARM
|
||||
*
|
||||
* @return ID of BOINC platform name string in resources
|
||||
*/
|
||||
private val boincPlatform: String
|
||||
get() {
|
||||
val platformId: String
|
||||
val arch = System.getProperty("os.arch") ?: ""
|
||||
val normalizedArch = arch.toUpperCase(Locale.US)
|
||||
platformId = when {
|
||||
normalizedArch.containsAny("ARM64", "AARCH64") -> "ARM64"
|
||||
"X86_64" in normalizedArch -> "X86_64"
|
||||
"ARMV6" in normalizedArch -> "ARMV6"
|
||||
"ARM" in normalizedArch -> "ARM"
|
||||
"86" in normalizedArch -> "X86"
|
||||
else -> {
|
||||
Log.w(TAG, "could not map os.arch ($arch) to platform, default to arm.")
|
||||
""
|
||||
}
|
||||
}
|
||||
|
||||
Log.i(TAG, "BOINC platform: $platformId for os.arch: $arch")
|
||||
|
||||
return platformId
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines assets directory (contains BOINC client binaries) corresponding to device's cpu architecture (ARM, x86)
|
||||
*
|
||||
* @return name of assets directory for given platform, not an absolute path.
|
||||
*/
|
||||
private val assetsDirForCpuArchitecture: String
|
||||
get() {
|
||||
var archAssetsDirectory = ""
|
||||
when (boincPlatform) {
|
||||
"ARMV6" -> archAssetsDirectory = "armeabi/"
|
||||
"ARM" -> archAssetsDirectory = "armeabi-v7a/"
|
||||
"ARM64" -> archAssetsDirectory = "arm64-v8a/"
|
||||
"X86" -> archAssetsDirectory = "x86/"
|
||||
"X86_64" -> archAssetsDirectory = "x86_64/"
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
return archAssetsDirectory
|
||||
}
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
boinc
|
||||
boinc.exe
|
||||
ca-bundle.crt
|
||||
all_projects_list.xml
|
||||
nomedia
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1 +0,0 @@
|
|||
This file is used as a placeholder until real data files are created or copied from another location.
|
|
@ -1,25 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="android" name="Android">
|
||||
<configuration>
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/android/app/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/android/app/src/main/kotlin" isTestSource="false" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Dart SDK" level="project" />
|
||||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
||||
<orderEntry type="library" name="Dart Packages" level="project" />
|
||||
</component>
|
||||
</module>
|
|
@ -1,43 +0,0 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'dart:ffi' as ffi;
|
||||
import 'package:ffi/ffi.dart';
|
||||
|
||||
|
||||
int systemLinux(String command) {
|
||||
var result = system(command);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
#include <stdlib.h>
|
||||
int system(const char *string);
|
||||
|
||||
https://man.openbsd.org/system.3
|
||||
*/
|
||||
|
||||
// C header typedef:
|
||||
typedef SystemC = ffi.Int32 Function(ffi.Pointer<Utf8> command);
|
||||
|
||||
// Dart header typedef
|
||||
typedef SystemDart = int Function(ffi.Pointer<Utf8> command);
|
||||
|
||||
int system(String command) {
|
||||
// Load `stdlib`. On MacOS this is in libSystem.dylib.
|
||||
final dylib = ffi.DynamicLibrary.open('libc.so.6');
|
||||
|
||||
// Look up the `system` function.
|
||||
final systemP = dylib.lookupFunction<SystemC, SystemDart>('system');
|
||||
|
||||
// Allocate a pointer to a Utf8 array containing our command.
|
||||
final cmdP = command.toNativeUtf8();
|
||||
|
||||
// Invoke the command, and free the pointer.
|
||||
int result = systemP(cmdP);
|
||||
|
||||
calloc.free(cmdP);
|
||||
|
||||
return result;
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'dart:ffi' as ffi;
|
||||
import 'package:ffi/ffi.dart';
|
||||
|
||||
|
||||
int systemMacOS(String command) {
|
||||
var result = system(command);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
#include <stdlib.h>
|
||||
int system(const char *string);
|
||||
|
||||
https://man.openbsd.org/system.3
|
||||
*/
|
||||
|
||||
// C header typedef:
|
||||
typedef SystemC = ffi.Int32 Function(ffi.Pointer<Utf8> command);
|
||||
|
||||
// Dart header typedef
|
||||
typedef SystemDart = int Function(ffi.Pointer<Utf8> command);
|
||||
|
||||
int system(String command) {
|
||||
// Load `stdlib`. On MacOS this is in libSystem.dylib.
|
||||
final dylib = ffi.DynamicLibrary.open('/usr/lib/libSystem.dylib');
|
||||
|
||||
// Look up the `system` function.
|
||||
final systemP = dylib.lookupFunction<SystemC, SystemDart>('system');
|
||||
|
||||
// Allocate a pointer to a Utf8 array containing our command.
|
||||
final cmdP = command.toNativeUtf8();
|
||||
|
||||
// Invoke the command, and free the pointer.
|
||||
int result = systemP(cmdP);
|
||||
calloc.free(cmdP);
|
||||
|
||||
return result;
|
||||
}
|
|
@ -1,523 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||
|
||||
import 'package:flutter_svg/avd.dart';
|
||||
import 'package:neat_periodic_task/neat_periodic_task.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:xml/xml.dart';
|
||||
import 'package:convert/convert.dart';
|
||||
import 'package:crypto/crypto.dart';
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:io' if (dart.library.io) 'package:boinc/windows.dart';
|
||||
import 'dart:io' if (dart.library.io) 'package:boinc/macos.dart';
|
||||
import 'dart:io' if (dart.library.io) 'package:boinc/linux.dart';
|
||||
import 'dart:io' if (dart.library.html) 'package:boinc/web.dart';
|
||||
|
||||
|
||||
void main() => runApp(MyApp());
|
||||
|
||||
|
||||
class MyApp extends StatefulWidget {
|
||||
@override
|
||||
MyAppState createState() => MyAppState();
|
||||
|
||||
static MyAppState? of(BuildContext context) =>
|
||||
context.findAncestorStateOfType<MyAppState>();
|
||||
}
|
||||
|
||||
enum Section
|
||||
{
|
||||
Run,
|
||||
Connect,
|
||||
State,
|
||||
Tasks,
|
||||
Notices,
|
||||
Projects,
|
||||
Preference,
|
||||
Help,
|
||||
Report,
|
||||
Event,
|
||||
}
|
||||
|
||||
|
||||
class MyAppState extends State<MyApp> {
|
||||
static const String channel = 'edu.berkeley.boinc/client';
|
||||
static const platform = const MethodChannel(channel);
|
||||
NeatPeriodicTaskScheduler? scheduler;
|
||||
MyAppState(){
|
||||
scheduler = NeatPeriodicTaskScheduler(
|
||||
interval: Duration(seconds: 1),
|
||||
name: 'update_state',
|
||||
timeout: Duration(seconds: 1),
|
||||
task: () async => updateState(),
|
||||
minCycle: Duration(milliseconds: 500),
|
||||
);
|
||||
}
|
||||
|
||||
/// 1) our themeMode "state" field
|
||||
final String appName = 'Boinc';
|
||||
ThemeMode _themeMode = ThemeMode.system;
|
||||
Section _section = Section.Preference;
|
||||
String title = "";
|
||||
int? authId;
|
||||
int authSeqno = 1;
|
||||
String authSalt = "";
|
||||
Future<String> password = () async {return "";}();
|
||||
bool isReadFile = false;
|
||||
bool isClientRunning = false;
|
||||
bool isSchedule = false;
|
||||
Iterable<XmlElement> _projects = [];
|
||||
Iterable<XmlElement> _results = [];
|
||||
Iterable<XmlElement> _workUnits = [];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
title = getSectionTitle(_section);
|
||||
return MaterialApp(
|
||||
title: appName,
|
||||
theme: ThemeData(),
|
||||
darkTheme: ThemeData.dark(),
|
||||
themeMode: _themeMode, // 2) ← ← ← use "state" field here //////////////
|
||||
home: MyHomePage(title: title),
|
||||
);
|
||||
}
|
||||
|
||||
String getSectionTitle(Section section) {
|
||||
return section.toString().substring(8);
|
||||
}
|
||||
|
||||
void changeSection(Section section) {
|
||||
setState(() {
|
||||
_section = section;
|
||||
});
|
||||
}
|
||||
|
||||
void changeState(Iterable<XmlElement> projects,
|
||||
Iterable<XmlElement> results,
|
||||
Iterable<XmlElement> workUnits) {
|
||||
setState(() {
|
||||
_projects = projects;
|
||||
_results = results;
|
||||
_workUnits = workUnits;
|
||||
});
|
||||
}
|
||||
|
||||
Section getSection() {
|
||||
return _section;
|
||||
}
|
||||
|
||||
/// 3) Call this to change theme from any context using "of" accessor
|
||||
/// e.g.:
|
||||
/// MyApp.of(context).changeTheme(ThemeMode.dark);
|
||||
void changeTheme(ThemeMode themeMode) {
|
||||
setState(() {
|
||||
_themeMode = themeMode;
|
||||
});
|
||||
}
|
||||
|
||||
void runAndroidClient() async {
|
||||
try {
|
||||
final bool result = await platform.invokeMethod('runClient');
|
||||
} on PlatformException catch (e) {
|
||||
print('${e.message}');
|
||||
}
|
||||
}
|
||||
|
||||
void runClient() {
|
||||
if (kIsWeb) {
|
||||
|
||||
} else {
|
||||
final execuPath = path.dirname(Platform.resolvedExecutable);
|
||||
final boincPath = path.join(execuPath,
|
||||
"data", "flutter_assets", "assets");
|
||||
if (Platform.isAndroid) {
|
||||
runAndroidClient();
|
||||
}
|
||||
if (Platform.isLinux) {
|
||||
systemLinux("chmod +x " + path.join(boincPath, "linux", "boinc"));
|
||||
systemLinux(path.join(boincPath, "linux", "boinc") + " &");
|
||||
}
|
||||
if (Platform.isWindows) {
|
||||
systemWindows(path.join(boincPath, "windows", "boinc.exe"));
|
||||
}
|
||||
if (Platform.isMacOS) {
|
||||
systemMacOS("chmod +x " + path.join(boincPath, "macos", "boinc"));
|
||||
systemMacOS(path.join(boincPath, "macos", "boinc") + " &");
|
||||
}
|
||||
}
|
||||
isClientRunning = true;
|
||||
}
|
||||
|
||||
void updateState() {
|
||||
guiRpc("get_state").then((String response) {
|
||||
print("we got get_state!!");
|
||||
var document = XmlDocument.parse(response);
|
||||
var projects = document.findAllElements("project");
|
||||
var workUnits = document.findAllElements("workunit");
|
||||
var results = document.findAllElements("result");
|
||||
print("projects: ${projects.length}");
|
||||
print("results: ${results.length}");
|
||||
print("workUnits: ${workUnits.length}");
|
||||
changeState(projects, results, workUnits);
|
||||
// print(document);
|
||||
});
|
||||
}
|
||||
|
||||
Future<String> guiRpc(String request) async {
|
||||
final builder = XmlBuilder();
|
||||
builder.element('boinc_gui_rpc_request', nest: () {
|
||||
builder.element(request);
|
||||
});
|
||||
String requestXml = builder.buildDocument().toXmlString();
|
||||
|
||||
var url = Uri.parse('http://localhost:31416');
|
||||
Map<String, String> headers = {};
|
||||
if (authId != null) {
|
||||
var authHash = hex.encode(md5.convert(latin1.encode("$authSeqno"+"${await password}"+authSalt+requestXml)).bytes);
|
||||
headers = {"Auth-ID": "$authId", "Auth-Seqno": "$authSeqno", "Auth-Hash": authHash};
|
||||
authSeqno++;
|
||||
}
|
||||
headers = {
|
||||
...headers,
|
||||
"Content-Length": "${latin1.encode(requestXml).lengthInBytes}",
|
||||
};
|
||||
print("url: $url");
|
||||
print("headers: $headers");
|
||||
print("requestXml: $requestXml");
|
||||
if (kIsWeb) {
|
||||
http.Response response = await http.post(url, headers: headers, body: requestXml, encoding: latin1);
|
||||
return response.body;
|
||||
} else {
|
||||
HttpClient client = HttpClient();
|
||||
return await client.postUrl(url)
|
||||
.then((HttpClientRequest request) {
|
||||
headers.forEach((key, value) {
|
||||
request.headers.add(key, value, preserveHeaderCase: true);
|
||||
});
|
||||
request.headers.set("Content-Length", "${latin1.encode(requestXml).lengthInBytes}", preserveHeaderCase: true);
|
||||
request.headers.contentType = ContentType.parse("text/xml");
|
||||
request.write(requestXml);
|
||||
return request.close();
|
||||
}).then((HttpClientResponse response) {
|
||||
return response.transform(latin1.decoder).join();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> readFile(String filePath) async {
|
||||
File cfg = File(filePath);
|
||||
String content = "";
|
||||
try {
|
||||
// Read the file
|
||||
content = await cfg.readAsString();
|
||||
} catch(e) {}
|
||||
return content.trim();
|
||||
}
|
||||
|
||||
Future<void> connectClient() {
|
||||
var filePath = "";
|
||||
if (kIsWeb) {
|
||||
|
||||
} else {
|
||||
if (Platform.isWindows) {
|
||||
// filePath = 'C:\\ProgramData\\BOINC\\gui_rpc_auth.cfg';
|
||||
}
|
||||
if (Platform.isLinux) {
|
||||
|
||||
}
|
||||
if (Platform.isMacOS) {
|
||||
|
||||
}
|
||||
if (Platform.isAndroid) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (filePath != "" && !isReadFile) {
|
||||
password = readFile(filePath);
|
||||
isReadFile = true;
|
||||
}
|
||||
|
||||
return guiRpc("get_auth_id").then((String response) {
|
||||
print("we got get_auth_id!!");
|
||||
var document = XmlDocument.parse(response);
|
||||
authId = int.parse(document.findAllElements("auth_id").first.text);
|
||||
authSalt = document.findAllElements("auth_salt").first.text;
|
||||
print("authId: $authId");
|
||||
print("authSalt: $authSalt");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class Preference extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var myAppContext = MyApp.of(context)!;
|
||||
return Scaffold(
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'Choose your theme:',
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
/// //////////////////////////////////////////////////////
|
||||
/// Change theme & rebuild to show it using these buttons
|
||||
ElevatedButton(
|
||||
onPressed: () => myAppContext.changeTheme(ThemeMode.light),
|
||||
child: Text('Light')
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () => myAppContext.changeTheme(ThemeMode.dark),
|
||||
child: Text('Dark'),
|
||||
),
|
||||
/// //////////////////////////////////////////////////////
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Projects extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var myAppContext = MyApp.of(context)!;
|
||||
Iterable<XmlElement> projects = myAppContext._projects;
|
||||
return Scaffold(
|
||||
body: ListView.builder
|
||||
(
|
||||
itemCount: projects.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
var projectName = projects.elementAt(index).findElements("project_name").first.text;
|
||||
return Text("Name: $projectName");
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Tasks extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var myAppContext = MyApp.of(context)!;
|
||||
Iterable<XmlElement> results = myAppContext._results;
|
||||
Iterable<XmlElement> workUnits = myAppContext._workUnits;
|
||||
print("results.length: ${results.length}");
|
||||
print("workUnits.length: ${workUnits.length}");
|
||||
print("results: $results");
|
||||
print("workUnits: $workUnits");
|
||||
return Scaffold(
|
||||
body: ListView.builder
|
||||
(
|
||||
itemCount: results.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
var result = results.elementAt(index);
|
||||
String wu_name = result.findElements("wu_name").first.text;
|
||||
String appName = workUnits.firstWhere((workUnit) => workUnit.findElements("name").first.text == wu_name)
|
||||
.findElements("app_name")
|
||||
.first.text;
|
||||
bool active = false;
|
||||
String remain = "-1";
|
||||
try {
|
||||
active = result.findAllElements("active_task_state").first.text == "1";
|
||||
remain = result.findElements("estimated_cpu_time_remaining").first.text;
|
||||
} catch(e) {}
|
||||
return Text("Name: $appName, Active: $active, Remain: $remain");
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class MyHomePage extends StatelessWidget {
|
||||
final String title;
|
||||
|
||||
MyHomePage({Key? key, required this.title}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var appBar = AppBar(title: Text(title), centerTitle: true);
|
||||
var textColor = Theme.of(context).textTheme.bodyText1!.color;
|
||||
var myAppContext = MyApp.of(context)!;
|
||||
Widget? body;
|
||||
var section = myAppContext.getSection();
|
||||
|
||||
/// You can easily control the section for example inside the initState where you check
|
||||
/// if the user logged in, or other related logic
|
||||
switch (section)
|
||||
{
|
||||
case Section.Run:
|
||||
break;
|
||||
case Section.Connect:
|
||||
break;
|
||||
case Section.State:
|
||||
break;
|
||||
case Section.Tasks:
|
||||
body = Tasks();
|
||||
break;
|
||||
case Section.Notices:
|
||||
break;
|
||||
case Section.Projects:
|
||||
body = Projects();
|
||||
break;
|
||||
case Section.Preference:
|
||||
body = Preference();
|
||||
break;
|
||||
case Section.Help:
|
||||
break;
|
||||
case Section.Report:
|
||||
break;
|
||||
case Section.Event:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: appBar,
|
||||
body: body,
|
||||
drawer: Drawer(
|
||||
// Add a ListView to the drawer. This ensures the user can scroll
|
||||
// through the options in the drawer if there isn't enough vertical
|
||||
// space to fit everything.
|
||||
child: ListView(
|
||||
// Important: Remove any padding from the ListView.
|
||||
padding: EdgeInsets.zero,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
height: appBar.preferredSize.height,
|
||||
child: DrawerHeader(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).primaryColor,
|
||||
shape: BoxShape.rectangle,
|
||||
),
|
||||
child: Text(myAppContext.appName),
|
||||
)),
|
||||
ListTile(
|
||||
leading: SizedBox.fromSize(
|
||||
size: Size.fromRadius(12),
|
||||
child: FittedBox(
|
||||
child: AvdPicture.asset("res/drawable/ic_boinc.xml"),
|
||||
),
|
||||
),
|
||||
title: Text('Run Client'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Run);
|
||||
myAppContext.runClient();
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset("res/drawable/ic_baseline_wifi.xml", color: textColor),
|
||||
title: Text('Connect Client'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Connect);
|
||||
|
||||
myAppContext.connectClient().then((_) {
|
||||
if (myAppContext.authId != null && !myAppContext.isSchedule) {
|
||||
myAppContext.isSchedule = true;
|
||||
myAppContext.scheduler!.start();
|
||||
}
|
||||
});
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset("res/drawable/ic_baseline_list.xml", color: textColor),
|
||||
title: Text('Tasks'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Tasks);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset('res/drawable/ic_baseline_email.xml', color: textColor),
|
||||
title: Text('Notices'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Notices);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: SizedBox.fromSize(
|
||||
size: Size.fromRadius(12),
|
||||
child: FittedBox(
|
||||
child: AvdPicture.asset("res/drawable/ic_projects.xml", color: textColor),
|
||||
),
|
||||
),
|
||||
title: Text('Projects'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Projects);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset('res/drawable/ic_baseline_add_box.xml', color: textColor),
|
||||
title: Text('Add Project'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Projects);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset('res/drawable/ic_baseline_settings.xml', color: textColor),
|
||||
title: Text('Preference'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Preference);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset('res/drawable/ic_baseline_help.xml', color: textColor),
|
||||
title: Text('Help'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Help);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset('res/drawable/ic_baseline_bug_report.xml', color: textColor),
|
||||
title: Text('Report Issue'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Report);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: AvdPicture.asset('res/drawable/ic_baseline_warning.xml', color: textColor),
|
||||
title: Text('Event log'),
|
||||
onTap: () {
|
||||
myAppContext.changeSection(Section.Event);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
systemWindows(String command) {
|
||||
|
||||
}
|
||||
|
||||
int systemMacOS(String command) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int systemLinux(String command) {
|
||||
return 0;
|
||||
}
|
|
@ -1,71 +0,0 @@
|
|||
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'dart:ffi';
|
||||
|
||||
import 'package:ffi/ffi.dart';
|
||||
|
||||
main() {
|
||||
messageBox('こんにちは窓', 'Hello Windows');
|
||||
}
|
||||
|
||||
/* MessageBoxW is the UTF16 (wchar_t) version of MessageBox.
|
||||
int MessageBoxW(
|
||||
HWND hWnd,
|
||||
LPCWSTR lpText,
|
||||
LPCWSTR lpCaption,
|
||||
UINT uType
|
||||
);
|
||||
*/
|
||||
typedef MessageBoxC = Int32 Function(
|
||||
Pointer hwnd,
|
||||
Pointer<Utf16> lpText,
|
||||
Pointer<Utf16> lpCaption,
|
||||
Uint32 uType,
|
||||
);
|
||||
typedef MessageBoxDart = int Function(
|
||||
Pointer parentWindow,
|
||||
Pointer<Utf16> message,
|
||||
Pointer<Utf16> caption,
|
||||
int type,
|
||||
);
|
||||
|
||||
const MB_ABORTRETRYIGNORE = 0x00000002;
|
||||
const MB_CANCELTRYCONTINUE = 0x00000006;
|
||||
const MB_HELP = 0x00004000;
|
||||
const MB_OK = 0x00000000;
|
||||
const MB_OKCANCEL = 0x00000001;
|
||||
const MB_RETRYCANCEL = 0x00000005;
|
||||
const MB_YESNO = 0x00000004;
|
||||
const MB_YESNOCANCEL = 0x00000003;
|
||||
|
||||
const MB_ICONEXCLAMATION = 0x00000030;
|
||||
const MB_ICONWARNING = 0x00000030;
|
||||
const MB_ICONINFORMATION = 0x00000040;
|
||||
const MB_ICONASTERISK = 0x00000040;
|
||||
const MB_ICONQUESTION = 0x00000020;
|
||||
const MB_ICONSTOP = 0x00000010;
|
||||
const MB_ICONERROR = 0x00000010;
|
||||
const MB_ICONHAND = 0x00000010;
|
||||
|
||||
int messageBox(String message, String caption) {
|
||||
// Load user32.
|
||||
final user32 = DynamicLibrary.open('user32.dll');
|
||||
|
||||
// Look up the `MessageBoxW` function.
|
||||
final messageBoxP =
|
||||
user32.lookupFunction<MessageBoxC, MessageBoxDart>('MessageBoxW');
|
||||
|
||||
// Allocate pointers to Utf16 arrays containing the command arguments.
|
||||
final messageP = message.toNativeUtf16();
|
||||
final captionP = caption.toNativeUtf16();
|
||||
|
||||
// Invoke the command, and free the pointers.
|
||||
final result =
|
||||
messageBoxP(nullptr, messageP, captionP, MB_OK | MB_ICONINFORMATION);
|
||||
calloc.free(messageP);
|
||||
calloc.free(captionP);
|
||||
|
||||
return result;
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'dart:ffi' as ffi;
|
||||
import 'package:ffi/ffi.dart';
|
||||
|
||||
|
||||
systemWindows(String command) {
|
||||
shellExecute("open", "cmd", "/c " + command);
|
||||
}
|
||||
|
||||
/*
|
||||
HINSTANCE ShellExecuteW(
|
||||
HWND hwnd,
|
||||
LPCWSTR lpOperation,
|
||||
LPCWSTR lpFile,
|
||||
LPCWSTR lpParameters,
|
||||
LPCWSTR lpDirectory,
|
||||
INT nShowCmd
|
||||
);
|
||||
|
||||
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew
|
||||
*/
|
||||
typedef ShellExecuteC = ffi.Int32 Function(
|
||||
ffi.Pointer hwnd,
|
||||
ffi.Pointer lpOperation,
|
||||
ffi.Pointer lpFile,
|
||||
ffi.Pointer lpParameters,
|
||||
ffi.Pointer lpDirectory,
|
||||
ffi.Uint32 nShowCmd);
|
||||
typedef ShellExecuteDart = int Function(
|
||||
ffi.Pointer parentWindow,
|
||||
ffi.Pointer operation,
|
||||
ffi.Pointer file,
|
||||
ffi.Pointer parameters,
|
||||
ffi.Pointer directory,
|
||||
int showCmd);
|
||||
|
||||
int shellExecute(String operation, String file, String params) {
|
||||
// Load shell32.
|
||||
final dylib = ffi.DynamicLibrary.open('shell32.dll');
|
||||
|
||||
// Look up the `ShellExecuteW` function.
|
||||
final shellExecuteP =
|
||||
dylib.lookupFunction<ShellExecuteC, ShellExecuteDart>('ShellExecuteW');
|
||||
|
||||
// Allocate pointers to Utf8 arrays containing the command arguments.
|
||||
final operationP = operation.toNativeUtf16();
|
||||
final fileP = file.toNativeUtf16();
|
||||
final paramsP = params.toNativeUtf16();
|
||||
const int SW_SHOWNORMAL = 1;
|
||||
|
||||
// Invoke the command, and free the pointers.
|
||||
var result = shellExecuteP(
|
||||
ffi.nullptr, operationP, fileP, paramsP, ffi.nullptr, SW_SHOWNORMAL);
|
||||
calloc.free(operationP);
|
||||
calloc.free(fileP);
|
||||
|
||||
return result;
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
- assets/linux/boinc
|
||||
- assets/linux/ca-bundle.crt
|
|
@ -1,2 +0,0 @@
|
|||
- assets/macos/boinc
|
||||
- assets/macos/ca-bundle.crt
|
|
@ -1,198 +0,0 @@
|
|||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.8.2"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
convert:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: convert
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
crypto:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: crypto
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
ffi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: ffi
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.23.0+1"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: http
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.13.4"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
json_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: json_annotation
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.3.0"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.7.0"
|
||||
neat_periodic_task:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: neat_periodic_task
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
path:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
path_drawing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_drawing
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.5.1+1"
|
||||
path_parsing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_parsing
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.4.0"
|
||||
retry:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: retry
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
slugid:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: slugid
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.1"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
xml:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: xml
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.3.1"
|
||||
sdks:
|
||||
dart: ">=2.14.0 <3.0.0"
|
||||
flutter: ">=1.24.0-7.0"
|
|
@ -1,89 +0,0 @@
|
|||
name: boinc
|
||||
description: boinc
|
||||
|
||||
# The following line prevents the package from being accidentally published to
|
||||
# pub.dev using `pub publish`. This is preferred for private packages.
|
||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
|
||||
# The following defines the version and build number for your application.
|
||||
# A version number is three numbers separated by dots, like 1.2.43
|
||||
# followed by an optional build number separated by a +.
|
||||
# Both the version and the builder number may be overridden in flutter
|
||||
# build by specifying --build-name and --build-number, respectively.
|
||||
# In Android, build-name is used as versionName while build-number used as versionCode.
|
||||
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
|
||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
||||
# Read more about iOS versioning at
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
version: 1.0.0+1
|
||||
|
||||
environment:
|
||||
sdk: ">=2.12.0 <3.0.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
flutter_svg: ^0.23.0
|
||||
path: ^1.8.0
|
||||
ffi: ^1.1.2
|
||||
xml: ^5.1.2
|
||||
http: ^0.13.4
|
||||
convert: ^3.0.0
|
||||
crypto: ^3.0.1
|
||||
neat_periodic_task: ^2.0.0
|
||||
|
||||
dev_dependencies:
|
||||
# flutter_launcher_icons: ^0.9.0
|
||||
# rename: ^1.3.1
|
||||
# flutter_test:
|
||||
# sdk: flutter
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
#flutter_icons:
|
||||
# android: "launcher_icon"
|
||||
# ios: true
|
||||
# image_path: "res/mipmap-xxxhdpi/ic_launcher.png"
|
||||
# The following section is specific to Flutter.
|
||||
flutter:
|
||||
|
||||
# The following line ensures that the Material Icons font is
|
||||
# included with your application, so that you can use the icons in
|
||||
# the material Icons class.
|
||||
uses-material-design: true
|
||||
|
||||
# To add assets to your application, add an assets section, like this:
|
||||
# assets:
|
||||
# - images/a_dot_burr.jpeg
|
||||
# - images/a_dot_ham.jpeg
|
||||
assets:
|
||||
- res/drawable/
|
||||
|
||||
# An image asset can refer to one or more resolution-specific "variants", see
|
||||
# https://flutter.dev/assets-and-images/#resolution-aware.
|
||||
|
||||
# For details regarding adding assets from package dependencies, see
|
||||
# https://flutter.dev/assets-and-images/#from-packages
|
||||
|
||||
# To add custom fonts to your application, add a fonts section here,
|
||||
# in this "flutter" section. Each entry in this list should have a
|
||||
# "family" key with the font family name, and a "fonts" key with a
|
||||
# list giving the asset and other descriptors for the font. For
|
||||
# example:
|
||||
# fonts:
|
||||
# - family: Schyler
|
||||
# fonts:
|
||||
# - asset: fonts/Schyler-Regular.ttf
|
||||
# - asset: fonts/Schyler-Italic.ttf
|
||||
# style: italic
|
||||
# - family: Trajan Pro
|
||||
# fonts:
|
||||
# - asset: fonts/TrajanPro.ttf
|
||||
# - asset: fonts/TrajanPro_Bold.ttf
|
||||
# weight: 700
|
||||
#
|
||||
# For details regarding fonts from package dependencies,
|
||||
# see https://flutter.dev/custom-fonts/#from-packages
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector android:height="48dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z"/>
|
||||
</vector>
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector android:height="48dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z"/>
|
||||
</vector>
|
|
@ -1,28 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp"
|
||||
android:height="48dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
|
||||
</vector>
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector android:height="48dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"/>
|
||||
</vector>
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector android:height="48dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M3,13h2v-2L3,11v2zM3,17h2v-2L3,15v2zM3,9h2L5,7L3,7v2zM7,13h14v-2L7,11v2zM7,17h14v-2L7,15v2zM7,7v2h14L21,7L7,7z"/>
|
||||
</vector>
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector android:height="48dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
|
||||
</vector>
|
|
@ -1,28 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp"
|
||||
android:height="48dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
|
||||
</vector>
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector android:height="48dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M1,9l2,2c4.97,-4.97 13.03,-4.97 18,0l2,-2C16.93,2.93 7.08,2.93 1,9zM9,17l3,3 3,-3c-1.65,-1.66 -4.34,-1.66 -6,0zM5,13l2,2c2.76,-2.76 7.24,-2.76 10,0l2,-2C15.14,9.14 8.87,9.14 5,13z"/>
|
||||
</vector>
|
|
@ -1,30 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="48dp"
|
||||
android:width="48dp"
|
||||
android:viewportHeight="718"
|
||||
android:viewportWidth="718" >
|
||||
<path android:fillColor="#245c86"
|
||||
android:fillType="evenOdd"
|
||||
android:pathData="M567.1,103.1c-51.2,49.6 -93.1,90.5 -93.1,90.8 0,0.4 4.5,4.2 10,8.4 46.9,36.1 73.6,83.1 79.1,139.1 1.1,11.1 0.9,19 -0.7,47.2 -1.3,22.3 1.9,27.1 39.1,58.4 9.4,7.9 18,15.2 19.1,16.2l2.2,1.9 3.5,-9.3c2,-5.1 4.6,-12.7 5.7,-16.8 1.2,-4.1 2.8,-8.9 3.5,-10.5 1.4,-3.3 4.7,-19.4 6.6,-32 2.9,-20.1 2.6,-57.3 -0.6,-77.5 -6.6,-41.2 -21.2,-78.3 -43.9,-111.5l-5.4,-8 63.1,-63.2 63,-63.1 -7.4,-8.9c-8.7,-10.3 -34.5,-36.9 -44,-45.4l-6.7,-5.9 -93.1,90.1zM45.4,30.2C31.2,44 11,66 6,73.1l-2,2.7 28.8,26.9c165.5,155 157.5,147.8 159.2,145.2 11.4,-17.6 31.7,-37.2 53.9,-52.2 7.8,-5.2 28.1,-15.3 41.8,-20.8 11.4,-4.5 31.9,-9.5 47.3,-11.5 10.5,-1.3 17.8,-1.5 33,-1.1 10.7,0.3 21.1,1.1 23,1.7 1.9,0.6 7.8,1.1 13.1,1.2 14.2,0.2 15,-0.4 45.1,-31.3 13.7,-14.2 24.9,-26.1 24.8,-26.6 -0.2,-1.1 -17.6,-7.8 -29.6,-11.3 -65.3,-19.1 -133.8,-15.7 -195.4,9.7 -17.9,7.4 -32.2,14.7 -45.1,23.2l-10.7,6.9 -63.3,-58C95,45.9 65.3,18.7 63.8,17.3l-2.6,-2.5 -15.8,15.4zM95.2,253.8c-0.5,0.9 -1.5,3.5 -2.2,5.7 -0.7,2.2 -2.1,5.3 -3,7 -4.5,7.3 -12.4,39.4 -15.1,61 -1.6,12.9 -1.6,47.1 0,60 5.7,45 20.2,84.5 44.6,121l6.4,9.5 -61.5,60.7L3,639.5l8.7,10.5c9.2,11 39.2,42.1 45.5,47.1l3.7,3 87.8,-84.2c48.3,-46.3 89.8,-86.1 92.3,-88.6l4.5,-4.5 -2.5,-1.6c-16.3,-11 -39.3,-32.7 -49.9,-47.1 -18.9,-25.6 -30.8,-53.7 -36.1,-84.6 -1.9,-11 -2.2,-15.9 -1.9,-32 0.1,-10.5 0.3,-25.1 0.3,-32.5 0.1,-20.6 0.3,-20.3 -38.1,-54.3 -18,-15.9 -21.4,-18.4 -22.1,-16.9zM526,473.3c-5,7.6 -30.9,33 -42.5,41.8 -9.1,7 -32.9,20.7 -34.8,20.1 -0.4,-0.1 -2.9,0.9 -5.5,2.2 -11.9,5.9 -30.8,11.6 -48.7,14.7 -15.6,2.6 -44.6,3.6 -57.5,1.9 -5.2,-0.7 -14.1,-1.5 -19.7,-1.7 -8.9,-0.4 -10.9,-0.2 -14.5,1.6 -2.8,1.3 -13.7,11.4 -31.2,29l-27,27 5,2.1c9.4,4.1 27.5,9.9 39.7,12.9 25,6 43.4,8.2 69.8,8.2 35.3,0 61.5,-4.1 93.4,-14.7 22.2,-7.3 47.4,-19.2 64.8,-30.8l9.8,-6.4 66.1,60.9c36.3,33.5 66.4,60.9 66.9,60.9 1.6,0 34.6,-32.9 46.1,-46l11.9,-13.5 -5.4,-5c-3,-2.8 -45.1,-42.1 -93.6,-87.5 -48.5,-45.4 -88.5,-82.6 -88.9,-82.7 -0.4,-0.1 -2.3,2.1 -4.2,5z"/>
|
||||
<path android:fillColor="#fac134"
|
||||
android:fillType="evenOdd"
|
||||
android:pathData="M359.25,359.25m-135,0a135,135 0,1 1,270 0a135,135 0,1 1,-270 0"/>
|
||||
</vector>
|
|
@ -1,79 +0,0 @@
|
|||
<!--
|
||||
This file is part of BOINC.
|
||||
http://boinc.berkeley.edu
|
||||
Copyright (C) 2020 University of California
|
||||
|
||||
BOINC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation,
|
||||
either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
BOINC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with BOINC. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp"
|
||||
android:height="48dp"
|
||||
android:tint="?attr/colorControlNormal"
|
||||
android:viewportWidth="12.7"
|
||||
android:viewportHeight="12.7">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M4.8616,6.7549a1.3808,1.4113 0,1 0,2.7616 0a1.3808,1.4113 0,1 0,-2.7616 0z"
|
||||
android:strokeWidth="0.03566416"/>
|
||||
<path
|
||||
android:pathData="M10.4048,11.6562m0.8034,-0a0.8034,0.8034 0,1 1,-1.6069 -0a0.8034,0.8034 0,1 1,1.6069 -0"
|
||||
android:strokeWidth="0.20896828"
|
||||
android:strokeColor="#FF000000"/>
|
||||
<path
|
||||
android:pathData="M9.9267,11.119 L6.6337,7.249"
|
||||
android:strokeLineJoin="miter"
|
||||
android:strokeWidth="0.21069998"
|
||||
android:strokeColor="#FF000000"
|
||||
android:strokeLineCap="butt"/>
|
||||
<path
|
||||
android:pathData="M2.2133,11.518m-0.8034,-0a0.8034,0.8034 0,1 0,1.6069 -0a0.8034,0.8034 0,1 0,-1.6069 -0"
|
||||
android:strokeWidth="0.20896828"
|
||||
android:strokeColor="#FF000000"/>
|
||||
<path
|
||||
android:pathData="m2.6913,10.981 l3.2931,-3.8701"
|
||||
android:strokeLineJoin="miter"
|
||||
android:strokeWidth="0.21069998"
|
||||
android:strokeColor="#FF000000"
|
||||
android:strokeLineCap="butt"/>
|
||||
<path
|
||||
android:pathData="M0.9703,4.7231m-0.8034,-0a0.8034,0.8034 0,1 0,1.6069 -0a0.8034,0.8034 0,1 0,-1.6069 -0"
|
||||
android:strokeWidth="0.20896828"
|
||||
android:strokeColor="#FF000000"/>
|
||||
<path
|
||||
android:pathData="M5.3672,6.39 L1.7764,5.0641"
|
||||
android:strokeLineJoin="miter"
|
||||
android:strokeWidth="0.21341223"
|
||||
android:strokeColor="#FF000000"
|
||||
android:strokeLineCap="butt"/>
|
||||
<path
|
||||
android:pathData="M11.7054,4.8612m0.8034,-0a0.8034,0.8034 0,1 1,-1.6069 -0a0.8034,0.8034 0,1 1,1.6069 -0"
|
||||
android:strokeWidth="0.20896828"
|
||||
android:strokeColor="#FF000000"/>
|
||||
<path
|
||||
android:pathData="m7.3085,6.5281 l3.5908,-1.3258"
|
||||
android:strokeLineJoin="miter"
|
||||
android:strokeWidth="0.21341223"
|
||||
android:strokeColor="#FF000000"
|
||||
android:strokeLineCap="butt"/>
|
||||
<path
|
||||
android:pathData="M6.264,1.1047m0.8034,-0a0.8034,0.8034 0,1 1,-1.6069 -0a0.8034,0.8034 0,1 1,1.6069 -0"
|
||||
android:strokeWidth="0.20896828"
|
||||
android:strokeColor="#FF000000"/>
|
||||
<path
|
||||
android:pathData="M6.2787,5.7271 L6.251,1.9153"
|
||||
android:strokeLineJoin="miter"
|
||||
android:strokeWidth="0.20669463"
|
||||
android:strokeColor="#FF000000"
|
||||
android:strokeLineCap="butt"/>
|
||||
</vector>
|
|
@ -1,30 +0,0 @@
|
|||
// This is a basic Flutter widget test.
|
||||
//
|
||||
// To perform an interaction with a widget in your test, use the WidgetTester
|
||||
// utility that Flutter provides. For example, you can send tap and scroll
|
||||
// gestures. You can also use WidgetTester to find child widgets in the widget
|
||||
// tree, read text, and verify that the values of widget properties are correct.
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:boinc/main.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||
// Build our app and trigger a frame.
|
||||
await tester.pumpWidget(MyApp());
|
||||
|
||||
// Verify that our counter starts at 0.
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
expect(find.text('1'), findsNothing);
|
||||
|
||||
// Tap the '+' icon and trigger a frame.
|
||||
await tester.tap(find.byIcon(Icons.add));
|
||||
await tester.pump();
|
||||
|
||||
// Verify that our counter has incremented.
|
||||
expect(find.text('0'), findsNothing);
|
||||
expect(find.text('1'), findsOneWidget);
|
||||
});
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
- assets/windows/boinc.exe
|
|
@ -1,25 +0,0 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Script to compile everything BOINC needs for Android flutter
|
||||
|
||||
# check working directory because the script needs to be called like: ./samples/flutter/ci_build_manager.sh
|
||||
if [ ! -d "samples/flutter" ]; then
|
||||
echo "start this script in the source root directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo '===== BOINC Flutuer Android build start ====='
|
||||
android/ci_build_vcpkg_client.sh
|
||||
cp "android/BOINC/app/src/main/assets/arm64-v8a/boinc" "samples/flutter/boinc/assets/arm64-v8a/boinc"
|
||||
cp "android/BOINC/app/src/main/assets/armeabi/boinc" "samples/flutter/boinc/assets/armeabi/boinc"
|
||||
cp "android/BOINC/app/src/main/assets/armeabi-v7a/boinc" "samples/flutter/boinc/assets/armeabi-v7a/boinc"
|
||||
cp "android/BOINC/app/src/main/assets/x86/boinc" "samples/flutter/boinc/assets/x86/boinc"
|
||||
cp "android/BOINC/app/src/main/assets/x86_64/boinc" "samples/flutter/boinc/assets/x86_64/boinc"
|
||||
cp "win_build/installerv2/redist/all_projects_list.xml" "samples/flutter/boinc/assets/all_projects_list.xml"
|
||||
cp "curl/ca-bundle.crt" "samples/flutter/boinc/assets/ca-bundle.crt"
|
||||
cp "android/BOINC/app/src/main/assets/cc_config.xml" "samples/flutter/boinc/assets/cc_config.xml"
|
||||
cp "android/BOINC/app/src/main/assets/nomedia" "samples/flutter/boinc/assets/nomedia"
|
||||
cat "samples/flutter/boinc/android.yaml" >> "samples/flutter/boinc/pubspec.yaml"
|
||||
android/clear_environment.sh full
|
||||
echo '===== BOINC Flutuer Android build done ====='
|
|
@ -1,20 +0,0 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Script to compile everything BOINC needs for Linux flutter
|
||||
|
||||
# check working directory because the script needs to be called like: ./samples/flutter/ci_build_manager.sh
|
||||
if [ ! -d "samples/flutter" ]; then
|
||||
echo "start this script in the source root directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo '===== BOINC Flutuer Linux build start ====='
|
||||
./_autosetup
|
||||
linux/ci_configure_client.sh
|
||||
make
|
||||
cp "client/boinc" "samples/flutter/boinc/assets/linux/boinc"
|
||||
cp "client/boinccmd" "samples/flutter/boinc/assets/linux/boinccmd"
|
||||
cp "curl/ca-bundle.crt" "samples/flutter/boinc/assets/linux/ca-bundle.crt"
|
||||
cat "samples/flutter/boinc/linux.yaml" >> "samples/flutter/boinc/pubspec.yaml"
|
||||
echo '===== BOINC Flutuer Linux build done ====='
|
|
@ -1,19 +0,0 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Script to compile everything BOINC needs for macOS flutter
|
||||
|
||||
# check working directory because the script needs to be called like: ./samples/flutter/ci_build_manager.sh
|
||||
if [ ! -d "samples/flutter" ]; then
|
||||
echo "start this script in the source root directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo '===== BOINC Flutuer macOS build start ====='
|
||||
3rdParty/buildMacDependencies.sh -q
|
||||
mac_build/buildMacBOINC-CI.sh --no_shared_headers
|
||||
|
||||
cp "mac_build/build/Deployment/boinc" "samples/flutter/boinc/assets/macos/boinc"
|
||||
cp "curl/ca-bundle.crt" "samples/flutter/boinc/assets/macos/ca-bundle.crt"
|
||||
cat "samples/flutter/boinc/macos.yaml" >> "samples/flutter/boinc/pubspec.yaml"
|
||||
echo '===== BOINC Flutuer macOS build done ====='
|
|
@ -1,18 +0,0 @@
|
|||
|
||||
|
||||
REM # Script to compile everything BOINC needs for Windows flutter
|
||||
|
||||
REM # check working directory because the script needs to be called like: ./samples/flutter/ci_build_manager.sh
|
||||
if not exist "samples\flutter\" (
|
||||
echo "start this script in the source root directory"
|
||||
exit 1
|
||||
)
|
||||
|
||||
|
||||
echo '===== BOINC Flutuer Windows build start ====='
|
||||
vcpkg.exe integrate remove
|
||||
msbuild win_build\boinc_vs2019.sln -p:Configuration=Release -p:Platform=x64 -p:VcpkgTripletConfig=ci -m
|
||||
|
||||
copy "win_build\Build\x64\Release\boinc.exe" "samples\flutter\boinc\assets\windows\boinc.exe"
|
||||
type "samples\flutter\boinc\windows.yaml" >> "samples\flutter\boinc\pubspec.yaml"
|
||||
echo '===== BOINC Flutuer Windows build done ====='
|
Loading…
Reference in New Issue