Showing preview only (1,393K chars total). Download the full file or copy to clipboard to get everything.
Repository: ComicSparks/pikapika
Branch: master
Commit: def75a101a65
Files: 319
Total size: 1.3 MB
Directory structure:
gitextract_rinrtcf6/
├── .fvmrc
├── .github/
│ └── workflows/
│ ├── Package.core.yml
│ ├── Package.yml
│ ├── Release.core.yml
│ └── Release.yml
├── .gitignore
├── .metadata
├── README-zh_CN.md
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── opensource/
│ │ │ │ └── pic2acg/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── ci/
│ ├── cmd/
│ │ ├── check_asset/
│ │ │ └── main.go
│ │ ├── check_asset_core/
│ │ │ └── main.go
│ │ ├── check_release/
│ │ │ └── main.go
│ │ ├── send_to_community/
│ │ │ └── main.go
│ │ ├── upload_asset/
│ │ │ └── main.go
│ │ └── upload_asset_core/
│ │ └── main.go
│ ├── commons/
│ │ ├── funcs.go
│ │ └── types.go
│ ├── go.mod
│ ├── go.sum
│ ├── linux_font.yaml
│ ├── version.code.txt
│ └── version.info.txt
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── IDEWorkspaceChecks.plist
│ └── WorkspaceSettings.xcsettings
├── lib/
│ ├── assets/
│ │ └── translations/
│ │ ├── en-US.json
│ │ ├── ja-JP.json
│ │ ├── ko-KR.json
│ │ ├── zh-CN.json
│ │ └── zh-TW.json
│ ├── basic/
│ │ ├── Channels.dart
│ │ ├── Common.dart
│ │ ├── Cross.dart
│ │ ├── Entities.dart
│ │ ├── Method.dart
│ │ ├── Navigator.dart
│ │ ├── config/
│ │ │ ├── Address.dart
│ │ │ ├── AndroidDisplayMode.dart
│ │ │ ├── AndroidSecureFlag.dart
│ │ │ ├── AppOrientation.dart
│ │ │ ├── Authentication.dart
│ │ │ ├── AutoClean.dart
│ │ │ ├── AutoDeleteDownloadOnUnfavorite.dart
│ │ │ ├── AutoDownloadOnFavorite.dart
│ │ │ ├── AutoFullScreen.dart
│ │ │ ├── AutoFullScreenOnForward.dart
│ │ │ ├── CategoriesColumnCount.dart
│ │ │ ├── CategoriesSort.dart
│ │ │ ├── ChooserRoot.dart
│ │ │ ├── ContentFailedReloadAction.dart
│ │ │ ├── CopyFullName.dart
│ │ │ ├── CopyFullNameTemplate.dart
│ │ │ ├── CopySkipConfirm.dart
│ │ │ ├── DisableAutoDownloadOnMobile.dart
│ │ │ ├── DownloadAndExportPath.dart
│ │ │ ├── DownloadCachePath.dart
│ │ │ ├── DownloadThreadCount.dart
│ │ │ ├── DragRegionLock.dart
│ │ │ ├── EBookScrolling.dart
│ │ │ ├── EBookScrollingRange.dart
│ │ │ ├── EBookScrollingTrigger.dart
│ │ │ ├── ExportPath.dart
│ │ │ ├── ExportRename.dart
│ │ │ ├── FullScreenAction.dart
│ │ │ ├── FullScreenUI.dart
│ │ │ ├── GalleryPreloadCount.dart
│ │ │ ├── GestureSpeed.dart
│ │ │ ├── HiddenFdIcon.dart
│ │ │ ├── HiddenSearchPersion.dart
│ │ │ ├── HiddenSubIcon.dart
│ │ │ ├── HiddenViewed.dart
│ │ │ ├── HiddenWords.dart
│ │ │ ├── HideOnlineFavorite.dart
│ │ │ ├── IconLoading.dart
│ │ │ ├── IgnoreInfoHistory.dart
│ │ │ ├── IgnoreUpgradeConfirm.dart
│ │ │ ├── ImageAddress.dart
│ │ │ ├── ImageFilter.dart
│ │ │ ├── ImportNotice.dart
│ │ │ ├── IsPro.dart
│ │ │ ├── KeyboardController.dart
│ │ │ ├── ListLayout.dart
│ │ │ ├── LocalHistorySync.dart
│ │ │ ├── NoAnimation.dart
│ │ │ ├── PagerAction.dart
│ │ │ ├── Platform.dart
│ │ │ ├── Proxy.dart
│ │ │ ├── Quality.dart
│ │ │ ├── ReaderBackgroundColor.dart
│ │ │ ├── ReaderDirection.dart
│ │ │ ├── ReaderScrollByScreenPercentage.dart
│ │ │ ├── ReaderSliderPosition.dart
│ │ │ ├── ReaderTwoPageDirection.dart
│ │ │ ├── ReaderType.dart
│ │ │ ├── ReaderZoomScale.dart
│ │ │ ├── RecommendLinks.dart
│ │ │ ├── ShadowCategories.dart
│ │ │ ├── ShadowCategoriesEvent.dart
│ │ │ ├── ShadowCategoriesMode.dart
│ │ │ ├── ShowCommentAtDownload.dart
│ │ │ ├── StartupPic.dart
│ │ │ ├── Themes.dart
│ │ │ ├── ThreeKeepRight.dart
│ │ │ ├── TimeOffsetHour.dart
│ │ │ ├── TimeoutLock.dart
│ │ │ ├── UseApiLoadImage.dart
│ │ │ ├── UsingRightClickPop.dart
│ │ │ ├── Version.dart
│ │ │ ├── VolumeController.dart
│ │ │ ├── VolumeNextChapter.dart
│ │ │ ├── WebDav.dart
│ │ │ ├── WebToonScrollMode.dart
│ │ │ ├── WillPopNotice.dart
│ │ │ ├── i18n.dart
│ │ │ └── passed.dart
│ │ ├── connect.dart
│ │ ├── define.dart
│ │ ├── enum/
│ │ │ ├── ErrorTypes.dart
│ │ │ └── Sort.dart
│ │ └── store/
│ │ └── Categories.dart
│ ├── i18.dart
│ ├── i18b.dart
│ ├── main.dart
│ ├── main_desktop.dart
│ └── screens/
│ ├── AboutScreen.dart
│ ├── AccessKeyReplaceScreen.dart
│ ├── AccountScreen.dart
│ ├── AppScreen.dart
│ ├── CategoriesScreen.dart
│ ├── CategoriesSortScreen.dart
│ ├── CleanScreen.dart
│ ├── CloseAppScreen.dart
│ ├── ComicCollectionsScreen.dart
│ ├── ComicInfoScreen.dart
│ ├── ComicReaderScreen.dart
│ ├── ComicSubscribesScreen.dart
│ ├── ComicsScreen.dart
│ ├── CommentScreen.dart
│ ├── DesktopAuthenticationScreen.dart
│ ├── DownloadConfirmScreen.dart
│ ├── DownloadExportGroupScreen.dart
│ ├── DownloadExportToFileScreen.dart
│ ├── DownloadExportToSocketScreen.dart
│ ├── DownloadExportingGroupScreen.dart
│ ├── DownloadImportScreen.dart
│ ├── DownloadInfoScreen.dart
│ ├── DownloadListScreen.dart
│ ├── DownloadOnlyImportScreen.dart
│ ├── DownloadReaderScreen.dart
│ ├── FavouritePaperScreen.dart
│ ├── FilePhotoViewScreen.dart
│ ├── ForgotPasswordScreen.dart
│ ├── GameDownloadScreen.dart
│ ├── GameInfoScreen.dart
│ ├── GamesScreen.dart
│ ├── HiddenWordsScreen.dart
│ ├── ImportFromOffScreen.dart
│ ├── InitScreen.dart
│ ├── LocalFavoriteScreen.dart
│ ├── MigrateScreen.dart
│ ├── ModifyPasswordScreen.dart
│ ├── NetworkSettingsScreen.dart
│ ├── PkzArchiveScreen.dart
│ ├── PkzComicInfoScreen.dart
│ ├── PkzReaderScreen.dart
│ ├── ProScreen.dart
│ ├── RandomComicsScreen.dart
│ ├── RankingsScreen.dart
│ ├── RegisterScreen.dart
│ ├── SearchAuthorScreen.dart
│ ├── SearchScreen.dart
│ ├── SettingsScreen.dart
│ ├── SpaceScreen.dart
│ ├── ThemeScreen.dart
│ ├── ViewLogsScreen.dart
│ ├── WebServerScreen.dart
│ ├── calculator_screen.dart
│ └── components/
│ ├── Avatar.dart
│ ├── Badge.dart
│ ├── BottomSheetInput.dart
│ ├── ComicDescriptionCard.dart
│ ├── ComicInfoCard.dart
│ ├── ComicList.dart
│ ├── ComicListBuilder.dart
│ ├── ComicPager.dart
│ ├── ComicTagsCard.dart
│ ├── CommentItem.dart
│ ├── CommentList.dart
│ ├── CommentMainType.dart
│ ├── Common.dart
│ ├── CommonData.dart
│ ├── ContentBuilder.dart
│ ├── ContentError.dart
│ ├── ContentLoading.dart
│ ├── ContentMessage.dart
│ ├── ContinueReadButton.dart
│ ├── DesktopCropper.dart
│ ├── DownloadComicsScreen.dart
│ ├── DownloadInfoCard.dart
│ ├── FitButton.dart
│ ├── GameTitleCard.dart
│ ├── GoDownloadSelect.dart
│ ├── ImageReader.dart
│ ├── Images.dart
│ ├── ItemBuilder.dart
│ ├── LinkToComicInfo.dart
│ ├── ListView.dart
│ ├── MouseAndTouchScrollBehavior.dart
│ ├── NetworkSetting.dart
│ ├── PkzComicInfoCard.dart
│ ├── PkzImages.dart
│ ├── RecommendLinksPanel.dart
│ ├── Recommendation.dart
│ ├── RightClickPop.dart
│ ├── TimeoutLock.dart
│ ├── UserProfileCard.dart
│ ├── flutter_search_bar.dart
│ └── gesture_zoom_box.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── scripts/
│ ├── README.md
│ ├── bind-android-arm64.sh
│ ├── bind-android-debug.sh
│ ├── bind-ios-arm64.sh
│ ├── bind-ios.sh
│ ├── build-apk-arm.sh
│ ├── build-apk-arm64.sh
│ ├── build-apk-x64.sh
│ ├── build-apk-x86.sh
│ ├── build-ipa.sh
│ ├── build-linux.sh
│ ├── build-macos-dmg.sh
│ ├── json_compairer.py
│ ├── sign-apk-github-actions.sh
│ ├── thin-payload.sh
│ └── version.sh
├── test/
│ └── widget_test.dart
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── run_loop.cpp
├── run_loop.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .fvmrc
================================================
{
"flutter": "3.13.9"
}
================================================
FILE: .github/workflows/Package.core.yml
================================================
name: Package-core
on:
workflow_dispatch:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GO_VERSION: "1.24"
NDK_VERSION: "23.1.7779620"
jobs:
ci-pass:
name: CI is green
runs-on: ubuntu-latest
needs:
- build_release_assets
steps:
- run: exit 0
build_release_assets:
name: Build and upload assets
strategy:
fail-fast: false
matrix:
config:
- target: ios
host: macos-latest
- target: android
host: ubuntu-latest
runs-on: ${{ matrix.config.host }}
env:
TARGET: ${{ matrix.config.target }}
steps:
- name: Setup golang
uses: actions/setup-go@v2
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache go modules (Linux)
if: matrix.config.host == 'ubuntu-latest'
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Cache go modules (macOS)
if: matrix.config.host == 'macos-latest'
uses: actions/cache@v3
with:
path: |
~/Library/Caches/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ env.BRANCH }}
- name: Checkout core
uses: actions/checkout@v3
with:
repository: 'niuhuan/pikapika-go-core'
token: ${{ secrets.CORE_TOKEN }}
path: 'go'
- name: Install go mobile (mobile)
if: matrix.config.target == 'ios' || matrix.config.target == 'android'
run: |
go install golang.org/x/mobile/cmd/gomobile@latest
- name: Build (ios)
if: matrix.config.target == 'ios'
run: |
sh scripts/bind-ios.sh
- name: Setup java (Android)
if: matrix.config.target == 'android'
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Setup android tools (Android)
if: matrix.config.target == 'android'
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 8512546
packages: 'platform-tools platforms;android-32 build-tools;30.0.2 ndk;${{ env.NDK_VERSION}}'
- name: Build (android)
if: matrix.config.target == 'android'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.NDK_VERSION }}
bash scripts/bind-android-debug.sh
- name: Upload Asset (All)
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.config.target }}-${{ github.run_number }}
path: 'go/mobile/lib'
retention-days: 3
================================================
FILE: .github/workflows/Package.yml
================================================
name: Build
on:
workflow_dispatch:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANDROID_NDK_VERSION: "23.1.7779620"
GO_MOBILE_VERSION: v0.0.0-20241213221354-a87c1cf6cf46 # v0.0.0-20220722155234-aaac322e2105
jobs:
ci-pass:
name: CI is green
runs-on: ubuntu-latest
needs:
- build_release_assets
steps:
- run: exit 0
build_release_assets:
name: Build release assets
strategy:
fail-fast: false
matrix:
sources:
- branch: master
config:
- target: windows
host: windows-latest
flutter_version: '2.10.3'
go_version: '1.23'
- target: macos
host: macos-latest
flutter_version: '2.10.3'
go_version: '1.23'
- target: linux
host: ubuntu-latest
flutter_version: '2.10.3'
go_version: '1.23'
- target: ios
host: macos-latest
flutter_version: '3.13.9'
go_version: '1.24'
- target: android-arm32
host: ubuntu-latest
flutter_version: '3.13.9'
go_version: '1.24'
java: '11'
- target: android-arm64
host: ubuntu-latest
flutter_version: '3.13.9'
go_version: '1.24'
java: '11'
- target: android-x86_64
host: ubuntu-latest
flutter_version: '3.13.9'
go_version: '1.24'
java: '11'
runs-on: ${{ matrix.config.host }}
env:
TARGET: ${{ matrix.config.target }}
FLUTTER_VERSION: ${{ matrix.config.flutter_version }}
BRANCH: ${{ matrix.sources.branch }}
go_version: ${{ matrix.config.go_version }}
steps:
# Setup golang env and cache go module
- name: Setup golang
uses: actions/setup-go@v2
with:
go-version: ${{ env.go_version }}
- name: Cache go modules (Windows)
if: matrix.config.host == 'windows-latest'
uses: actions/cache@v3
with:
path: |
~\AppData\Local\go-build
~\go\pkg\mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Cache go modules (Linux)
if: matrix.config.host == 'ubuntu-latest'
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Cache go modules (macOS)
if: matrix.config.host == 'macos-latest'
uses: actions/cache@v3
with:
path: |
~/Library/Caches/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
# checkout
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ env.BRANCH }}
# check_access
- id: check_asset
name: Check asset
run: |
echo "::set-output name=skip_build::false"
#
- name: Check core
if: steps.check_asset.outputs.skip_build != 'true'
uses: actions/checkout@v3
with:
repository: 'niuhuan/pikapika-go-core'
token: ${{ secrets.CORE_TOKEN }}
path: 'go'
- name: Setup flutter
if: steps.check_asset.outputs.skip_build != 'true'
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
architecture: x64
- name: Cache Flutter dependencies (Linux/Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' || matrix.config.target == 'linux' )
uses: actions/cache@v3
with:
path: /opt/hostedtoolcache/flutter
key: ${{ runner.os }}-flutter
- name: Cache Flutter dependencies (Mac host)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'ios' || matrix.config.target == 'macos' )
uses: actions/cache@v3
with:
path: /Users/runner/hostedtoolcache/flutter
key: ${{ runner.os }}-flutter
- name: Cache Gradle dependencies (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup java (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' ) && startsWith(matrix.config.flutter_version, '3.24.2') == false
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.config.java }}
distribution: 'temurin'
- name: Setup java (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' ) && startsWith(matrix.config.flutter_version, '3.24.2')
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Setup android tools (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 8512546
packages: 'platform-tools platforms;android-32 build-tools;30.0.2 ndk;${{ env.ANDROID_NDK_VERSION }}'
- name: Setup msys2 (Windows)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'windows'
uses: msys2/setup-msys2@v2
with:
install: gcc make
- name: Install dependencies (Linux)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'linux'
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
run: |
curl -JOL https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
chmod a+x appimagetool-x86_64.AppImage
mkdir -p ${GITHUB_WORKSPACE}/bin
mv appimagetool-x86_64.AppImage ${GITHUB_WORKSPACE}/bin/appimagetool
echo ::add-path::${GITHUB_WORKSPACE}/bin
sudo apt-get update
sudo apt-get install -y libgl1-mesa-dev xorg-dev libfuse2 locate
- name: Install hover (desktop)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'linux' || matrix.config.target == 'windows' || matrix.config.target == 'macos')
run: |
go install github.com/go-flutter-desktop/hover@latest
- name: Install go mobile (mobile)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'ios' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-arm32' || matrix.config.target == 'android-x86_64' )
run: |
go install golang.org/x/mobile/cmd/gomobile@${{ env.GO_MOBILE_VERSION }}
- name: Set-Version (All)
if: steps.check_asset.outputs.skip_build != 'true'
run: |
cd ci
cp version.code.txt ../lib/assets/version.txt
- name: Upgrade deps version (flutter2 non-mac)
if: steps.check_asset.outputs.skip_build != 'true' && startsWith(matrix.config.host, 'macos-') == false && startsWith(matrix.config.flutter_version, '2')
run: |
sed -i "s/another_xlider: ^1.0.1+2/another_xlider: 1.0.1+2/g" pubspec.yaml
sed -i "s/flutter_styled_toast: ^2.0.0/flutter_styled_toast: 2.0.0/g" pubspec.yaml
sed -i "s/filesystem_picker: ^3.0.0-beta.1/filesystem_picker: 2.0.0/g" pubspec.yaml
sed -i "s/file_picker: 5.2.5/file_picker: 4.6.1/g" pubspec.yaml
sed -i "s/multi_select_flutter: ^4.0.0/multi_select_flutter: 4.1.2/g" pubspec.yaml
sed -i "s/modal_bottom_sheet: ^3.0.0-pre/modal_bottom_sheet: 2.0.1/g" pubspec.yaml
sed -i "s/Icons.energy_savings_leaf/Icons.ad_units/g" lib/screens/SettingsScreen.dart
sed -i "s/gradle-7.5-bin.zip/gradle-6.7.1-all.zip/g" android/gradle/wrapper/gradle-wrapper.properties
sed -i "s/com.android.tools.build:gradle:7.2.0/com.android.tools.build:gradle:4.1.0/g" android/build.gradle
sed -i "s/1.7.10/1.3.50/g" android/app/build.gradle
sed -i "s/fontFamilyFallback/\/\/fontFamilyFallback/g" lib/basic/config/Themes.dart
sed -i "s/easy_localization: ^3.0.7+1/easy_localization: ^3.0.0/g" pubspec.yaml
sed -i "s/thumbVisibility: true/isAlwaysShown: true/g" lib/basic/config/ShadowCategories.dart
flutter pub get
- name: Upgrade deps version (flutter2 mac)
if: steps.check_asset.outputs.skip_build != 'true' && startsWith(matrix.config.host, 'macos-') && startsWith(matrix.config.flutter_version, '2')
run: |
brew install gnu-sed
gsed -i "s/another_xlider: ^1.0.1+2/another_xlider: 1.0.1+2/g" pubspec.yaml
gsed -i "s/flutter_styled_toast: ^2.0.0/flutter_styled_toast: 2.0.0/g" pubspec.yaml
gsed -i "s/filesystem_picker: ^3.0.0-beta.1/filesystem_picker: 2.0.0/g" pubspec.yaml
gsed -i "s/file_picker: 5.2.5/file_picker: 4.6.1/g" pubspec.yaml
gsed -i "s/multi_select_flutter: ^4.0.0/multi_select_flutter: 4.1.2/g" pubspec.yaml
gsed -i "s/modal_bottom_sheet: ^3.0.0-pre/modal_bottom_sheet: 2.0.1/g" pubspec.yaml
gsed -i "s/Icons.energy_savings_leaf/Icons.ad_units/g" lib/screens/SettingsScreen.dart
gsed -i "s/fontFamilyFallback/\/\/fontFamilyFallback/g" lib/basic/config/Themes.dart
gsed -i "s/easy_localization: ^3.0.7+1/easy_localization: ^3.0.0/g" pubspec.yaml
gsed -i "s/thumbVisibility: true/isAlwaysShown: true/g" lib/basic/config/ShadowCategories.dart
flutter pub get
- name: Build (windows)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'windows'
run: |
hover build windows
curl -JOL https://github.com/ComicSparks/build-tools/releases/download/storage/Resource_Hacker_5.1.8.zip
Expand-Archive .\Resource_Hacker_5.1.8.zip
cmd /c "Resource_Hacker_5.1.8\ResourceHacker.exe" -open go\build\outputs\windows-release\pikapika.exe -save go\build\outputs\windows-release\pikapika.exe -action addskip -res go/assets/icon.ico -mask ICONGROUP,MAINICON,0
cd go\build\outputs\windows-release
DEL flutter_engine.pdb
DEL flutter_engine.exp
DEL flutter_engine.lib
Compress-Archive * ../../../../build/build.zip
- name: Build (macos)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'macos'
run: |
hover build darwin-dmg
mv go/build/outputs/darwin-dmg-release/*.dmg build/build.dmg
- name: Build (linux)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'linux'
run: |
curl -JOL https://github.com/junmer/source-han-serif-ttf/raw/master/SubsetTTF/CN/SourceHanSerifCN-Regular.ttf
mkdir -p fonts
mv SourceHanSerifCN-Regular.ttf fonts/Roboto.ttf
cat ci/linux_font.yaml >> pubspec.yaml
hover build linux-appimage
mv go/build/outputs/linux-appimage-release/*.AppImage build/build.AppImage
- name: Append application-identifier (ios)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'ios'
run: |
/usr/libexec/PlistBuddy -c 'Add :application-identifier string opensource.pikapika' ios/Runner/Info.plist
- name: Build (ios)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'ios'
run: |
sh scripts/build-ipa.sh
- name: Build (android-arm32)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android-arm32'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.ANDROID_NDK_VERSION }}
sh scripts/build-apk-arm.sh
- name: Build (android-arm64)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android-arm64'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.ANDROID_NDK_VERSION }}
sh scripts/build-apk-arm64.sh
- name: Build (android-x86_64)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android-x86_64'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.ANDROID_NDK_VERSION }}
sh scripts/build-apk-x64.sh
- name: Sign APK (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
env:
KEY_FILE_BASE64: ${{ secrets.KEY_FILE_BASE64 }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
sh scripts/sign-apk-github-actions.sh
- if: steps.need_build.outputs.skip_build != 'true' && matrix.config.target == 'ios'
name: 'Upload Artifact (iOS)'
uses: actions/upload-artifact@v4
with:
name: 'nosign.ipa'
path: 'build/nosign.ipa'
retention-days: 3
- if: steps.need_build.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
name: 'Upload Artifact (Android)'
uses: actions/upload-artifact@v4
with:
name: 'app-release-${{ matrix.config.target }}.apk'
path: 'build/app/outputs/flutter-apk/app-release.apk'
retention-days: 3
- if: steps.need_build.outputs.skip_build != 'true' && matrix.config.target == 'linux'
name: 'Upload Artifact (Linux)'
uses: actions/upload-artifact@v4
with:
name: 'build.AppImage'
path: 'build/build.AppImage'
retention-days: 3
- if: steps.need_build.outputs.skip_build != 'true' && matrix.config.target == 'macos'
name: 'Upload Artifact (MacOS)'
uses: actions/upload-artifact@v4
with:
name: 'build.dmg'
path: 'build/build.dmg'
================================================
FILE: .github/workflows/Release.core.yml
================================================
name: Release-core
permissions:
contents: write
on:
workflow_dispatch:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GO_VERSION: "1.24"
GO_MOBILE_VERSION: v0.0.0-20241213221354-a87c1cf6cf46
jobs:
ci-pass:
name: CI is green
runs-on: ubuntu-latest
needs:
- build_release_assets
steps:
- run: exit 0
build_release_assets:
name: Build and upload assets
strategy:
fail-fast: false
matrix:
config:
- target: ios
host: macos-latest
- target: android
host: ubuntu-latest
runs-on: ${{ matrix.config.host }}
env:
TARGET: ${{ matrix.config.target }}
steps:
- name: Setup golang
uses: actions/setup-go@v2
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache go modules (Linux)
if: matrix.config.host == 'ubuntu-latest'
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Cache go modules (macOS)
if: matrix.config.host == 'macos-latest'
uses: actions/cache@v3
with:
path: |
~/Library/Caches/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ env.BRANCH }}
- id: check_asset
name: Check asset
run: |
cd ci
go run ./cmd/check_asset_core
- name: Checkout core
if: steps.check_asset.outputs.skip_build != 'true'
uses: actions/checkout@v3
with:
repository: 'niuhuan/pikapika-go-core'
token: ${{ secrets.CORE_TOKEN }}
path: 'go'
- if: steps.check_asset.outputs.skip_build != 'true'
name: Install go mobile (mobile)
run: |
go install golang.org/x/mobile/cmd/gomobile@${{ env.GO_MOBILE_VERSION }}
- name: Build (ios)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'ios'
run: |
sh scripts/bind-ios.sh
- name: Setup java (Android)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android'
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Setup android tools (Android)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android'
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 8512546
packages: 'platform-tools platforms;android-32 build-tools;30.0.2 ndk;23.1.7779620'
- name: Build (android)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android'
run: |
sh scripts/bind-android-debug.sh
- name: Upload Asset (All)
if: steps.check_asset.outputs.skip_build != 'true'
run: |
zip -r core.zip go/mobile/lib
cd ci
go run ./cmd/upload_asset_core
================================================
FILE: .github/workflows/Release.yml
================================================
name: Release
permissions:
contents: write
on:
workflow_dispatch:
inputs:
skip_community_notification:
description: 'skip_community_notification'
type: boolean
required: false
default: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANDROID_NDK_VERSION: "23.1.7779620"
GO_MOBILE_VERSION: v0.0.0-20241213221354-a87c1cf6cf46
jobs:
ci-pass:
name: CI is green
runs-on: ubuntu-latest
needs:
- check_release
- build_release_assets
- send_to_community
steps:
- run: exit 0
check_release:
name: Check release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
repository: ${{ github.event.inputs.repo }}
ref: 'master'
- uses: actions/setup-go@v2
with:
go-version: ${{ env.go_version }}
- name: Cache go modules
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ubuntu-latest-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
ubuntu-latest-go-
- name: Check release
run: |
cd ci
go run ./cmd/check_release
build_release_assets:
name: Build release assets
needs:
- check_release
strategy:
fail-fast: false
matrix:
sources:
- branch: master
config:
- target: windows
host: windows-latest
flutter_version: '2.10.3'
go_version: '1.23'
- target: macos
host: macos-latest
flutter_version: '2.10.3'
go_version: '1.23'
- target: linux
host: ubuntu-latest
flutter_version: '2.10.3'
go_version: '1.23'
- target: ios
host: macos-14
flutter_version: '3.13.9'
go_version: '1.24'
- target: android-arm32
host: ubuntu-latest
flutter_version: '3.13.9'
go_version: '1.24'
java: '11'
- target: android-arm64
host: ubuntu-latest
flutter_version: '3.13.9'
go_version: '1.24'
java: '11'
- target: android-x86_64
host: ubuntu-latest
flutter_version: '3.13.9'
go_version: '1.24'
java: '11'
runs-on: ${{ matrix.config.host }}
env:
TARGET: ${{ matrix.config.target }}
FLUTTER_VERSION: ${{ matrix.config.flutter_version }}
BRANCH: ${{ matrix.sources.branch }}
go_version: ${{ matrix.config.go_version }}
steps:
# Setup golang env and cache go module
- name: Setup golang
uses: actions/setup-go@v2
with:
go-version: ${{ env.go_version }}
- name: Cache go modules (Windows)
if: matrix.config.host == 'windows-latest'
uses: actions/cache@v3
with:
path: |
~\AppData\Local\go-build
~\go\pkg\mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Cache go modules (Linux)
if: matrix.config.host == 'ubuntu-latest'
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
- name: Cache go modules (macOS)
if: startsWith(matrix.config.host, 'macos-')
uses: actions/cache@v3
with:
path: |
~/Library/Caches/go-build
~/go/pkg/mod
key: ${{ matrix.config.host }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ matrix.config.host }}-go-
# checkout
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ env.BRANCH }}
# check_access
- id: check_asset
name: Check asset
run: |
cd ci
go run ./cmd/check_asset
#
- name: Check core
if: steps.check_asset.outputs.skip_build != 'true'
uses: actions/checkout@v3
with:
repository: 'niuhuan/pikapika-go-core'
token: ${{ secrets.CORE_TOKEN }}
path: 'go'
- name: Setup flutter
if: steps.check_asset.outputs.skip_build != 'true'
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
architecture: x64
- name: Check core
if: steps.check_asset.outputs.skip_build != 'true'
uses: actions/checkout@v3
with:
repository: 'niuhuan/pikapika-go-core'
token: ${{ secrets.CORE_TOKEN }}
path: 'go'
- name: Cache Flutter dependencies (Linux/Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' || matrix.config.target == 'linux' )
uses: actions/cache@v3
with:
path: /opt/hostedtoolcache/flutter
key: ${{ runner.os }}-flutter
- name: Cache Flutter dependencies (Mac host)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'ios' || matrix.config.target == 'macos' )
uses: actions/cache@v3
with:
path: /Users/runner/hostedtoolcache/flutter
key: ${{ runner.os }}-flutter
- name: Cache Gradle dependencies (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup java (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' ) && startsWith(matrix.config.flutter_version, '3.24.2') == false
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.config.java }}
distribution: 'temurin'
- name: Setup java (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' ) && startsWith(matrix.config.flutter_version, '3.24.2')
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Setup android tools (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 8512546
packages: 'platform-tools platforms;android-32 build-tools;30.0.2 ndk;${{ env.ANDROID_NDK_VERSION }}'
- name: Setup msys2 (Windows)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'windows'
uses: msys2/setup-msys2@v2
with:
install: gcc make
- name: Install dependencies (Linux)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'linux'
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
run: |
curl -JOL https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
chmod a+x appimagetool-x86_64.AppImage
mkdir -p ${GITHUB_WORKSPACE}/bin
mv appimagetool-x86_64.AppImage ${GITHUB_WORKSPACE}/bin/appimagetool
echo ::add-path::${GITHUB_WORKSPACE}/bin
sudo apt-get update
sudo apt-get install -y libgl1-mesa-dev xorg-dev libfuse2 locate
- name: Install hover (desktop)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'linux' || matrix.config.target == 'windows' || matrix.config.target == 'macos')
run: |
go install github.com/go-flutter-desktop/hover@latest
- name: Install go mobile (mobile)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'ios' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-arm32' || matrix.config.target == 'android-x86_64' )
run: |
go install golang.org/x/mobile/cmd/gomobile@${{ env.GO_MOBILE_VERSION }}
- name: Set-Version (All)
if: steps.check_asset.outputs.skip_build != 'true'
run: |
cd ci
cp version.code.txt ../lib/assets/version.txt
- name: Upgrade deps version (flutter2 non-mac)
if: steps.check_asset.outputs.skip_build != 'true' && startsWith(matrix.config.host, 'macos-') == false && startsWith(matrix.config.flutter_version, '2')
run: |
sed -i "s/another_xlider: ^1.0.1+2/another_xlider: 1.0.1+2/g" pubspec.yaml
sed -i "s/flutter_styled_toast: ^2.0.0/flutter_styled_toast: 2.0.0/g" pubspec.yaml
sed -i "s/filesystem_picker: ^3.0.0-beta.1/filesystem_picker: 2.0.0/g" pubspec.yaml
sed -i "s/file_picker: 5.2.5/file_picker: 4.6.1/g" pubspec.yaml
sed -i "s/multi_select_flutter: ^4.0.0/multi_select_flutter: 4.1.2/g" pubspec.yaml
sed -i "s/modal_bottom_sheet: ^3.0.0-pre/modal_bottom_sheet: 2.0.1/g" pubspec.yaml
sed -i "s/Icons.energy_savings_leaf/Icons.ad_units/g" lib/screens/SettingsScreen.dart
sed -i "s/gradle-7.5-bin.zip/gradle-6.7.1-all.zip/g" android/gradle/wrapper/gradle-wrapper.properties
sed -i "s/com.android.tools.build:gradle:7.2.0/com.android.tools.build:gradle:4.1.0/g" android/build.gradle
sed -i "s/1.7.10/1.3.50/g" android/app/build.gradle
sed -i "s/fontFamilyFallback/\/\/fontFamilyFallback/g" lib/basic/config/Themes.dart
sed -i "s/easy_localization: ^3.0.7+1/easy_localization: ^3.0.0/g" pubspec.yaml
sed -i "s/thumbVisibility: true/isAlwaysShown: true/g" lib/basic/config/ShadowCategories.dart
flutter pub get
- name: Upgrade deps version (flutter2 mac)
if: steps.check_asset.outputs.skip_build != 'true' && startsWith(matrix.config.host, 'macos-') && startsWith(matrix.config.flutter_version, '2')
run: |
brew install gnu-sed
gsed -i "s/another_xlider: ^1.0.1+2/another_xlider: 1.0.1+2/g" pubspec.yaml
gsed -i "s/flutter_styled_toast: ^2.0.0/flutter_styled_toast: 2.0.0/g" pubspec.yaml
gsed -i "s/filesystem_picker: ^3.0.0-beta.1/filesystem_picker: 2.0.0/g" pubspec.yaml
gsed -i "s/file_picker: 5.2.5/file_picker: 4.6.1/g" pubspec.yaml
gsed -i "s/multi_select_flutter: ^4.0.0/multi_select_flutter: 4.1.2/g" pubspec.yaml
gsed -i "s/modal_bottom_sheet: ^3.0.0-pre/modal_bottom_sheet: 2.0.1/g" pubspec.yaml
gsed -i "s/Icons.energy_savings_leaf/Icons.ad_units/g" lib/screens/SettingsScreen.dart
gsed -i "s/fontFamilyFallback/\/\/fontFamilyFallback/g" lib/basic/config/Themes.dart
gsed -i "s/easy_localization: ^3.0.7+1/easy_localization: ^3.0.0/g" pubspec.yaml
gsed -i "s/thumbVisibility: true/isAlwaysShown: true/g" lib/basic/config/ShadowCategories.dart
flutter pub get
- name: Build (windows)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'windows'
run: |
hover build windows
curl -JOL https://github.com/ComicSparks/build-tools/releases/download/storage/Resource_Hacker_5.1.8.zip
Expand-Archive .\Resource_Hacker_5.1.8.zip
cmd /c "Resource_Hacker_5.1.8\ResourceHacker.exe" -open go\build\outputs\windows-release\pikapika.exe -save go\build\outputs\windows-release\pikapika.exe -action addskip -res go/assets/icon.ico -mask ICONGROUP,MAINICON,0
cd go\build\outputs\windows-release
DEL flutter_engine.pdb
DEL flutter_engine.exp
DEL flutter_engine.lib
Compress-Archive * ../../../../build/build.zip
- name: Build (macos)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'macos'
run: |
hover build darwin-dmg
mv go/build/outputs/darwin-dmg-release/*.dmg build/build.dmg
- name: Build (linux)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'linux'
run: |
curl -JOL https://github.com/junmer/source-han-serif-ttf/raw/master/SubsetTTF/CN/SourceHanSerifCN-Regular.ttf
mkdir -p fonts
mv SourceHanSerifCN-Regular.ttf fonts/Roboto.ttf
cat ci/linux_font.yaml >> pubspec.yaml
hover build linux-appimage
mv go/build/outputs/linux-appimage-release/*.AppImage build/build.AppImage
- name: Append application-identifier (ios)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'ios'
run: |
/usr/libexec/PlistBuddy -c 'Add :application-identifier string opensource.pikapika' ios/Runner/Info.plist
- name: Build (ios)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'ios'
run: |
sh scripts/build-ipa.sh
- name: Build (android-arm32)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android-arm32'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.ANDROID_NDK_VERSION }}
sh scripts/build-apk-arm.sh
- name: Build (android-arm64)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android-arm64'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.ANDROID_NDK_VERSION }}
sh scripts/build-apk-arm64.sh
- name: Build (android-x86_64)
if: steps.check_asset.outputs.skip_build != 'true' && matrix.config.target == 'android-x86_64'
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/${{ env.ANDROID_NDK_VERSION }}
sh scripts/build-apk-x64.sh
- name: Sign APK (Android)
if: steps.check_asset.outputs.skip_build != 'true' && ( matrix.config.target == 'android-arm32' || matrix.config.target == 'android-arm64' || matrix.config.target == 'android-x86_64' )
env:
KEY_FILE_BASE64: ${{ secrets.KEY_FILE_BASE64 }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
sh scripts/sign-apk-github-actions.sh
- name: Upload Asset (All)
if: steps.check_asset.outputs.skip_build != 'true'
run: |
cd ci
go run ./cmd/upload_asset
send_to_community:
if: github.event.inputs.skip_community_notification != 'true'
needs:
- check_release
- build_release_assets
name: Send message to community
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
repository: ${{ github.event.inputs.repo }}
ref: 'master'
- uses: actions/setup-go@v2
with:
go-version: ${{ env.go_version }}
- name: Cache go modules
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Send to community
env:
TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
TG_CHAT_IDS: ${{ secrets.TG_CHAT_IDS }}
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }}
DISCORD_CHAT_IDS: ${{ secrets.DISCORD_CHAT_IDS }}
run: |
cd ci
go run ./cmd/send_to_community
================================================
FILE: .gitignore
================================================
# 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
# PROJECT
/go/mobile/lib/*.aar
/go/mobile/lib/*.jar
/go/mobile/lib/*.framework/
/go/mobile/lib/*.xcframework/
/go/vendor/
ios/build/
# IDE
*.iml
.vscode/
# APP
/lib/assets/version.txt
go.work
# FVM Version Cache
.fvm/
tmp/
.tmp/
================================================
FILE: .metadata
================================================
# 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: f4abaa0735eba4dfd8f33f73363911d63931fe03
channel: stable
project_type: app
================================================
FILE: README-zh_CN.md
================================================
<div align="center">
<h1 align="center">
Pikapika
[](https://raw.githubusercontent.com/ComicSparks/pikapika/master/LICENSE)
[](https://github.com/ComicSparks/pikapika/releases)
</h1>
</div>
- 美观易用且无广告的漫画客户端, 能运行在Windows/MacOS/Linux/Android/IOS中。
- 此APP内容存在限制级别内容(例如 露骨/血腥/暴力/吸毒),18岁以下的用户需在监护人陪同下使用,并请您在遵守当地法律法规。
- 您的star和issue是对开发者的莫大鼓励, 可以源仓库下载最新的源码/安装包, 表示支持/提出建议。
- 源仓库地址 [https://github.com/ComicSparks/pikapika](https://github.com/ComicSparks/pikapika)
## 界面 / 功能

### 分流
VPN->代理->分流, 这三个功能如果同时设置, 您会在您手机的VPN上访问代理, 使用代理请求分流服务器。
### 漫画分类/搜索
 
### 漫画阅读/下载/导入/导出
您可以导出任意已经完成的下载到zip, 从另外一台设备导入。 导出的zip解压后可以直接使用其中的HTML进行阅读


### 游戏


## 特性
- [x] 用户
- [x] 登录 / 注册 / 获取个人信息 / 自动打卡
- [x] 修改密码 / 修改签名 / 修改头像
- [x] 漫画
- [x] 分类 / 搜索 / 随机本子 / 看此本子的也在看 / 排行榜
- [x] 在分类中搜索 / 按 "分类 / 标签 / 创建人 / 汉化组" 检索
- [x] 漫画详情 / 章节 / 看图 / 将图片保存到相册
- [x] 收藏 / 喜欢
- [x] 获取评论 / 评论 / 评论回复 (社区评论后无法删除, 请谨慎使用)
- [x] 更新提示
- [x] 游戏
- [x] 列表 / 详情 / 无广告下载
- [x] 下载
- [x] 导入导出 / 无线共享 / 移动设备与PC设备传输
- [x] 导出到加密的归档文件 / 直接观看加密的归档文件
- [ ] 聊天室
- [x] 缓存 / 自动清理
- [x] 设备支持
- [x] 移动端
- [x] 文件关联
- [x] 自定义超链接
- [x] 安卓
- [x] 高刷新频率屏幕适配 (90/120/144... Hz)
- [x] 安卓10以上随系统进入深色/夜间模式
## 其他说明
数据资料存储位置
- ios/android : 程序自身数据目录中, 删除就会清理
- windows : 程序同一目录中data文件夹下
- macos : ~/Library/Application\ Support/pikapika
- linux : ~/.pikapika
## 技术架构
### 多平台适配
这个应用程序使用golang和dart(flutter)作为主要语言, 可以兼容Windows, linux, MacOS, Android, IOS
使用了不同的框架桥接到桌面和移动平台上
- go-flutter => Windows / MacOS / Linux
- gomobile => Android / IOS

### 构建环境
(桌面端/移动端)
- [golang](https://golang.org/) (1.17/1.18)
- [flutter](https://flutter.dev/) (2.10.3/3.7.3)
## 请您遵守使用规则
软件副本分发以及代码使用规则
- 本软件的代码在未经允许的情况下可以自用但不允许释放任何releases, 个人或企业不可用于商业用途, 不可上架任何商店。
- 不要在任何其他 **二次元软件** 的 **聊天社区** 或 **开发社区** 内, 发布有关本软件的链接或信息, 对于观点不同产生的分歧作者不站队任何立场。
- 不要发送本软件安装包到 **任何社区内** , 不要将APK/IPA/ZIP/DMG发送包括任何聊天软件内的群聊功能。 请使用Github中提供的Releases页面的链接。
- 对本仓库的fork需要保留本仓库的链接, 以引导用户在主要仓库进行讨论。
责任声明
- 作者仅分享编程技术, 不分发软件, 不对分发软件承担任何后果。 因传播载造成的法律问题或纠纷, 需行为人自行承担, 请您遵守当地法以及副本接受方(社区或人)所在地区的法律。
================================================
FILE: README.md
================================================
<div align="center">
<h1 align="center">
Pikapika
[](https://raw.githubusercontent.com/ComicSparks/pikapika/master/LICENSE)
[](https://github.com/ComicSparks/pikapika/releases)
</h1>
</div>
- A visually appealing, easy-to-use, ad-free manga client that runs on Windows/MacOS/Linux/Android/iOS.
- This app contains restricted content (such as explicit, gory, violent, drug-related scenes). Users under 18 should use it under parental supervision, and please comply with local laws and regulations.
- Your stars and issues are a great encouragement to the developers. You can download the latest source code/installation package from the source repository to show support/offer suggestions.
- Source Repository URL is [https://github.com/ComicSparks/pikapika](https://github.com/ComicSparks/pikapika)
## Interface / Functions

### Traffic Diversion
VPN -> Proxy -> Traffic Diversion: If these three functions are set simultaneously, you will access the proxy through the VPN on your phone, using the proxy to request the traffic diversion server.
### Comic categories/search
Search comics in categories
### Comic reader/download/imports/exports
You can export any completed downloads to a zip file and import it from another device. After extracting the exported zip, you can directly use the HTML files within for reading.
### Games
You can download games without ads.
## Features
- [x] Users
- [x] Login / Register / Get personal information / Auto check-in
- [x] Change password / Signature / Avatar
- [x] Comics
- [x] Categories / Search / Random comic / Also reading this comic / Rankings
- [x] Search in categories / Search by "category / tag / creator / translation group"
- [x] Comic details / Chapters / View images / Save images to the album
- [x] Favorites / Likes
- [x] Get comments / Comment / Comment reply (comments in the community cannot be deleted, please use with caution)
- [x] Update notification
- [x] Games
- [x] List / Details / Ad-free download
- [x] Downloads
- [x] Import/export / Wireless sharing / Transfer between mobile and PC devices
- [x] Export to encrypted archive file / Directly view encrypted archive file
- [ ] Chat room
- [x] Cache / Auto clean
- [x] Device support
- [x] Mobile
- [x] File association
- [x] Custom hyperlinks
- [x] Android
- [x] High refresh rate screen adaptation (90/120/144... Hz)
- [x] Android 10 and above automatically switch to dark/night mode with the system
## Other tips
Data storage location
- ios/android: In the program's own data directory, deleting it will clear it
- windows: In the data folder in the same directory as the program
- macos: ~/Library/Application\ Support/pikapika
- linux: ~/.pikapika
## Technology Stack
### Multi-platform adaptation
This application uses golang and dart (flutter) as the main languages and is compatible with Windows, Linux, MacOS, Android, and iOS.
Different frameworks are used to bridge to desktop and mobile platforms
- go-flutter => Windows / MacOS / Linux
- gomobile => Android / iOS

### Build environment
(Desktop/Mobile)
- [golang](https://golang.org/) (1.17/1.18)
- [flutter](https://flutter.dev/) (2.10.3/3.7.3)
## Please follow the usage rules.
Software copy distribution and code usage rules
- The code of this software can be used for personal use without permission, but no releases are allowed, and it cannot be used for commercial purposes by individuals or companies, nor can it be put on any store.
- Do not post links or information about this software in any **two-dimensional** chat community or development community. The author does not take any stance on any views that differ.
- Do not send the software installation package to **any community**, and do not send APK/IPA/ZIP/DMG to any group chat function in any chat software. Please use the link provided on the Releases page in Github.
- Forks of this repository must retain the link to this repository to guide users to discuss in the main repository.
Disclaimer
- The author only shares programming technology and does not distribute software. The person who spreads the content is responsible for any legal issues or disputes caused by the spread. Please comply with local laws and the laws of the recipient (community or individual) region.
================================================
FILE: analysis_options.yaml
================================================
include: package:flutter_lints/flutter.yaml
linter:
rules:
avoid_print: false
unnecessary_this: false
file_names: false
constant_identifier_names: false
no_logic_in_create_state: false
================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
================================================
FILE: android/app/build.gradle
================================================
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 33 // flutter.compileSdkVersion
// ndkVersion flutter.ndkVersion
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 "opensource.pic2acg"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21 // flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
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 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
implementation fileTree(dir: "../../go/mobile/lib", include: ["*.jar", "*.aar"])
}
================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="opensource.pic2acg">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="opensource.pic2acg">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https" />
</intent>
</queries>
<application
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="pic2acg"
android:requestLegacyExternalStorage="true">
<activity
android:name="opensource.pic2acg.MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="pika" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="pika" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data
android:host="*"
android:mimeType="*/*"
android:scheme="content"></data>
<data android:pathPattern=".*\.pkz"></data>
<data android:pathPattern=".*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\.pki"></data>
<data android:pathPattern=".*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\..*\.pki"></data>
<data
android:host="*"
android:mimeType="*/*"
android:scheme="file"></data>
<data android:pathPattern=".*\.pkz"></data>
<data android:pathPattern=".*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\..*\.pkz"></data>
<data android:pathPattern=".*\.pki"></data>
<data android:pathPattern=".*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\.pki"></data>
<data android:pathPattern=".*\..*\..*\..*\..*\..*\.pki"></data>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!-- image_cropper -->
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
</application>
</manifest>
================================================
FILE: android/app/src/main/kotlin/opensource/pic2acg/MainActivity.kt
================================================
package opensource.pic2acg
import android.content.ContentValues
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.hardware.biometrics.BiometricPrompt
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.*
import android.provider.MediaStore
import android.util.Log
import android.view.Display
import android.view.KeyEvent
import android.view.WindowManager
import androidx.annotation.NonNull
import androidx.annotation.RequiresApi
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.newSingleThreadContext
import kotlinx.coroutines.sync.Mutex
import mobile.Mobile
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.nio.file.Files
import java.util.concurrent.Executors
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.TimeUnit
class MainActivity : FlutterActivity() {
// 为什么换成换成线程池而不继续使用携程 : 下载图片速度慢会占满携程造成拥堵, 接口无法请求
private val pool = Executors.newCachedThreadPool { runnable ->
Thread(runnable).also { it.isDaemon = true }
}
private val uiThreadHandler = Handler(Looper.getMainLooper())
private val scope = CoroutineScope(newSingleThreadContext("worker-scope"))
private val notImplementedToken = Any()
private fun MethodChannel.Result.withCoroutine(exec: () -> Any?) {
pool.submit {
try {
val data = exec()
uiThreadHandler.post {
when (data) {
notImplementedToken -> {
notImplemented()
}
is Unit, null -> {
success(null)
}
else -> {
success(data)
}
}
}
} catch (e: Exception) {
Log.e("Method", "Exception", e)
uiThreadHandler.post {
error("", e.message, "")
}
}
}
}
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
Mobile.initApplication(androidDataLocal())
// Method Channel
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"method"
).setMethodCallHandler { call, result ->
result.withCoroutine {
when (call.method) {
"flatInvoke" -> {
Mobile.flatInvoke(
call.argument("method")!!,
call.argument("params")!!
)
}
"androidSaveFileToImage" -> {
saveImage(call.argument("path")!!)
}
"androidGetModes" -> {
modes()
}
"androidSetMode" -> {
setMode(call.argument("mode")!!)
}
"androidGetVersion" -> Build.VERSION.SDK_INT
// 现在的文件储存路径, 默认路径返回空字符串 ""
"dataLocal" -> androidDataLocal()
// 迁移到那个地方, 如果是空字符串则迁移会默认位置
"migrate" -> androidMigrate(call.argument("path")!!)
// 获取可以迁移数据地址
"androidGetExtendDirs" -> androidGetExtendDirs()
"androidSecureFlag" -> androidSecureFlag(call.argument("flag")!!)
"verifyAuthentication" -> auth()
"androidStorageRoot" -> storageRoot()
"androidDefaultExportsDir" -> androidDefaultExportsDir().absolutePath
"androidMkdirs" -> androidMkdirs(
call.arguments<String>() ?: throw Exception("need arg")
)
else -> {
notImplementedToken
}
}
}
}
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"network"
).setMethodCallHandler { call, result ->
result.withCoroutine {
when (call.method) {
"getNetworkType" -> getNetworkType()
"getIsMobile" -> isMobileNetwork()
else -> notImplementedToken
}
}
}
//
val eventMutex = Mutex()
var eventSink: EventChannel.EventSink? = null
EventChannel(flutterEngine.dartExecutor.binaryMessenger, "flatEvent")
.setStreamHandler(object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
events?.let { events ->
scope.launch {
eventMutex.lock()
eventSink = events
eventMutex.unlock()
}
}
}
override fun onCancel(arguments: Any?) {
scope.launch {
eventMutex.lock()
eventSink = null
eventMutex.unlock()
}
}
})
Mobile.eventNotify { message ->
scope.launch {
eventMutex.lock()
try {
eventSink?.let {
uiThreadHandler.post {
it.success(message)
}
}
} finally {
eventMutex.unlock()
}
}
}
//
EventChannel(flutterEngine.dartExecutor.binaryMessenger, "volume_button")
.setStreamHandler(volumeStreamHandler)
}
private fun androidDataLocal(): String {
val localFile = File(context!!.filesDir.absolutePath, "data.local")
if (localFile.exists()) {
val path = String(FileInputStream(localFile).use { it.readBytes() })
if (File(path).isDirectory) {
return path
}
}
return context!!.filesDir.absolutePath
}
private fun androidGetExtendDirs(): String {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val result = context!!.getExternalFilesDirs("")?.toMutableList()?.also {
it.add(context!!.filesDir.absoluteFile)
}?.joinToString("|")
if (result != null) {
return result
}
}
throw Exception("System version too low")
}
private fun androidMigrate(path: String) {
val current = androidDataLocal()
if (current == path) {
return
}
// 删除位置配置文件
if (File(current, "data.local").exists()) {
File(current, "data.local").delete()
}
// 目标位置文件夹不存在就创建,存在则清理
val target = File(path)
if (!target.exists()) {
target.mkdirs()
}
target.listFiles().forEach { delete(it) }
// 移动所有文件夹
File(current).listFiles().forEach {
move(it, File(target, it.name))
}
val localFile = File(context!!.filesDir.absolutePath, "data.local")
if (path == context!!.filesDir.absolutePath) {
localFile.delete()
} else {
FileOutputStream(localFile).use { it.write(path.toByteArray()) }
}
}
private fun delete(f: File) {
f.delete()
}
private fun move(f: File, t: File) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (f.isDirectory) {
Files.createDirectories(t.toPath())
f.listFiles().forEach { move(it, File(t, it.name)) }
Files.delete(f.toPath())
} else {
Files.move(f.toPath(), t.toPath())
}
} else {
if (f.isDirectory) {
t.mkdirs()
f.listFiles().forEach { move(it, File(t, it.name)) }
f.delete()
} else {
FileOutputStream(t).use { o ->
FileInputStream(f).use { i ->
o.write(i.readBytes())
}
}
f.delete()
}
}
}
// save_image
private fun saveImage(path: String) {
BitmapFactory.decodeFile(path)?.let { bitmap ->
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, System.currentTimeMillis().toString())
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //this one
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
put(MediaStore.MediaColumns.IS_PENDING, 1)
}
}
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
?.let { uri ->
contentResolver.openOutputStream(uri)?.use { fos ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //this one
contentValues.clear()
contentValues.put(MediaStore.Video.Media.IS_PENDING, 0)
contentResolver.update(uri, contentValues, null, null)
}
}
}
}
// fps mods
private fun mixDisplay(): Display? {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
display?.let {
return it
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
windowManager.defaultDisplay?.let {
return it
}
}
return null
}
private fun modes(): List<String> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mixDisplay()?.let { display ->
return display.supportedModes.map { mode ->
mode.toString()
}
}
}
return ArrayList()
}
private fun setMode(string: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mixDisplay()?.let { display ->
if (string == "") {
uiThreadHandler.post {
window.attributes = window.attributes.also { attr ->
attr.preferredDisplayModeId = 0
}
}
return
}
return display.supportedModes.forEach { mode ->
if (mode.toString() == string) {
uiThreadHandler.post {
window.attributes = window.attributes.also { attr ->
attr.preferredDisplayModeId = mode.modeId
}
}
return
}
}
}
}
}
// volume_buttons
private var volumeEvents: EventChannel.EventSink? = null
private val volumeStreamHandler = object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
volumeEvents = events
}
override fun onCancel(arguments: Any?) {
volumeEvents = null
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
volumeEvents?.let {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
uiThreadHandler.post {
it.success("DOWN")
}
return true
}
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
uiThreadHandler.post {
it.success("UP")
}
return true
}
}
return super.onKeyDown(keyCode, event)
}
private fun androidSecureFlag(flag: Boolean) {
uiThreadHandler.post {
if (flag) {
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
}
}
// withCoroutine -> queue
private fun auth(): Boolean {
var queue = LinkedBlockingQueue<Boolean>()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
var mBiometricPrompt = BiometricPrompt.Builder(this)
.setTitle("验证身份")
.setDescription("需要验证您的身份")
.setNegativeButton(
"取消", mainExecutor
) { _, _ -> queue.add(false) }
.build()
var mCancellationSignal = CancellationSignal()
mCancellationSignal.setOnCancelListener {
queue.add(false)
}
var mAuthenticationCallback = object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
super.onAuthenticationError(errorCode, errString)
queue.add(false)
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
queue.add(false)
}
override fun onAuthenticationSucceeded(result1: BiometricPrompt.AuthenticationResult?) {
super.onAuthenticationSucceeded(result1)
queue.add(true)
}
}
mBiometricPrompt.authenticate(
mCancellationSignal,
mainExecutor,
mAuthenticationCallback
)
} else {
queue.add(false)
}
return queue.poll(5, TimeUnit.MINUTES) ?: false
}
fun storageRoot(): String {
return Environment.getExternalStorageDirectory().absolutePath
}
private fun downloadsDir(): File {
return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
?: throw java.lang.IllegalStateException()
}
private fun defaultAppDir(): File {
return File(downloadsDir(), "pic2acg")
}
private fun androidDefaultExportsDir(): File {
return File(defaultAppDir(), "exports")
}
private fun androidMkdirs(path: String) {
val dir = File(path)
if (!dir.exists()) {
dir.mkdirs()
}
}
private fun getNetworkType(): String {
val ctx = context ?: return "none"
val cm = ctx.getSystemService(ConnectivityManager::class.java) ?: return "none"
val active = cm.activeNetwork ?: return "none"
val caps = cm.getNetworkCapabilities(active) ?: return "none"
return when {
caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "mobile"
caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "wifi"
caps.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> "ethernet"
caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> findNonVpnTransport(cm) ?: "vpn"
else -> "other"
}
}
private fun isMobileNetwork(): Boolean {
val ctx = context ?: return false
val cm = ctx.getSystemService(ConnectivityManager::class.java) ?: return false
val active = cm.activeNetwork ?: return false
val caps = cm.getNetworkCapabilities(active) ?: return false
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
return true
}
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
return findNonVpnTransport(cm) == "mobile"
}
return false
}
private fun findNonVpnTransport(cm: ConnectivityManager): String? {
for (network in cm.allNetworks) {
val caps = cm.getNetworkCapabilities(network) ?: continue
if (!caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
continue
}
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
continue
}
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
return "mobile"
}
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
return "wifi"
}
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
return "ethernet"
}
}
return null
}
}
================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.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>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowLayoutInDisplayCutoutMode" tools:ignore="NewApi">shortEdges</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<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>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowLayoutInDisplayCutoutMode" tools:ignore="NewApi">shortEdges</item>
</style>
</resources>
================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="opensource.pic2acg">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/build.gradle
================================================
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
#Fri Oct 29 09:53:43 CST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
================================================
FILE: android/settings.gradle
================================================
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
================================================
FILE: ci/cmd/check_asset/main.go
================================================
package main
import (
"ci/commons"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
// get ghToken
ghToken := os.Getenv("GITHUB_TOKEN")
if ghToken == "" {
println("Env ${GITHUB_TOKEN} is not set")
os.Exit(1)
}
// get version
version := commons.LoadVersion()
// get TARGET
target := os.Getenv("TARGET")
if target == "" {
println("Env ${TARGET} is not set")
os.Exit(1)
}
// get FLUTTER_VERSION
flutterVersion := os.Getenv("FLUTTER_VERSION")
if target == "" {
println("Env ${FLUTTER_VERSION} is not set")
os.Exit(1)
}
// get BRANCH
branch := os.Getenv("BRANCH")
if target == "" {
println("Env ${BRANCH} is not set")
os.Exit(1)
}
//
var releaseFileName = commons.AssetName(version, flutterVersion, target, branch)
// get version
githubRepository := os.Getenv("GITHUB_REPOSITORY")
if githubRepository == "" {
println("Env ${GITHUB_REPOSITORY} is not set")
os.Exit(1)
}
getReleaseRequest, err := http.NewRequest(
"GET",
fmt.Sprintf("https://api.github.com/repos/%v/releases/tags/%v", githubRepository, version.Code),
nil,
)
if err != nil {
panic(err)
}
getReleaseRequest.Header.Set("User-Agent", commons.Ua)
getReleaseRequest.Header.Set("Authorization", "token "+ghToken)
getReleaseResponse, err := http.DefaultClient.Do(getReleaseRequest)
if err != nil {
panic(err)
}
defer getReleaseResponse.Body.Close()
if getReleaseResponse.StatusCode == 404 {
panic("NOT FOUND RELEASE")
}
buff, err := ioutil.ReadAll(getReleaseResponse.Body)
if err != nil {
panic(err)
}
var release commons.Release
err = json.Unmarshal(buff, &release)
if err != nil {
println(string(buff))
panic(err)
}
for _, asset := range release.Assets {
if asset.Name == releaseFileName {
println("::set-output name=skip_build::true")
os.Exit(0)
}
}
print("::set-output name=skip_build::false")
}
================================================
FILE: ci/cmd/check_asset_core/main.go
================================================
package main
import (
"ci/commons"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
// get ghToken
ghToken := os.Getenv("GITHUB_TOKEN")
if ghToken == "" {
println("Env ${GITHUB_TOKEN} is not set")
os.Exit(1)
}
// get version
version := commons.LoadVersion()
// get TARGET
target := os.Getenv("TARGET")
if target == "" {
println("Env ${TARGET} is not set")
os.Exit(1)
}
//
var releaseFileName = fmt.Sprintf("core-%v-%v.zip", version.Code, target)
// get version
githubRepository := os.Getenv("GITHUB_REPOSITORY")
if githubRepository == "" {
println("Env ${GITHUB_REPOSITORY} is not set")
os.Exit(1)
}
getReleaseRequest, err := http.NewRequest(
"GET",
fmt.Sprintf("https://api.github.com/repos/%v/releases/tags/%v", githubRepository, version.Code),
nil,
)
if err != nil {
panic(err)
}
getReleaseRequest.Header.Set("User-Agent", commons.Ua)
getReleaseRequest.Header.Set("Authorization", "token "+ghToken)
getReleaseResponse, err := http.DefaultClient.Do(getReleaseRequest)
if err != nil {
panic(err)
}
defer getReleaseResponse.Body.Close()
if getReleaseResponse.StatusCode == 404 {
panic("NOT FOUND RELEASE")
}
buff, err := ioutil.ReadAll(getReleaseResponse.Body)
if err != nil {
panic(err)
}
var release commons.Release
err = json.Unmarshal(buff, &release)
if err != nil {
println(string(buff))
panic(err)
}
for _, asset := range release.Assets {
if asset.Name == releaseFileName {
println("::set-output name=skip_build::true")
os.Exit(0)
}
}
print("::set-output name=skip_build::false")
}
================================================
FILE: ci/cmd/check_release/main.go
================================================
package main
import (
"bytes"
"ci/commons"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
// get ghToken
ghToken := os.Getenv("GITHUB_TOKEN")
if ghToken == "" {
println("Env ${GITHUB_TOKEN} is not set")
os.Exit(1)
}
// get version
version := commons.LoadVersion()
// get version
githubRepository := os.Getenv("GITHUB_REPOSITORY")
if githubRepository == "" {
println("Env ${GITHUB_REPOSITORY} is not set")
os.Exit(1)
}
getReleaseRequest, err := http.NewRequest(
"GET",
fmt.Sprintf("https://api.github.com/repos/%v/releases/tags/%v", githubRepository, version.Code),
nil,
)
if err != nil {
panic(nil)
}
getReleaseRequest.Header.Set("User-Agent", commons.Ua)
getReleaseRequest.Header.Set("Authorization", "token "+ghToken)
getReleaseResponse, err := http.DefaultClient.Do(getReleaseRequest)
if err != nil {
panic(nil)
}
defer getReleaseResponse.Body.Close()
if getReleaseResponse.StatusCode == 404 {
url := fmt.Sprintf("https://api.github.com/repos/%v/releases", githubRepository)
body := map[string]interface{}{
"tag_name": version.Code,
"target_commitish": commons.MainBranch,
"name": version.Code,
"body": version.Info,
}
var buff []byte
buff, err = json.Marshal(&body)
if err != nil {
panic(err)
}
var createReleaseRequest *http.Request
createReleaseRequest, err = http.NewRequest("POST", url, bytes.NewBuffer(buff))
if err != nil {
panic(nil)
}
createReleaseRequest.Header.Set("User-Agent", commons.Ua)
createReleaseRequest.Header.Set("Authorization", "token "+ghToken)
var createReleaseResponse *http.Response
createReleaseResponse, err = http.DefaultClient.Do(createReleaseRequest)
if err != nil {
panic(nil)
}
defer createReleaseResponse.Body.Close()
if createReleaseResponse.StatusCode != 201 {
buff, err = ioutil.ReadAll(createReleaseResponse.Body)
if err != nil {
panic(err)
}
println(string(buff))
panic("NOT 201")
}
}
}
================================================
FILE: ci/cmd/send_to_community/main.go
================================================
package main
import (
"ci/commons"
"context"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
"github.com/andersfylling/disgord"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
func main() {
// get version
var version commons.Version
codeFile, err := ioutil.ReadFile("version.code.txt")
if err != nil {
panic(err)
}
version.Code = strings.TrimSpace(string(codeFile))
infoFile, err := ioutil.ReadFile("version.info.txt")
if err != nil {
panic(err)
}
version.Info = strings.TrimSpace(string(infoFile))
// message
githubRepository := os.Getenv("GITHUB_REPOSITORY")
if githubRepository == "" {
println("Env ${GITHUB_REPOSITORY} is not set")
os.Exit(1)
}
var message = fmt.Sprintf(
"%v 版本 %v 发布! \n\n"+
"更新内容:\n"+
"%v\n\n"+
"https://github.com/%v/%v/releases/tag/%v",
githubRepository, version.Code, version.Info, githubRepository, githubRepository, version.Code,
)
// get accounts
tgToken := os.Getenv("TG_BOT_TOKEN")
tgChatIdsStr := os.Getenv("TG_CHAT_IDS")
discordToken := os.Getenv("DISCORD_BOT_TOKEN")
discordChatIdsStr := os.Getenv("DISCORD_CHAT_IDS")
if tgToken != "" && tgChatIdsStr != "" {
var tgChatIds []int64
json.Unmarshal([]byte(tgChatIdsStr), &tgChatIds)
if len(tgChatIds) > 0 {
sendMessageToTg(tgToken, tgChatIds, message)
}
}
if discordToken != "" && discordChatIdsStr != "" {
var discordChatIds []uint64
json.Unmarshal([]byte(discordChatIdsStr), &discordChatIds)
if len(discordChatIds) > 0 {
sendMessageToDiscord(discordToken, discordChatIds, message)
}
}
}
func sendMessageToTg(token string, ids []int64, message string) {
bot, err := tgbotapi.NewBotAPI(token)
if err != nil {
log.Panic(err)
}
for _, id := range ids {
msg := tgbotapi.NewMessage(id, message)
_, err = bot.Send(msg)
if err != nil {
fmt.Sprintf("Send message to tg chat : %v (error : %v)", id, err.Error())
} else {
fmt.Sprintf("Send message to tg chat : %v (success)", id)
}
}
}
func sendMessageToDiscord(token string, ids []uint64, message string) {
client, err := disgord.NewClient(context.Background(), disgord.Config{
BotToken: token,
})
if err != nil {
fmt.Sprintf("discord login failed : %v", err.Error())
return
}
for _, id := range ids {
_, err = client.SendMsg(disgord.Snowflake(id), message)
if err != nil {
fmt.Sprintf("Send message to tg chat : %v (error : %v)", id, err.Error())
} else {
fmt.Sprintf("Send message to tg chat : %v (success)", id)
}
}
}
================================================
FILE: ci/cmd/upload_asset/main.go
================================================
package main
import (
"ci/commons"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"path"
)
func main() {
// get ghToken
ghToken := os.Getenv("GITHUB_TOKEN")
if ghToken == "" {
println("Env ${GITHUB_TOKEN} is not set")
os.Exit(1)
}
// get version
version := commons.LoadVersion()
// get TARGET
target := os.Getenv("TARGET")
if target == "" {
println("Env ${TARGET} is not set")
os.Exit(1)
}
// get FLUTTER_VERSION
flutterVersion := os.Getenv("FLUTTER_VERSION")
if target == "" {
println("Env ${FLUTTER_VERSION} is not set")
os.Exit(1)
}
// get BRANCH
branch := os.Getenv("BRANCH")
if target == "" {
println("Env ${BRANCH} is not set")
os.Exit(1)
}
//
var releaseFileName = commons.AssetName(version, flutterVersion, target, branch)
//
var releaseFilePath string
var contentType string
var contentLength int64
switch target {
case "macos":
releaseFilePath = "build/build.dmg"
contentType = "application/octet-stream"
case "ios":
releaseFilePath = "build/nosign.ipa"
contentType = "application/octet-stream"
case "windows":
releaseFilePath = "build/build.zip"
contentType = "application/octet-stream"
case "linux":
releaseFilePath = "build/build.AppImage"
contentType = "application/octet-stream"
case "android-arm32":
releaseFilePath = "build/app/outputs/flutter-apk/app-release.apk"
contentType = "application/octet-stream"
case "android-arm64":
releaseFilePath = "build/app/outputs/flutter-apk/app-release.apk"
contentType = "application/octet-stream"
case "android-x86_64":
releaseFilePath = "build/app/outputs/flutter-apk/app-release.apk"
contentType = "application/octet-stream"
}
releaseFilePath = path.Join("..", releaseFilePath)
info, err := os.Stat(releaseFilePath)
if err != nil {
panic(err)
}
contentLength = info.Size()
if contentLength == 166 {
panic("NOT FOUND RELEASE FILE")
}
// get githubRepository
githubRepository := os.Getenv("GITHUB_REPOSITORY")
if githubRepository == "" {
println("Env ${GITHUB_REPOSITORY} is not set")
os.Exit(1)
}
// get version
getReleaseRequest, err := http.NewRequest(
"GET",
fmt.Sprintf("https://api.github.com/repos/%v/releases/tags/%v", githubRepository, version.Code),
nil,
)
if err != nil {
panic(err)
}
getReleaseRequest.Header.Set("User-Agent", commons.Ua)
getReleaseRequest.Header.Set("Authorization", "token "+ghToken)
getReleaseResponse, err := http.DefaultClient.Do(getReleaseRequest)
if err != nil {
panic(err)
}
defer getReleaseResponse.Body.Close()
if getReleaseResponse.StatusCode == 404 {
panic("NOT FOUND RELEASE")
}
buff, err := ioutil.ReadAll(getReleaseResponse.Body)
if err != nil {
panic(err)
}
var release commons.Release
err = json.Unmarshal(buff, &release)
if err != nil {
println(string(buff))
panic(err)
}
file, err := os.Open(releaseFilePath)
if err != nil {
panic(err)
}
defer file.Close()
uploadUrl := fmt.Sprintf("https://uploads.github.com/repos/%v/releases/%v/assets?name=%v", githubRepository, release.Id, releaseFileName)
uploadRequest, err := http.NewRequest("POST", uploadUrl, file)
if err != nil {
panic(err)
}
uploadRequest.Header.Set("User-Agent", commons.Ua)
uploadRequest.Header.Set("Authorization", "token "+ghToken)
uploadRequest.Header.Set("Content-Type", contentType)
uploadRequest.ContentLength = contentLength
uploadResponse, err := http.DefaultClient.Do(uploadRequest)
if err != nil {
panic(err)
}
if uploadResponse.StatusCode != 201 {
buff, err = ioutil.ReadAll(uploadResponse.Body)
if err != nil {
panic(err)
}
println(string(buff))
panic("NOT 201")
}
}
================================================
FILE: ci/cmd/upload_asset_core/main.go
================================================
package main
import (
"ci/commons"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"path"
)
func main() {
// get ghToken
ghToken := os.Getenv("GITHUB_TOKEN")
if ghToken == "" {
println("Env ${GITHUB_TOKEN} is not set")
os.Exit(1)
}
// get version
version := commons.LoadVersion()
// get TARGET
target := os.Getenv("TARGET")
if target == "" {
println("Env ${TARGET} is not set")
os.Exit(1)
}
//
var releaseFileName = fmt.Sprintf("core-%v-%v.zip", version.Code, target)
var releaseFilePath = "core.zip"
var contentLength int64
releaseFilePath = path.Join("..", releaseFilePath)
info, err := os.Stat(releaseFilePath)
if err != nil {
panic(err)
}
contentLength = info.Size()
// get version
githubRepository := os.Getenv("GITHUB_REPOSITORY")
if githubRepository == "" {
println("Env ${GITHUB_REPOSITORY} is not set")
os.Exit(1)
}
getReleaseRequest, err := http.NewRequest(
"GET",
fmt.Sprintf("https://api.github.com/repos/%v/releases/tags/%v", githubRepository, version.Code),
nil,
)
if err != nil {
panic(err)
}
getReleaseRequest.Header.Set("User-Agent", commons.Ua)
getReleaseRequest.Header.Set("Authorization", "token "+ghToken)
getReleaseResponse, err := http.DefaultClient.Do(getReleaseRequest)
if err != nil {
panic(err)
}
defer getReleaseResponse.Body.Close()
if getReleaseResponse.StatusCode == 404 {
panic("NOT FOUND RELEASE")
}
buff, err := ioutil.ReadAll(getReleaseResponse.Body)
if err != nil {
panic(err)
}
var release commons.Release
err = json.Unmarshal(buff, &release)
if err != nil {
println(string(buff))
panic(err)
}
file, err := os.Open(releaseFilePath)
if err != nil {
panic(err)
}
defer file.Close()
uploadUrl := fmt.Sprintf("https://uploads.github.com/repos/%v/releases/%v/assets?name=%v", githubRepository, release.Id, releaseFileName)
uploadRequest, err := http.NewRequest("POST", uploadUrl, file)
if err != nil {
panic(err)
}
uploadRequest.Header.Set("User-Agent", commons.Ua)
uploadRequest.Header.Set("Authorization", "token "+ghToken)
uploadRequest.Header.Set("Content-Type", "application/octet-stream")
uploadRequest.ContentLength = contentLength
uploadResponse, err := http.DefaultClient.Do(uploadRequest)
if err != nil {
panic(err)
}
if uploadResponse.StatusCode != 201 {
buff, err = ioutil.ReadAll(uploadResponse.Body)
if err != nil {
panic(err)
}
println(string(buff))
panic("NOT 201")
}
}
================================================
FILE: ci/commons/funcs.go
================================================
package commons
import (
"fmt"
"io/ioutil"
"strings"
)
const Ua = "pikapika ci"
const MainBranch = "master"
func LoadVersion() Version {
var version Version
codeFile, err := ioutil.ReadFile("version.code.txt")
if err != nil {
panic(err)
}
version.Code = strings.TrimSpace(string(codeFile))
infoFile, err := ioutil.ReadFile("version.info.txt")
if err != nil {
panic(err)
}
version.Info = strings.TrimSpace(string(infoFile))
return version
}
func AssetName(version Version, flutterVersion, target, branch string) string {
releaseFileName := fmt.Sprintf("pikapika-%v", version.Code)
switch target {
case "macos":
releaseFileName += "-macos-intel"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".dmg"
case "ios":
releaseFileName += "-ios_nosign"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".ipa"
case "windows":
releaseFileName += "-windows-x86_64"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".zip"
case "linux":
releaseFileName += "-linux-x86_64"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".AppImage"
case "android-arm32":
releaseFileName += "-android-arm32"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".apk"
case "android-arm64":
releaseFileName += "-android-arm64"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".apk"
case "android-x86_64":
releaseFileName += "-android-x86_64"
releaseFileName += "-flutter_" + flutterVersion
releaseFileName += ".apk"
}
if branch != "master" && branch != "main" {
releaseFileName = branch + "-" + releaseFileName
}
return releaseFileName
}
================================================
FILE: ci/commons/types.go
================================================
package commons
import "time"
type Version struct {
Code string `json:"code"`
Info string `json:"info"`
}
type Release struct {
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
AssetsUrl string `json:"assets_url"`
UploadUrl string `json:"upload_url"`
TarballUrl string `json:"tarball_url"`
ZipballUrl string `json:"zipball_url"`
DiscussionUrl string `json:"discussion_url"`
Id int `json:"id"`
NodeId string `json:"node_id"`
TagName string `json:"tag_name"`
TargetCommitish string `json:"target_commitish"`
Name string `json:"name"`
Body string `json:"body"`
Draft bool `json:"draft"`
Prerelease bool `json:"prerelease"`
CreatedAt time.Time `json:"created_at"`
PublishedAt time.Time `json:"published_at"`
Author struct {
Login string `json:"login"`
Id int `json:"id"`
NodeId string `json:"node_id"`
AvatarUrl string `json:"avatar_url"`
GravatarId string `json:"gravatar_id"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
SiteAdmin bool `json:"site_admin"`
} `json:"author"`
Assets []struct {
Url string `json:"url"`
BrowserDownloadUrl string `json:"browser_download_url"`
Id int `json:"id"`
NodeId string `json:"node_id"`
Name string `json:"name"`
Label string `json:"label"`
State string `json:"state"`
ContentType string `json:"content_type"`
Size int `json:"size"`
DownloadCount int `json:"download_count"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Uploader struct {
Login string `json:"login"`
Id int `json:"id"`
NodeId string `json:"node_id"`
AvatarUrl string `json:"avatar_url"`
GravatarId string `json:"gravatar_id"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
SiteAdmin bool `json:"site_admin"`
} `json:"uploader"`
} `json:"assets"`
}
================================================
FILE: ci/go.mod
================================================
module ci
go 1.17
require (
github.com/andersfylling/disgord v0.35.1
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
)
require (
github.com/andersfylling/snowflake/v5 v5.0.1 // indirect
github.com/klauspost/compress v1.15.1 // indirect
go.uber.org/atomic v1.9.0 // indirect
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 // indirect
nhooyr.io/websocket v1.8.7 // indirect
)
================================================
FILE: ci/go.sum
================================================
github.com/andersfylling/disgord v0.35.1 h1:auhxW9z96/uSF7MYwfuv8AP71AVIc0+jZQWjZdwIqNE=
github.com/andersfylling/disgord v0.35.1/go.mod h1:gTzujw2mWxJWxAPo3LwxG5+a4/n4ikdD+JMb1mONmUM=
github.com/andersfylling/snowflake/v5 v5.0.1 h1:unXbYSij6tRCGJzoLz9zl3nJsqd9hu7bbYSgB8K8/i0=
github.com/andersfylling/snowflake/v5 v5.0.1/go.mod h1:AdhrB+kewjnQInv8cR7ABe2SGoVXh79njnipUnz1HFc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
================================================
FILE: ci/linux_font.yaml
================================================
fonts:
- family: Roboto
fonts:
- asset: fonts/Roboto.ttf
================================================
FILE: ci/version.code.txt
================================================
v1.8.19
================================================
FILE: ci/version.info.txt
================================================
v1.8.19
================================================
FILE: ios/.gitignore
================================================
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
================================================
FILE: ios/Flutter/AppFrameworkInfo.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>
================================================
FILE: ios/Flutter/Debug.xcconfig
================================================
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
================================================
FILE: ios/Flutter/Release.xcconfig
================================================
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
================================================
FILE: ios/Podfile
================================================
# Uncomment this line to define a global platform for your project
# platform :ios, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "11.0"
end
end
end
================================================
FILE: ios/Runner/AppDelegate.swift
================================================
import UIKit
import Flutter
import Mobile
import LocalAuthentication
import Network
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
private let networkMonitor = NWPathMonitor()
private var latestPath: NWPath?
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let applicationSupportsPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)[0]
MobileMigration(documentsPath, applicationSupportsPath)
MobileInitApplication(applicationSupportsPath)
let monitorQueue = DispatchQueue(label: "network.monitor")
networkMonitor.pathUpdateHandler = { [weak self] path in
self?.latestPath = path
}
networkMonitor.start(queue: monitorQueue)
let controller = self.window.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel.init(name: "method", binaryMessenger: controller as! FlutterBinaryMessenger)
channel.setMethodCallHandler { (call, result) in
Thread {
if call.method == "flatInvoke" {
if let args = call.arguments as? Dictionary<String, Any>,
let method = args["method"] as? String,
let params = args["params"] as? String{
var error: NSError?
let data = MobileFlatInvoke(method, params, &error)
if error != nil {
result(FlutterError(code: "", message: error?.localizedDescription, details: ""))
}else{
result(data)
}
}else{
result(FlutterError(code: "", message: "params error", details: ""))
}
}
else if call.method == "verifyAuthentication"{
let context = LAContext()
let can = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil)
guard can == true else {
result(false)
return
}
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "身份验证") { (success, error) in
result(success)
}
}
else if call.method == "iosSaveFileToImage"{
if let args = call.arguments as? Dictionary<String, Any>,
let path = args["path"] as? String{
do {
let fileURL: URL = URL(fileURLWithPath: path)
let imageData = try Data(contentsOf: fileURL)
if let uiImage = UIImage(data: imageData) {
UIImageWriteToSavedPhotosAlbum(uiImage, nil, nil, nil)
result("OK")
}else{
result(FlutterError(code: "", message: "Error loading image ", details: ""))
}
} catch {
result(FlutterError(code: "", message: "Error loading image : \(error)", details: ""))
}
}else{
result(FlutterError(code: "", message: "params error", details: ""))
}
}
else if call.method == "iosGetDocumentDir" {
result(documentsPath)
}
else if call.method == "dataLocal" {
result(applicationSupportsPath)
}
else if call.method == "fontList" {
result(UIFont.familyNames)
}
else {
result(FlutterMethodNotImplemented)
}
}.start()
}
let networkChannel = FlutterMethodChannel(name: "network", binaryMessenger: controller as! FlutterBinaryMessenger)
networkChannel.setMethodCallHandler { [weak self] call, result in
let path = self?.latestPath ?? self?.networkMonitor.currentPath
guard let path = path, path.status == .satisfied else {
result(call.method == "getIsMobile" ? false : "none")
return
}
if call.method == "getIsMobile" {
result(path.usesInterfaceType(.cellular))
return
}
guard call.method == "getNetworkType" else {
result(FlutterMethodNotImplemented)
return
}
if path.usesInterfaceType(.wifi) {
result("wifi")
return
}
if path.usesInterfaceType(.cellular) {
result("mobile")
return
}
if path.usesInterfaceType(.wiredEthernet) {
result("ethernet")
return
}
result("other")
}
//
let eventChannel = FlutterEventChannel.init(name: "flatEvent", binaryMessenger: controller as! FlutterBinaryMessenger)
class EventChannelHandler:NSObject, FlutterStreamHandler {
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
objc_sync_enter(mutex)
sink = events
objc_sync_exit(mutex)
return nil
}
func onCancel(withArguments arguments: Any?) -> FlutterError? {
objc_sync_enter(mutex)
sink = nil
objc_sync_exit(mutex)
return nil
}
}
class EventNotifyHandler:NSObject, MobileEventNotifyHandlerProtocol {
func onNotify(_ message: String?) {
objc_sync_enter(mutex)
if sink != nil {
sink?(message)
}
objc_sync_exit(mutex)
}
}
eventChannel.setStreamHandler(EventChannelHandler.init())
MobileEventNotify(EventNotifyHandler.init())
//
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
var sink : FlutterEventSink?
let mutex = NSObject.init()
================================================
FILE: ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
================================================
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
================================================
FILE: ios/Runner/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
================================================
FILE: ios/Runner/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
================================================
FILE: ios/Runner/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>pikapika</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>PKZ Archive</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>opensource.pkz</string>
<string>pkz</string>
</array>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>zh_TW</string>
<string>zh_CN</string>
<string>en_US</string>
<string>ja_JP</string>
<string>ko_KR</string>
</array>
<key>CFBundleName</key>
<string>pikapika</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>pika</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.entertainment</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>NSFaceIDUsageDescription</key>
<string>Authenticating using face id</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Save images</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Usage images</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
<string>public.content</string>
<string>com.apple.package</string>
</array>
<key>UTTypeDescription</key>
<string>PKZ Archive</string>
<key>UTTypeIdentifier</key>
<string>opensource.pkz</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>pkz</string>
<string>pki</string>
<string>zip</string>
</array>
<key>public.mime-type</key>
<array>
<string>text/vnd.opensource.pkz</string>
<string>text/vnd.opensource.pki</string>
<string>text/vnd.opensource.zip</string>
</array>
</dict>
</dict>
</array>
</dict>
</plist>
================================================
FILE: ios/Runner/Runner-Bridging-Header.h
================================================
#import "GeneratedPluginRegistrant.h"
================================================
FILE: ios/Runner.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
0E44DEFD92B805627806403C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 605DB0C59210B25A843453FD /* Pods_Runner.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
DD1F548D273CB9A900B04493 /* Mobile.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD1F548C273CB9A900B04493 /* Mobile.xcframework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1001C50AAB0DFA884ACAD48C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3742BDBA4B7EA3162E2CDC75 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
605DB0C59210B25A843453FD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CA7EB5DA1FDE22BAC5B01D77 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
DD1F548C273CB9A900B04493 /* Mobile.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Mobile.xcframework; path = ../go/mobile/lib/Mobile.xcframework; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0E44DEFD92B805627806403C /* Pods_Runner.framework in Frameworks */,
DD1F548D273CB9A900B04493 /* Mobile.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
6CBB90743F7578DFC9C6BF75 /* Pods */ = {
isa = PBXGroup;
children = (
3742BDBA4B7EA3162E2CDC75 /* Pods-Runner.debug.xcconfig */,
1001C50AAB0DFA884ACAD48C /* Pods-Runner.release.xcconfig */,
CA7EB5DA1FDE22BAC5B01D77 /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
DD1F548C273CB9A900B04493 /* Mobile.xcframework */,
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
6CBB90743F7578DFC9C6BF75 /* Pods */,
F6DB48AA376F5D49016BEA7A /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
F6DB48AA376F5D49016BEA7A /* Frameworks */ = {
isa = PBXGroup;
children = (
605DB0C59210B25A843453FD /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
6D683F8ECDB7CFFB7E7E554B /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
774454864019DA9867B5A218 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
6D683F8ECDB7CFFB7E7E554B /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
774454864019DA9867B5A218 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "../go/mobile/lib/**";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 43;
DEVELOPMENT_TEAM = SSSSSSSSSS;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.8.19;
PRODUCT_BUNDLE_IDENTIFIER = opensource.pikapika;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = "../go/mobile/lib/**";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
FRAMEWORK_SEARCH_PATHS = "../go/mobile/lib/**";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 43;
DEVELOPMENT_TEAM = SSSSSSSSSS;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.8.19;
PRODUCT_BUNDLE_IDENTIFIER = opensource.pikapika;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 43;
DEVELOPMENT_TEAM = SSSSSSSSSS;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.8.19;
PRODUCT_BUNDLE_IDENTIFIER = opensource.pikapika;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: ios/Runner.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
================================================
FILE: lib/assets/translations/en-US.json
================================================
{
"language": {
"title": "Language",
"name": "English - United States"
},
"app": {
"categories": "Categories",
"my": "My",
"copied_to_clipboard": "Copied to clipboard",
"not_supported_platform": "Not supported platform",
"cancel": "Cancel",
"confirm": "Confirm",
"save_cancel": "Save canceled",
"save_success": "Save success",
"save_failed": "Save failed",
"pro": "Pro",
"pro_required": "Please upgrade to Pro to use this feature",
"choose_folder": "Choose a folder to save the file",
"permission_denied": "Permission denied",
"loading": "Loading",
"error": "Error",
"pat": {
"success": "Your sponsor login success, please return",
"title": "Replace PAT account"
},
"previous_page": "Previous page",
"next_page": "Next page",
"page": "Page",
"please_enter_page_number": "Please enter page number:",
"select_all": "Select all",
"load_failed": "Load failed",
"all": "All",
"delete": "Delete",
"save_image": "Save image",
"preview_image": "Preview image",
"please_select": "Please select",
"refresh": "Refresh",
"initializing": "Initializing",
"like_failed": "Like failed",
"network_error": "Network error, please check your network",
"no_permission": "No permission or path is not available",
"check_device_time": "Please check your device time",
"resource_not_available": "Resource not available",
"something_went_wrong": "Something went wrong",
"click_refresh": "Click refresh",
"pull_down_refresh": "Pull down refresh",
"continue_reading": "Continue reading",
"start_reading": "Start reading",
"image_crop": "Image crop",
"download": "Download",
"download_failed": "Download failed",
"download_finished": "Download finished",
"downloading": "Downloading",
"queue": "Queue",
"deleting": "Deleting",
"please_select_comic": "Please select comic",
"please_choose": "Please choose",
"last_viewed": "Last viewed",
"auto_punch": "Auto punch",
"yes": "Yes",
"no": "No",
"confirm_download": "Confirm download",
"copy": "Copy"
},
"net": {
"no_address": "No address",
"address": "Address",
"address_sync": "Address sync",
"address_sync_from_server": "Get the latest address from the server",
"address_sync_reset": "Reset the address to the default value",
"address_sync_success": "Address sync success",
"address_sync_failed": "Address sync failed",
"address_sync_reset_success": "Address sync reset success",
"address_sync_reset_failed": "Address sync reset failed",
"choose_address": "Choose address",
"image_address": "Image address",
"use_api_load_image": "Use API to load image",
"ping_testing": "Testing",
"ping_failed": "Failed"
},
"categories": {
"all": "All",
"recommend": "Recommend",
"rankings": "Rankings",
"random": "Random",
"game": "Game"
},
"settings": {
"settings": "Settings",
"interface": "Interface",
"network": "Network",
"seal": "Seal",
"interaction": "Interaction",
"reading": "Reading",
"download": "Downloads",
"auto_download_on_favorite": "Auto download on favorite",
"disable_auto_download_on_mobile": "Disable auto download on mobile data",
"auto_delete_download_on_unfavorite": "Auto delete download on unfavorite",
"web_server": "Web Server",
"web_server_subtitle": "Let devices in the local network view the downloaded comics through the browser",
"sync": "Sync",
"history_sync": "History Sync",
"local_favorite_sync_title": "Local Favorites Sync",
"use_local_favorite": "Use Local Favorites",
"use_local_favorite_desc": "Manage favorites locally with folder organization",
"account": "Account",
"modify_password": "Modify password",
"ebook": "E-book",
"system": "System",
"clear_cache": "Clear cache",
"migrate": "Migrate",
"migrate_subtitle": "Change your data folder to the memory card",
"migrate_confirm": "This feature will be saved after restarting the program, are you sure",
"app_orientation": {
"title": "App orientation",
"choose": "Choose app orientation",
"normal": "Normal",
"landscape": "Landscape",
"portrait": "Portrait"
},
"will_pop_notice": "Press the back key twice in a row to exit the app",
"android_secure_flag": "Disable screenshot/disable display in task view",
"android_display_mode": {
"title": "Screen refresh rate (Android)",
"dialog_title": "Android screen refresh rate \n(No high refresh in power saving mode)"
},
"authentication": "Authentication when entering the app (if the system has already entered the password or fingerprint)",
"set_password": "Set application password",
"auto_clean": {
"title": "Auto clean cache",
"one_month_ago": "One month ago",
"one_week_ago": "One week ago",
"one_day_ago": "One day ago",
"no_auto_clean": "No auto clean"
},
"categories_column_count": {
"title": "Categories column count",
"choose": "Choose categories column count",
"auto": "Auto"
},
"categories_sort": {
"title": "Categories sort"
},
"chooser_root": {
"title": "Chooser root",
"hint": "Enter the folder selector root path",
"desc": "The default path for selecting the directory when exporting, also the root path, you can try to set this option if the export is not normal"
},
"content_failed_reload_action": {
"title": "Content failed reload action",
"choose": "Choose content failed reload action",
"pull_down": "Pull down",
"touch_loader": "Touch loader"
},
"copy_full_name": {
"title": "Copy full name"
},
"copy_full_name_template": {
"title": "Copy full name template",
"hint": "Enter the copy full name template"
},
"copy_skip_confirm": {
"title": "Copy skip confirm"
},
"download_and_export_path": {
"title": "Download and export path",
"confirm": "Download and export",
"desc": "You will select a directory, if the file system is writable, the download will be automatically exported"
},
"download_cache_path": {
"title": "Download cache path",
"confirm": "Download cache",
"desc": "You will select a directory, this directory is copied from the following directory to use. The download will be read as a cache folder first.",
"cancel_desc": "Are you sure you want to cancel the function of downloading content acceleration with other software? You can set it again after canceling",
"import_view_log_from_off": {
"title": "Import other program's history record",
"desc": "You will select a file, this file is copied from the following path to use.",
"choose_file_dialog_title": "Choose the file to import"
}
},
"download_thread_count": {
"title": "Download thread count",
"choose": "Choose download thread count"
},
"ebook_scrolling": {
"title": "E-book scrolling UI"
},
"ebook_scrolling_range": {
"title": "E-book scrolling UI",
"desc": "Scrolling range",
"screen_height": "Screen height"
},
"ebook_scrolling_trigger": {
"title": "E-book scrolling UI",
"desc": "Trigger distance",
"cm": "cm"
},
"export_path": {
"ios_desc": "You can find the exported content in the file manager",
"ios_desc2": "You are using an iOS device:\nPlease open the system's built-in file manager to browse the exported content",
"export_path_desc": "Export path (click to modify)",
"android_desc": "You are using an Android device:\nIf the export fails and prompts insufficient permissions, you can try to create a subdirectory under Download or Document for export"
},
"export_rename": {
"title": "Export with renaming"
},
"yes": "Yes",
"no": "No",
"full_screen_action": {
"title": "Control method",
"choose": "Choose control method",
"touch_once": "Touch once to fullscreen",
"controller": "Use controller to fullscreen",
"touch_double": "Double click to fullscreen",
"touch_double_once_next": "Double click to fullscreen + click once to next page",
"three_area": "Divide the screen into three areas (previous page, next page, fullscreen)"
},
"full_screen_ui": {
"title": "Full screen UI",
"choose": "Choose full screen UI",
"no": "Not use",
"hidden_bottom": "Remove virtual controller",
"all": "Full screen"
},
"auto_full_screen": {
"title": "Enter reader automatically full screen"
},
"auto_full_screen_on_forward": {
"title": "Auto Fullscreen on Forward"
},
"ignore_info_history": {
"title": "Ignore info history"
},
"icon_loading": {
"title": "Minimize UI animation"
},
"ignore_upgrade_confirm": {
"title": "Close upgrade popup"
},
"hidden_fd_icon": {
"title": "Hide personal space's power icon"
},
"hidden_search_persion": {
"title": "Hide search by author"
},
"hidden_viewed": {
"title": "Hide viewed comics"
},
"hidden_sub_icon": {
"title": "Hide subscription"
},
"hide_online_favorite": {
"title": "Hide online favorites",
"desc": "Hide online favorites entry and favorite button"
},
"hidden_words": {
"title": "Hide by keyword",
"clear_all": "Confirm clear",
"clear_all_desc": "Are you sure you want to clear all keywords?",
"input_hint": "Enter the keyword to hide",
"no_words": "No keywords"
},
"image_address": {
"title": "Image address",
"pinging": "Pinging",
"failed": "Failed"
},
"image_filter": {
"title": "Reader image filter",
"normal": "Normal",
"gray": "Gray",
"brown": "Brown",
"choose": "Choose reader image filter"
},
"import_notice": {
"android_desc": "You are using an Android device:\nIf you cannot import and export and prompt insufficient permissions, you can try to create a subdirectory under Download or Document for import"
},
"keyboard_controller": {
"title": "Reader keyboard page (only PC)"
},
"list_layout": {
"choose": "Choose layout",
"info_card": "Info",
"only_image": "Cover",
"cover_and_title": "Cover + Title"
},
"local_history_sync": {
"sync_to_local": "Sync history to local",
"not_set": "Not set",
"sync_success": "Sync success",
"sync_failed": "Sync failed",
"auto_sync": "Auto sync history to local",
"auto_sync_desc": "After opening the application, the history will be automatically backed up",
"choose_dir": "Choose directory",
"clear_path": "Clear path",
"clear_path_desc": "Are you sure you want to clear the path?"
},
"local_favorite_sync": {
"auto_sync": "Auto sync local favorites",
"auto_sync_desc": "Auto sync local favorites with WebDAV",
"manual_sync": "Manual sync local favorites",
"sync_success": "Sync success",
"sync_failed": "Sync failed"
},
"no_animation": {
"title": "Cancel page animation (tap screen, volume key, keyboard)"
},
"pager_action": {
"title": "List page loading method",
"choose": "Choose list page loading method",
"controller": "Use button",
"stream": "Stream"
},
"proxy": {
"title": "Proxy server",
"hint": "Enter proxy server",
"desc": " ( e.g. socks5://127.0.0.1:1080/ ) ",
"no_proxy": "Not set"
},
"quality": {
"title": "Image quality when browsing",
"choose": "Choose image quality",
"original": "Original",
"low": "Low",
"medium": "Medium",
"high": "High"
},
"reader_background_color": {
"title": "Reader background color",
"choose": "Choose reader background color",
"black": "Black",
"gray": "Gray",
"white": "White"
},
"reader_direction": {
"title": "Reader direction",
"choose": "Choose reader direction",
"top_to_bottom": "Top to bottom",
"left_to_right": "Left to right",
"right_to_left": "Right to left"
},
"reader_scroll_by_screen_percentage": {
"title": "Flip distance by distance",
"screen_size": "Screen size"
},
"web_toon_scroll_mode": {
"title": "WebToon Flip Mode",
"choose": "Choose WebToon Flip Mode",
"image": "Image",
"screen": "Distance"
},
"reader_zoom": {
"out_title": "Zoom out multiplier (min scale)",
"in_title": "Zoom in multiplier (max scale)",
"double_tap_title": "Double tap zoom scale"
},
"drag_region_lock": {
"title": "Lock Drag Boundary"
},
"gesture_speed": {
"title": "Gesture Speed Multiplier"
},
"reader_slider_position": {
"title": "Slider position",
"choose": "Choose slider position",
"bottom": "Bottom",
"right": "Right",
"left": "Left"
},
"reader_two_page_direction": {
"title": "Two page reader content arrangement",
"choose": "Choose two page reader content arrangement",
"close_to": "Close to",
"pull_away": "Pull away",
"each_centered": "Each centered"
},
"reader_type": {
"title": "Reader mode",
"choose": "Choose reader mode",
"web_toon": "WebToon (Default)",
"web_toon_zoom": "WebToon (Double click to zoom)",
"gallery": "Gallery",
"web_toon_free_zoom": "WebToon (ListView double click to zoom)\n(This mode progress bar is invalid)",
"two_page_gallery": "Two page mode\n(Experimental)",
"left_to_right": "Left to right",
"right_to_left": "Right to left",
"two_page_direction": "Two page direction",
"two_page_direction_choose": "Choose two page direction"
},
"shadow_categories": {
"title": "Seal",
"search_hint": "Search"
},
"shadow_categories_mode": {
"title": "Seal mode",
"black_list": "Black list",
"white_list": "White list"
},
"startup_pic": {
"title": "Set startup picture",
"subtitle": "Set the picture displayed when the application starts",
"clear_title": "Clear startup picture",
"clear_subtitle": "Clear the picture displayed when the application starts",
"clear_success": "Startup picture cleared",
"update_success": "Startup picture updated"
},
"show_comment_at_download": {
"title": "Show comment at download"
},
"font": {
"title": "Font",
"hint": "Please enter the font",
"input_hint": "Please enter the font name and use English commas to separate, for example \"Songti, Heiti\", if you save it and it doesn't change, it means the font cannot be used or the name is wrong, you can refer to C:\\Windows\\Fonts to find your font. If you are using the flutter2 engine version, only the first font will take effect.",
"choose_hint": "You need to select multiple fonts until you click the background area"
},
"theme": {
"origin": "Origin",
"pink": "Pink",
"black": "Black",
"dark": "Dark",
"dusty_blue": "Dusty blue",
"dark_black": "Dark black",
"choose_theme": "Choose theme",
"book": "Book",
"enable_status_bar_color": "Enable status bar color",
"enable_status_restart_hint": "When disabled, you need to restart the application to refresh the status bar color"
},
"three_keep_right": {
"title": "Three area mode page always to the right"
},
"time_zone": {
"title": "Time zone"
},
"timeout_lock": {
"title": "Auto lock",
"notice": "Note: Auto lock only supports timeout after minimizing on desktop, and supports timeout after background and screen lock on mobile. If no password is set, auto lock is invalid. Android and desktop only lock the desktop, not the download, iOS is not tested, you need to manually enable background activity.",
"1_hour": "One hour",
"10_minutes": "Ten minutes",
"3_minutes": "Three minutes",
"1_minute": "One minute",
"10_seconds": "Ten seconds",
"1_second": "One second",
"no_lock": "No lock"
},
"using_right_click_pop": {
"title": "Mouse right click to return to the previous page"
},
"volume_controller": {
"title": "Reader volume button page turn"
},
"volume_next_chapter": {
"title": "Double click volume/keyboard/controller to next chapter"
},
"webdav": {
"title": "WebDav",
"not_set": "Not set",
"path": "WebDav path",
"path_hint": "Please enter the WebDav path",
"username": "WebDav username",
"username_hint": "Please enter the WebDav username",
"password": "WebDav password",
"password_hint": "Please enter the WebDav password",
"auto_sync_history_to_webdav": "Auto sync history to WebDav",
"sync_history_to_webdav": "Sync history to WebDAV",
"upload_history_to_webdav": "Upload history to WebDAV",
"upload_history_to_webdav_desc": "If there are multiple devices, please note the automatic synchronization function",
"sync_success": "Sync success",
"sync_failed": "Sync failed"
}
},
"local_favorite": {
"title": "Local Favorites",
"all_folders": "All",
"new_folder": "New Folder",
"select_mode": "Select",
"cancel_select_mode": "Cancel select",
"select_all": "Select all",
"delete_folder": "Delete Folder",
"move_to_folder": "Move to Folder",
"remove_selected": "Remove selected",
"remove_selected_confirm": "Remove selected comics from local favorites?",
"remove_selected_success": "Removed",
"remove_selected_failed": "Remove failed",
"select_comics": "Please select comics first",
"folder_limit_reached": "Free version allows up to 3 folders. Upgrade to Pro for unlimited folders",
"batch_download": "Batch Download",
"select_folder": "Select Folder",
"folder_name": "Folder Name",
"delete_confirm": "Confirm delete folder?",
"empty_folder": "No favorites yet",
"no_folders": "No folders yet, please create one first",
"remove_confirm_title": "Remove from Favorites",
"remove_confirm_content": "Are you sure you want to remove this comic from local favorites?",
"remove_failed": "Remove failed",
"load_failed": "Load failed",
"add_success": "Added to local favorites",
"add_failed": "Add failed",
"create_folder_failed": "Create folder failed",
"create_success": "Created successfully",
"delete_success": "Deleted successfully",
"delete_failed": "Delete failed",
"move_success": "Moved successfully",
"move_failed": "Move failed",
"select_comics_to_download": "Please select comics to download",
"download_started": "Download started",
"download_failed": "Download failed"
},
"screen": {
"about": {
"title": "About",
"version": "Software version",
"check_update": "Check update",
"tips": "Tips : \n1. The author/uploader/category/tag on the detail page can be clicked\n2. The author/uploader/title on the detail page can be copied by long press\n3. Using pagination instead of waterfall flow can quickly flip pages\n4. Download means caching to the local, you need to export to share\n5. Download long press can delete",
"download_new_version": "Please download the new version from the channel",
"no_new_version": "No new version detected",
"download_release_version": "Download RELEASE version",
"update_content": "Update content",
"go_to_release_repository": "Go to RELEASE repository"
},
"account": {
"title": "Account",
"username": "Username",
"username_hint": "Please enter the username",
"password": "Password",
"password_hint": "Please enter the password",
"no_account_register": "No account, I want to register",
"password_reset": "Password reset",
"check_username_password_or_network": "Please check the username and password or network environment",
"check_device_time": "Please check the device time",
"username_or_password_error": "Username or password error",
"login_failed": "Login failed",
"not_set": "Not set"
},
"app": {
"will_pop_notice": "Press the back key twice in a row to exit the app"
},
"categories": {
"search_hint": "Search"
},
"clean": {
"title": "Clean",
"cleaning": "Cleaning",
"clean_network_cache": "Clean network cache",
"clean_image_cache": "Clean image cache",
"clean_all_cache": "Clean all cache",
"clean_success": "Clean success",
"clean_failed": "Clean failed"
},
"close_app": {
"title": "Tips",
"close_app": "Please close the app and reopen"
},
"comic_collections": {
"no_resource": "There is no resource here"
},
"comic_info": {
"chapter": "Chapter",
"comment": "Comment",
"recommend": "Recommend"
},
"comics": {
"search_hint": "Search category",
"choose_category": "Please choose category"
},
"comic_subscribes": {
"update_reminder": "Update reminder",
"check_update": "Check update",
"cancel_all_update_reminder": "Cancel all update reminder"
},
"comment": {
"title": "Comment",
"hint_text": "Please enter the comment content",
"success": "Comment success",
"i_have_something_to_say": "I have something to say",
"please_enter_comment": "Please enter the comment content"
},
"desktop_authentication": {
"current_password": "Current password",
"password_error": "Password error",
"password_initialization": "Password initialization",
"password": "Password",
"re_enter_password": "Re-enter password",
"password_mismatch": "The two passwords entered are different",
"set_password": "Set password"
},
"download_confirm": {
"please_select_ep": "Please select the EP to download",
"already_added_to_download_list": "Already added to download list"
},
"download_export_group": {
"title": "Batch export",
"please_select_content": "Please select the content to export",
"exporting": "Exporting",
"export_failed": "Export failed",
"export_success": "Export success",
"export_to_pkz": "Export to PKZ\n(Encrypted mode, prevent web detection, can be opened with pikapika)",
"export_to_pki": "Export to PKI\n(Encrypted mode, prevent web detection, can be imported with pikapika)",
"export_to_zip": "Export to ZIP\n(Unencrypted mode, can be imported or viewed with pikapika)",
"export_to_jpeg_zip": "Export to ZIP+JPEG\n(Can be used directly with other readers, cannot be imported again)",
"export_to_jpeg_folder": "Export to folder+JPEG",
"export_to_pdf": "Export to PDF",
"export_to_epub": "Export to EPUB",
"export_to_pdf_folder": "Export to folder, each chapter one PDF",
"export_to_cbz": "Export to cbz",
"after_power_use": "After power use",
"input_save_name": "Please enter the saved name",
"export_confirm": "Export confirm",
"export_to_pkz_title": "Export the selected comics to a PKZ",
"export_to_pki_title": "Export the selected comics to separate PKI",
"please_power_up": "Please power up first",
"export_to_zip_title": "Export the selected comics to ZIP",
"export_to_jpeg_zip_title": "Export the selected comics to ZIP+JPEG",
"export_to_jpeg_zip_title_not_down_over": "Export the selected comics to ZIP+JPEG\n(Even if the download is not successful, it can be used)",
"export_to_jpeg_folder_title": "Export the selected comics to folder+JPEG",
"export_to_pdf_title": "Export the selected comics to PDF",
"export_to_epub_title": "Export the selected comics to EPUB",
"export_to_pdf_folder_title": "Export the selected comics to folder, each chapter one PDF",
"export_to_cbz_title": "Export the selected comics to cbz",
"exporting_please_wait": "Exporting, please wait"
},
"download_export_to_file": {
"title": "Export",
"transfer_to_other_device": "Transfer to other device",
"input_save_name": "Please enter the saved name",
"export_confirm": "Export confirm",
"export_to_pkz_title": "Export the selected comics to a PKZ",
"export_to_pkz_desc": "Export to xxx.pkz\n(Encrypted mode, prevent web detection, can be opened with pikapika)",
"export_to_pki_title": "Export the selected comics to separate PKI",
"export_to_pki_desc": "Export to xxx.pki\n(Encrypted mode, prevent web detection, can be imported with pikapika)",
"export_to_zip_title": "Export the selected comics to ZIP",
"export_to_zip_desc": "Export to xxx.zip\n(Unencrypted mode, can be imported or viewed with pikapika)",
"export_to_jpeg_zip_title": "Export the selected comics to ZIP+JPEG",
"export_to_jpeg_zip_desc": "Export to xxx.jpeg\n(Can be used directly with other readers, cannot be imported again)",
"export_to_pdf_title": "Export the selected comics to PDF",
"export_to_pdf_desc": "Export to xxx.pdf\n(Even if the download is not successful, it can be used, and the failed image will be skipped)\n(Can be opened directly in the photo album)",
"export_to_pdf_folder_title": "Export the selected comics to folder, each chapter one PDF",
"export_to_pdf_folder_desc": "Export to xxx.pdf\n(Even if the download is not successful, it can be used, and the failed image will be skipped)\n(Can be opened directly in the photo album)",
"export_to_epub_title": "Export the selected comics to EPUB",
"export_to_epub_desc": "Export to xxx.epub\n(Can be opened directly in the reader)",
"export_to_jpeg_folder_title": "Export the selected comics to JPEGS.zip",
"export_to_jpeg_folder_desc": "Export to JPGS.zip\n(Cannot be imported again)",
"export_to_cbz_title": "Export the selected comics to cbk.zip",
"export_to_cbz_desc": "Export to xxx.cbz, reader can use it directly (cannot be imported again)"
},
"download_export_to_socket": {
"title": "Network export",
"loading": "Loading",
"tips": "Do not exit the page before the transfer is successful, only one device can be exported at a time, the two devices need to be in the same network segment or infinite LAN, please enter IP:port on the other device, if there is only one IP, please select the IP of the infinite LAN, usually 192.168 starts",
"get_ip_failed": "Get IP failed",
"getting_ip": "Getting IP",
"port": "Port"
},
"download_import": {
"title": "Import",
"open_file": "Open file",
"select_file": "Select the file to import",
"import_success": "Import success",
"import_failed": "Import failed",
"select_file_desc": "Select zip file to import\nSelect pki file to import\nSelect pkz file to read",
"input_address": "Please enter the address provided by the export device\nFor example \"192.168.1.2:50000\"",
"import_from_other_device": "Import from other device",
"select_folder_desc": "Select folder\n(Import all zip/pki in the folder)\n(After power use)"
},
"download_info": {
"loading": "Loading",
"chapter": "Chapter",
"comment": "Comment",
"recommend": "Recommend"
},
"download_list": {
"search_download": "Search download",
"multi_select_operation": "Multi select operation",
"download_list": "Download list",
"search": "Search",
"select_folder": "Select folder",
"download_already_in_delete_queue": "The download is already in the delete queue",
"import": "Import",
"export": "Export",
"file": "File",
"download_task": "Download task",
"pause_download": "Pause download?",
"start_download": "Start download?",
"resume_failed": "Resume failed task",
"resume_failed_desc": "All failed downloads have been resumed",
"downloading": "Downloading",
"paused": "Paused",
"move_download": "Move download",
"select_download_to_move": "Please select the download to move",
"select_download_to_delete": "Please select the download to delete",
"input_name": "==> Input name <==",
"empty_folder_will_be_deleted": "(Empty folder will be automatically deleted, next time you need to manually input)",
"folder_name": "Folder name",
"please_input_folder_name": "Please input folder name",
"delete_download": "Delete download",
"delete_selected_download": "Delete selected download?",
"multi_select": "Multi select"
},
"download_only_import": {
"importing": "Importing",
"import_success": "Import success",
"import_failed": "Import failed",
"click_import_file": "Click import file",
"importing_please_wait": "Importing, please wait"
},
"favourite_paper": {
"favourite": "Favourite"
},
"forgot_password": {
"title": "Password Recovery",
"username": "Username",
"not_set": "Not set",
"confirm": "Confirm",
"please_enter_username": "Please enter username",
"question_1": "Question 1",
"question_2": "Question 2",
"question_3": "Question 3",
"answer_1": "Answer 1",
"answer_2": "Answer 2",
"answer_3": "Answer 3",
"please_enter_answer_1": "Please enter answer 1",
"please_enter_answer_2": "Please enter answer 2",
"please_enter_answer_3": "Please enter answer 3",
"use_answer_1_recover": "Use answer 1 to recover password",
"use_answer_2_recover": "Use answer 2 to recover password",
"use_answer_3_recover": "Use answer 3 to recover password",
"please_enter_answer": "Please enter answer",
"new_password_copied": "New password is being copied to clipboard",
"answer_incorrect": "Answer is incorrect",
"password": "Password"
},
"game_download": {
"title": "Download",
"download_links_obtained": "Download links obtained, you just need to choose one of them"
},
"game_info": {
"download": "Download",
"details": "Details",
"comments": "Comments"
},
"games": {
"title": "Games"
},
"import_from_off": {
"title": "Import",
"import_success": "Import success",
"import_failed": "Import failed"
},
"modify_password": {
"title": "Modify password",
"please_wait": "Please wait",
"old_password": "Old password",
"new_password": "New password",
"repeat_new_password": "Repeat new password",
"not_filled": "Not filled",
"please_enter_old_password": "Please enter old password",
"please_enter_new_password": "Please enter new password",
"please_repeat_new_password": "Please repeat new password",
"new_password_mismatch": "New passwords do not match",
"modify_success": "Modify success",
"failed": "Failed",
"confirm": "Confirm"
},
"network_settings": {
"title": "Network Settings"
},
"pkz_reader": {
"reading_downloaded_comic": "You are reading a downloaded comic"
},
"pro": {
"title": "Power Center",
"power_center": "Power Center",
"power_status": "Power Status",
"powered": "Powered",
"not_powered": "Not Powered",
"pat_membership": "PAT Membership",
"pat_status": "PAT Status",
"pat_normal": "PAT Normal",
"pat_bind_hint": "Please click here to bind to current account for power",
"pat_rebind_hint": "Please click to rebind to current account for power",
"pat_not_detected": "No membership detected, please go to download page to join",
"i_have_powered": "I have powered before",
"i_just_powered": "I just powered",
"enter_code": "Enter code",
"power_method": "Power Method",
"wind_power": "Wind Power",
"hydro_power": "Hydro Power",
"solar_power": "Solar Power",
"nuclear_power": "Nuclear Power",
"choose_power_method": "Choose power method",
"sign_in_exchange": "Sign in/Exchange",
"click_pat_to_change": "Click PAT membership below to change",
"update_pat_status": "Update PAT power status",
"bind_to_account": "Bind to this account",
"change_pat_key": "Change PAT key",
"clear_pat_info": "Clear PAT info",
"click_to_bind": "Click to bind",
"enter_auth_code": "Please enter authorization code",
"please_wait": "Please wait",
"key_recorded": "Key: Recorded",
"pat_account": "PAT Account",
"bind_pika_account": "Bind PIKA Account",
"bind_account_time": "Bind account time",
"rebind_time": "Rebind available time",
"power_features": "Power features: Multi-thread download / Batch import/export download",
"power_guide": "Go to \"About\" page to find maintenance address for power guide\n\n \"I have powered before\" can sync corresponding power status\n \"I just powered\" exchange mysterious code\n \"Power method\" can be changed when network is not working\n \"PAT membership\" is independent power method"
},
"rankings": {
"title": "Rankings",
"day": "Day",
"week": "Week",
"month": "Month",
"knight": "Knight",
"refresh": "Refresh",
"comics_count": "comics"
},
"random_comics": {
"title": "Random Comics"
},
"register": {
"title": "Register",
"registering": "Registering",
"register_success": "Register Success",
"register_fa
gitextract_rinrtcf6/
├── .fvmrc
├── .github/
│ └── workflows/
│ ├── Package.core.yml
│ ├── Package.yml
│ ├── Release.core.yml
│ └── Release.yml
├── .gitignore
├── .metadata
├── README-zh_CN.md
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── opensource/
│ │ │ │ └── pic2acg/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── ci/
│ ├── cmd/
│ │ ├── check_asset/
│ │ │ └── main.go
│ │ ├── check_asset_core/
│ │ │ └── main.go
│ │ ├── check_release/
│ │ │ └── main.go
│ │ ├── send_to_community/
│ │ │ └── main.go
│ │ ├── upload_asset/
│ │ │ └── main.go
│ │ └── upload_asset_core/
│ │ └── main.go
│ ├── commons/
│ │ ├── funcs.go
│ │ └── types.go
│ ├── go.mod
│ ├── go.sum
│ ├── linux_font.yaml
│ ├── version.code.txt
│ └── version.info.txt
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── IDEWorkspaceChecks.plist
│ └── WorkspaceSettings.xcsettings
├── lib/
│ ├── assets/
│ │ └── translations/
│ │ ├── en-US.json
│ │ ├── ja-JP.json
│ │ ├── ko-KR.json
│ │ ├── zh-CN.json
│ │ └── zh-TW.json
│ ├── basic/
│ │ ├── Channels.dart
│ │ ├── Common.dart
│ │ ├── Cross.dart
│ │ ├── Entities.dart
│ │ ├── Method.dart
│ │ ├── Navigator.dart
│ │ ├── config/
│ │ │ ├── Address.dart
│ │ │ ├── AndroidDisplayMode.dart
│ │ │ ├── AndroidSecureFlag.dart
│ │ │ ├── AppOrientation.dart
│ │ │ ├── Authentication.dart
│ │ │ ├── AutoClean.dart
│ │ │ ├── AutoDeleteDownloadOnUnfavorite.dart
│ │ │ ├── AutoDownloadOnFavorite.dart
│ │ │ ├── AutoFullScreen.dart
│ │ │ ├── AutoFullScreenOnForward.dart
│ │ │ ├── CategoriesColumnCount.dart
│ │ │ ├── CategoriesSort.dart
│ │ │ ├── ChooserRoot.dart
│ │ │ ├── ContentFailedReloadAction.dart
│ │ │ ├── CopyFullName.dart
│ │ │ ├── CopyFullNameTemplate.dart
│ │ │ ├── CopySkipConfirm.dart
│ │ │ ├── DisableAutoDownloadOnMobile.dart
│ │ │ ├── DownloadAndExportPath.dart
│ │ │ ├── DownloadCachePath.dart
│ │ │ ├── DownloadThreadCount.dart
│ │ │ ├── DragRegionLock.dart
│ │ │ ├── EBookScrolling.dart
│ │ │ ├── EBookScrollingRange.dart
│ │ │ ├── EBookScrollingTrigger.dart
│ │ │ ├── ExportPath.dart
│ │ │ ├── ExportRename.dart
│ │ │ ├── FullScreenAction.dart
│ │ │ ├── FullScreenUI.dart
│ │ │ ├── GalleryPreloadCount.dart
│ │ │ ├── GestureSpeed.dart
│ │ │ ├── HiddenFdIcon.dart
│ │ │ ├── HiddenSearchPersion.dart
│ │ │ ├── HiddenSubIcon.dart
│ │ │ ├── HiddenViewed.dart
│ │ │ ├── HiddenWords.dart
│ │ │ ├── HideOnlineFavorite.dart
│ │ │ ├── IconLoading.dart
│ │ │ ├── IgnoreInfoHistory.dart
│ │ │ ├── IgnoreUpgradeConfirm.dart
│ │ │ ├── ImageAddress.dart
│ │ │ ├── ImageFilter.dart
│ │ │ ├── ImportNotice.dart
│ │ │ ├── IsPro.dart
│ │ │ ├── KeyboardController.dart
│ │ │ ├── ListLayout.dart
│ │ │ ├── LocalHistorySync.dart
│ │ │ ├── NoAnimation.dart
│ │ │ ├── PagerAction.dart
│ │ │ ├── Platform.dart
│ │ │ ├── Proxy.dart
│ │ │ ├── Quality.dart
│ │ │ ├── ReaderBackgroundColor.dart
│ │ │ ├── ReaderDirection.dart
│ │ │ ├── ReaderScrollByScreenPercentage.dart
│ │ │ ├── ReaderSliderPosition.dart
│ │ │ ├── ReaderTwoPageDirection.dart
│ │ │ ├── ReaderType.dart
│ │ │ ├── ReaderZoomScale.dart
│ │ │ ├── RecommendLinks.dart
│ │ │ ├── ShadowCategories.dart
│ │ │ ├── ShadowCategoriesEvent.dart
│ │ │ ├── ShadowCategoriesMode.dart
│ │ │ ├── ShowCommentAtDownload.dart
│ │ │ ├── StartupPic.dart
│ │ │ ├── Themes.dart
│ │ │ ├── ThreeKeepRight.dart
│ │ │ ├── TimeOffsetHour.dart
│ │ │ ├── TimeoutLock.dart
│ │ │ ├── UseApiLoadImage.dart
│ │ │ ├── UsingRightClickPop.dart
│ │ │ ├── Version.dart
│ │ │ ├── VolumeController.dart
│ │ │ ├── VolumeNextChapter.dart
│ │ │ ├── WebDav.dart
│ │ │ ├── WebToonScrollMode.dart
│ │ │ ├── WillPopNotice.dart
│ │ │ ├── i18n.dart
│ │ │ └── passed.dart
│ │ ├── connect.dart
│ │ ├── define.dart
│ │ ├── enum/
│ │ │ ├── ErrorTypes.dart
│ │ │ └── Sort.dart
│ │ └── store/
│ │ └── Categories.dart
│ ├── i18.dart
│ ├── i18b.dart
│ ├── main.dart
│ ├── main_desktop.dart
│ └── screens/
│ ├── AboutScreen.dart
│ ├── AccessKeyReplaceScreen.dart
│ ├── AccountScreen.dart
│ ├── AppScreen.dart
│ ├── CategoriesScreen.dart
│ ├── CategoriesSortScreen.dart
│ ├── CleanScreen.dart
│ ├── CloseAppScreen.dart
│ ├── ComicCollectionsScreen.dart
│ ├── ComicInfoScreen.dart
│ ├── ComicReaderScreen.dart
│ ├── ComicSubscribesScreen.dart
│ ├── ComicsScreen.dart
│ ├── CommentScreen.dart
│ ├── DesktopAuthenticationScreen.dart
│ ├── DownloadConfirmScreen.dart
│ ├── DownloadExportGroupScreen.dart
│ ├── DownloadExportToFileScreen.dart
│ ├── DownloadExportToSocketScreen.dart
│ ├── DownloadExportingGroupScreen.dart
│ ├── DownloadImportScreen.dart
│ ├── DownloadInfoScreen.dart
│ ├── DownloadListScreen.dart
│ ├── DownloadOnlyImportScreen.dart
│ ├── DownloadReaderScreen.dart
│ ├── FavouritePaperScreen.dart
│ ├── FilePhotoViewScreen.dart
│ ├── ForgotPasswordScreen.dart
│ ├── GameDownloadScreen.dart
│ ├── GameInfoScreen.dart
│ ├── GamesScreen.dart
│ ├── HiddenWordsScreen.dart
│ ├── ImportFromOffScreen.dart
│ ├── InitScreen.dart
│ ├── LocalFavoriteScreen.dart
│ ├── MigrateScreen.dart
│ ├── ModifyPasswordScreen.dart
│ ├── NetworkSettingsScreen.dart
│ ├── PkzArchiveScreen.dart
│ ├── PkzComicInfoScreen.dart
│ ├── PkzReaderScreen.dart
│ ├── ProScreen.dart
│ ├── RandomComicsScreen.dart
│ ├── RankingsScreen.dart
│ ├── RegisterScreen.dart
│ ├── SearchAuthorScreen.dart
│ ├── SearchScreen.dart
│ ├── SettingsScreen.dart
│ ├── SpaceScreen.dart
│ ├── ThemeScreen.dart
│ ├── ViewLogsScreen.dart
│ ├── WebServerScreen.dart
│ ├── calculator_screen.dart
│ └── components/
│ ├── Avatar.dart
│ ├── Badge.dart
│ ├── BottomSheetInput.dart
│ ├── ComicDescriptionCard.dart
│ ├── ComicInfoCard.dart
│ ├── ComicList.dart
│ ├── ComicListBuilder.dart
│ ├── ComicPager.dart
│ ├── ComicTagsCard.dart
│ ├── CommentItem.dart
│ ├── CommentList.dart
│ ├── CommentMainType.dart
│ ├── Common.dart
│ ├── CommonData.dart
│ ├── ContentBuilder.dart
│ ├── ContentError.dart
│ ├── ContentLoading.dart
│ ├── ContentMessage.dart
│ ├── ContinueReadButton.dart
│ ├── DesktopCropper.dart
│ ├── DownloadComicsScreen.dart
│ ├── DownloadInfoCard.dart
│ ├── FitButton.dart
│ ├── GameTitleCard.dart
│ ├── GoDownloadSelect.dart
│ ├── ImageReader.dart
│ ├── Images.dart
│ ├── ItemBuilder.dart
│ ├── LinkToComicInfo.dart
│ ├── ListView.dart
│ ├── MouseAndTouchScrollBehavior.dart
│ ├── NetworkSetting.dart
│ ├── PkzComicInfoCard.dart
│ ├── PkzImages.dart
│ ├── RecommendLinksPanel.dart
│ ├── Recommendation.dart
│ ├── RightClickPop.dart
│ ├── TimeoutLock.dart
│ ├── UserProfileCard.dart
│ ├── flutter_search_bar.dart
│ └── gesture_zoom_box.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── scripts/
│ ├── README.md
│ ├── bind-android-arm64.sh
│ ├── bind-android-debug.sh
│ ├── bind-ios-arm64.sh
│ ├── bind-ios.sh
│ ├── build-apk-arm.sh
│ ├── build-apk-arm64.sh
│ ├── build-apk-x64.sh
│ ├── build-apk-x86.sh
│ ├── build-ipa.sh
│ ├── build-linux.sh
│ ├── build-macos-dmg.sh
│ ├── json_compairer.py
│ ├── sign-apk-github-actions.sh
│ ├── thin-payload.sh
│ └── version.sh
├── test/
│ └── widget_test.dart
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── run_loop.cpp
├── run_loop.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
SYMBOL INDEX (1622 symbols across 205 files)
FILE: ci/cmd/check_asset/main.go
function main (line 12) | func main() {
FILE: ci/cmd/check_asset_core/main.go
function main (line 12) | func main() {
FILE: ci/cmd/check_release/main.go
function main (line 13) | func main() {
FILE: ci/cmd/send_to_community/main.go
function main (line 17) | func main() {
function sendMessageToTg (line 64) | func sendMessageToTg(token string, ids []int64, message string) {
function sendMessageToDiscord (line 80) | func sendMessageToDiscord(token string, ids []uint64, message string) {
FILE: ci/cmd/upload_asset/main.go
function main (line 13) | func main() {
FILE: ci/cmd/upload_asset_core/main.go
function main (line 13) | func main() {
FILE: ci/commons/funcs.go
constant Ua (line 9) | Ua = "pikapika ci"
constant MainBranch (line 10) | MainBranch = "master"
function LoadVersion (line 12) | func LoadVersion() Version {
function AssetName (line 27) | func AssetName(version Version, flutterVersion, target, branch string) s...
FILE: ci/commons/types.go
type Version (line 5) | type Version struct
type Release (line 10) | type Release struct
FILE: lib/basic/Channels.dart
function registerEvent (line 15) | void registerEvent(void Function(String args) eventHandler, String event...
function unregisterEvent (line 26) | void unregisterEvent(void Function(String args) eventHandler)
function _onFlatEvent (line 36) | void _onFlatEvent(dynamic t)
class _FlatEvent (line 45) | class _FlatEvent {
FILE: lib/basic/Common.dart
function categoryTitle (line 21) | String categoryTitle(String? categoryTitle)
function defaultToast (line 26) | void defaultToast(BuildContext context, String title)
function confirmDialog (line 41) | Future<bool> confirmDialog(
function alertDialog (line 71) | Future alertDialog(BuildContext context, String title, String content)
function filteredList (line 96) | List<T> filteredList<T>(List<T> list, bool Function(T) filter)
function chooseListDialog (line 107) | Future<T?> chooseListDialog<T>(
function chooseMapDialog (line 137) | Future<T?> chooseMapDialog<T>(
function displayTextInputDialog (line 162) | Future<String?> displayTextInputDialog(BuildContext context,
function add0 (line 223) | String add0(int num, int len)
function formatTimeToDate (line 232) | String formatTimeToDate(String str)
function formatTimeToDateTime (line 242) | String formatTimeToDateTime(String str)
function inputString (line 256) | Future<String?> inputString(BuildContext context, String title,
function linkSubscript (line 301) | StreamSubscription<String?> linkSubscript(BuildContext context)
FILE: lib/basic/Cross.dart
function copyToClipBoard (line 18) | void copyToClipBoard(BuildContext context, String string)
function copyToClipBoardTips (line 26) | void copyToClipBoardTips(BuildContext context, String string)
function openUrl (line 32) | Future<dynamic> openUrl(String url)
function saveImage (line 42) | Future<dynamic> saveImage(String path, BuildContext context)
function saveImageQuiet (line 71) | Future<dynamic> saveImageQuiet(String path, BuildContext context)
function _saveImageAndroid (line 81) | Future<dynamic> _saveImageAndroid(String path, BuildContext context)
function chooseFolder (line 95) | Future<String?> chooseFolder(BuildContext context)
function confirmCopy (line 104) | void confirmCopy(BuildContext context, String content)
FILE: lib/basic/Entities.dart
class RemoteImageInfo (line 4) | class RemoteImageInfo {
method toJson (line 15) | Map<String, dynamic> toJson()
class BasicUser (line 25) | class BasicUser {
class UserProfile (line 55) | class UserProfile extends BasicUser {
class Page (line 70) | class Page {
class Category (line 87) | class Category {
class ComicsPage (line 108) | class ComicsPage extends Page {
class ComicSimple (line 120) | class ComicSimple {
class ComicInfo (line 145) | class ComicInfo extends ComicSimple {
class Creator (line 174) | class Creator extends BasicUser {
class Ep (line 185) | class Ep {
class EpPage (line 200) | class EpPage extends Page {
class PicturePage (line 212) | class PicturePage extends Page {
class Picture (line 224) | class Picture {
class RemoteImageData (line 235) | class RemoteImageData {
class CommentPage (line 260) | class CommentPage extends Page {
class CommentBase (line 271) | class CommentBase {
class ChildOfComment (line 296) | class ChildOfComment extends CommentBase {
class Comment (line 305) | class Comment extends CommentBase {
class CommentUser (line 314) | class CommentUser extends BasicUser {
class DownloadPicture (line 323) | class DownloadPicture {
class ViewLog (line 346) | class ViewLog {
class DownloadComic (line 387) | class DownloadComic {
method copy (line 415) | void copy(DownloadComic other)
class DownloadEp (line 471) | class DownloadEp {
class GamePage (line 502) | class GamePage extends Page {
class GameSimple (line 514) | class GameSimple {
class GameInfo (line 541) | class GameInfo extends GameSimple {
class MyCommentsPage (line 577) | class MyCommentsPage extends Page {
class MyComment (line 587) | class MyComment {
class MyCommentComic (line 610) | class MyCommentComic {
class CommentChildrenPage (line 621) | class CommentChildrenPage extends Page {
class CommentChild (line 635) | class CommentChild extends ChildOfComment {
class GameCommentPage (line 644) | class GameCommentPage extends Page {
class GameComment (line 656) | class GameComment extends CommentBase {
class GameCommentChildrenPage (line 665) | class GameCommentChildrenPage extends Page {
class GameCommentChild (line 680) | class GameCommentChild extends ChildOfComment {
class Collection (line 688) | class Collection {
class PkzArchive (line 701) | class PkzArchive {
method toJson (line 731) | Map<String, dynamic> toJson()
class PkzComic (line 744) | class PkzComic {
method toJson (line 805) | Map<String, dynamic> toJson()
class PkzVolume (line 829) | class PkzVolume {
method toJson (line 865) | Map<String, dynamic> toJson()
class PkzChapter (line 880) | class PkzChapter {
method toJson (line 913) | Map<String, dynamic> toJson()
class PkzPicture (line 927) | class PkzPicture {
method toJson (line 956) | Map<String, dynamic> toJson()
class Knight (line 969) | class Knight extends BasicUser {
class PkzComicViewLog (line 981) | class PkzComicViewLog {
method toJson (line 1013) | Map<String, dynamic> toJson()
class ProInfoAll (line 1027) | class ProInfoAll {
method toJson (line 1041) | Map<String, dynamic> toJson()
class ProInfoAf (line 1049) | class ProInfoAf {
method toJson (line 1063) | Map<String, dynamic> toJson()
class ProInfoPat (line 1071) | class ProInfoPat {
method toJson (line 1103) | Map<String, dynamic> toJson()
class ForgotPasswordResult (line 1117) | class ForgotPasswordResult {
method toJson (line 1134) | Map<String, dynamic> toJson()
class ResetPasswordResult (line 1143) | class ResetPasswordResult {
method toJson (line 1154) | Map<String, dynamic> toJson()
class ComicSubscribe (line 1162) | class ComicSubscribe {
method toSimpleJson (line 1202) | Map<String, dynamic> toSimpleJson()
class LocalFavoriteFolder (line 1232) | class LocalFavoriteFolder {
method toJson (line 1247) | Map<String, dynamic> toJson()
class LocalFavoriteComic (line 1259) | class LocalFavoriteComic {
method toJson (line 1276) | Map<String, dynamic> toJson()
FILE: lib/basic/Method.dart
class Method (line 11) | class Method {
method _flatInvoke (line 19) | Future<dynamic> _flatInvoke(String method, dynamic params)
method loadProperty (line 27) | Future<String> loadProperty(String propertyName, String defaultValue)
method configLinks (line 35) | Future<Map<String, String>> configLinks()
method appConfig (line 45) | Future<Map<String, dynamic>> appConfig()
method saveProperty (line 55) | Future<dynamic> saveProperty(String propertyName, String value)
method getSwitchAddress (line 63) | Future<String> getSwitchAddress()
method setSwitchAddress (line 68) | Future<dynamic> setSwitchAddress(String switchAddress)
method getImageSwitchAddress (line 73) | Future<String> getImageSwitchAddress()
method setImageSwitchAddress (line 78) | Future<dynamic> setImageSwitchAddress(String switchAddress)
method getUseApiClientLoadImage (line 82) | Future<String> getUseApiClientLoadImage()
method setUseApiClientLoadImage (line 86) | Future<dynamic> setUseApiClientLoadImage(String switchAddress)
method getProxy (line 91) | Future<String> getProxy()
method setProxy (line 96) | Future<dynamic> setProxy(String proxy)
method getUsername (line 101) | Future<String> getUsername()
method setUsername (line 106) | Future<dynamic> setUsername(String username)
method getPassword (line 111) | Future<String> getPassword()
method setPassword (line 116) | Future<dynamic> setPassword(String password)
method preLogin (line 122) | Future<bool> preLogin()
method login (line 128) | Future<dynamic> login()
method register (line 133) | Future<dynamic> register(
method clearToken (line 161) | Future<dynamic> clearToken()
method userProfile (line 166) | Future<UserProfile> userProfile()
method punchIn (line 172) | Future<dynamic> punchIn()
method remoteImageData (line 178) | Future<RemoteImageData> remoteImageData(
method remoteImagePreload (line 188) | Future<dynamic> remoteImagePreload(String fileServer, String path)
method downloadImagePath (line 196) | Future<String> downloadImagePath(String path)
method categories (line 201) | Future<List<Category>> categories()
method comics (line 215) | Future<ComicsPage> comics(
method searchComics (line 237) | Future<ComicsPage> searchComics(String keyword, String sort, int page)
method searchComicsInCategories (line 242) | Future<ComicsPage> searchComicsInCategories(
method randomComics (line 254) | Future<List<ComicSimple>> randomComics()
method leaderboard (line 264) | Future<List<ComicSimple>> leaderboard(String type)
method comicInfo (line 273) | Future<ComicInfo> comicInfo(String comicId, bool ignoreHistory)
method comicEpPage (line 280) | Future<EpPage> comicEpPage(String comicId, int page)
method comicPicturePageWithQuality (line 289) | Future<PicturePage> comicPicturePageWithQuality(
method switchLike (line 301) | Future<String> switchLike(String comicId)
method switchFavourite (line 306) | Future<String> switchFavourite(String comicId)
method favouriteComics (line 311) | Future<ComicsPage> favouriteComics(String sort, int page)
method recommendation (line 320) | Future<List<ComicSimple>> recommendation(String comicId)
method postComment (line 327) | Future<dynamic> postComment(String comicId, String content)
method postChildComment (line 335) | Future<dynamic> postChildComment(String commentId, String content)
method comments (line 343) | Future<CommentPage> comments(String comicId, int page)
method commentChildren (line 352) | Future<CommentChildrenPage> commentChildren(
method switchLikeComment (line 366) | Future switchLikeComment(String commentId, String comicId)
method myComments (line 374) | Future<MyCommentsPage> myComments(int page)
method viewLogPage (line 380) | Future<List<ViewLog>> viewLogPage(int offset, int limit)
method clearAllViewLog (line 390) | Future<dynamic> clearAllViewLog()
method deleteViewLog (line 395) | Future<dynamic> deleteViewLog(String id)
method viewComic (line 400) | Future<dynamic> viewComic(String id)
method games (line 405) | Future<GamePage> games(int page)
method game (line 411) | Future<GameInfo> game(String gameId)
method gameComments (line 417) | Future<GameCommentPage> gameComments(String gameId, int page)
method postGameComment (line 426) | Future<dynamic> postGameComment(String gameId, String content)
method gameCommentChildren (line 434) | Future<GameCommentChildrenPage> gameCommentChildren(
method switchLikeGameComment (line 448) | Future switchLikeGameComment(String commentId, String gameId)
method postGameChildComment (line 456) | Future<dynamic> postGameChildComment(String commentId, String content)
method cleanNetworkCache (line 464) | Future cleanNetworkCache()
method cleanImageCache (line 469) | Future cleanImageCache()
method clean (line 474) | Future clean()
method autoClean (line 479) | Future autoClean(String expireSec)
method storeViewEp (line 484) | Future storeViewEp(
method loadView (line 495) | Future<ViewLog?> loadView(String comicId)
method downloadRunning (line 504) | Future<bool> downloadRunning()
method setDownloadRunning (line 510) | Future<dynamic> setDownloadRunning(bool status)
method createDownload (line 515) | Future<dynamic> createDownload(
method addDownload (line 524) | Future<dynamic> addDownload(
method loadDownloadComic (line 533) | Future<DownloadComic?> loadDownloadComic(String comicId)
method allDownloads (line 543) | Future<List<DownloadComic>> allDownloads(String search,
method allCustomFolders (line 557) | Future<List<String>> allCustomFolders()
method deleteDownloadComic (line 563) | Future<dynamic> deleteDownloadComic(String comicId)
method moveDownloadComic (line 567) | Future<dynamic> moveDownloadComic(
method downloadEpList (line 576) | Future<List<DownloadEp>> downloadEpList(String comicId)
method downloadPicturesByEpId (line 583) | Future<List<DownloadPicture>> downloadPicturesByEpId(String epId)
method resetFailed (line 590) | Future<dynamic> resetFailed()
method exportComicDownload (line 595) | Future<dynamic> exportComicDownload(String comicId, String dir, String...
method exportComicDownloadToPki (line 604) | Future<dynamic> exportComicDownloadToPki(
method exportComicJpegsEvenNotFinish (line 614) | Future<dynamic> exportComicJpegsEvenNotFinish(
method exportComicDownloadToJPG (line 627) | Future<dynamic> exportComicDownloadToJPG(
method exportComicDownloadToPDF (line 640) | Future<dynamic> exportComicDownloadToPDF(
method exportComicDownloadToEpub (line 653) | Future<dynamic> exportComicDownloadToEpub(
method exportComicDownloadToPDFFolder (line 666) | Future<dynamic> exportComicDownloadToPDFFolder(
method exportComicDownloadJpegZip (line 679) | Future<dynamic> exportComicDownloadJpegZip(
method exportComicDownloadToPkz (line 692) | Future<dynamic> exportComicDownloadToPkz(
method exportAnyComicDownloadsToZip (line 705) | Future<dynamic> exportAnyComicDownloadsToZip(
method exportAnyComicDownloadsToPki (line 716) | Future<dynamic> exportAnyComicDownloadsToPki(
method exportComicDownloadToCbzsZip (line 727) | Future<dynamic> exportComicDownloadToCbzsZip(
method importComicDownloadDir (line 737) | Future<dynamic> importComicDownloadDir(
method exportComicUsingSocket (line 744) | Future<int> exportComicUsingSocket(String comicId)
method exportComicUsingSocketExit (line 749) | Future<dynamic> exportComicUsingSocketExit()
method importComicDownload (line 754) | Future<dynamic> importComicDownload(String zipPath)
method importComicDownloadPki (line 759) | Future<dynamic> importComicDownloadPki(String zipPath)
method importComicDownloadUsingSocket (line 764) | Future<dynamic> importComicDownloadUsingSocket(String addr)
method clientIpSet (line 769) | Future<String> clientIpSet()
method downloadGame (line 774) | Future<List<String>> downloadGame(String url)
method iosSaveFileToImage (line 786) | Future<dynamic> iosSaveFileToImage(String path)
method androidSaveFileToImage (line 793) | Future androidSaveFileToImage(String path)
method convertImageToJPEG100 (line 800) | Future convertImageToJPEG100(String path, String dir)
method loadAndroidModes (line 808) | Future<List<String>> loadAndroidModes()
method setAndroidMode (line 815) | Future setAndroidMode(String androidDisplayMode)
method androidGetVersion (line 821) | Future<int> androidGetVersion()
method dataLocal (line 826) | Future<String> dataLocal()
method androidGetExtendDirs (line 831) | Future<List<String>> androidGetExtendDirs()
method migrate (line 840) | Future migrate(String path)
method loadDownloadAndExportPath (line 845) | Future loadDownloadAndExportPath()
method saveDownloadAndExportPath (line 850) | Future saveDownloadAndExportPath(String folder)
method loadDownloadCachePath (line 855) | Future loadDownloadCachePath()
method saveDownloadCachePath (line 860) | Future saveDownloadCachePath(String folder)
method androidSecureFlag (line 865) | Future androidSecureFlag(bool flag)
method loadDownloadThreadCount (line 872) | Future<int> loadDownloadThreadCount()
method saveDownloadThreadCount (line 878) | Future saveDownloadThreadCount(int value)
method defaultHttpClientGet (line 883) | Future<String> defaultHttpClientGet(String url)
method updateSlogan (line 888) | Future updateSlogan(String input)
method updateAvatar (line 893) | Future updateAvatar(String data)
method updatePassword (line 898) | Future updatePassword(String oldPassword, String newPassword)
method loadViewedList (line 905) | Future<List<String>> loadViewedList(List<String> list)
method collections (line 910) | Future<List<Collection>> collections()
method verifyAuthentication (line 916) | Future<bool> verifyAuthentication()
method pkzInfo (line 920) | Future<PkzArchive> pkzInfo(String pkzPath)
method loadPkzFile (line 925) | Future<Uint8List> loadPkzFile(String pkzPath, String path)
method pkzComicViewLogs (line 932) | Future<List<PkzComicViewLog>> pkzComicViewLogs(
method pkzComicViewLogByPkzNameAndId (line 941) | Future<PkzComicViewLog?> pkzComicViewLogByPkzNameAndId(
method viewPkz (line 955) | Future viewPkz(
method viewPkzComic (line 965) | Future viewPkzComic(
method viewPkzEpAndPicture (line 979) | Future viewPkzEpAndPicture(
method leaderboardOfKnight (line 999) | Future<List<Knight>> leaderboardOfKnight()
method proInfoAll (line 1005) | Future<ProInfoAll> proInfoAll()
method reloadPro (line 1009) | Future reloadPro()
method inputCdKey (line 1013) | Future inputCdKey(String cdKey)
method reloadSwitchAddress (line 1017) | Future reloadSwitchAddress()
method resetSwitchAddress (line 1021) | Future resetSwitchAddress()
method iosGetDocumentDir (line 1025) | Future<String> iosGetDocumentDir()
method forgotPassword (line 1030) | Future<ForgotPasswordResult> forgotPassword(email)
method resetPassword (line 1036) | Future<ResetPasswordResult> resetPassword(
method mergeHistoriesFromWebDav (line 1049) | Future mergeHistoriesFromWebDav(
method mergeHistoriesFromLocal (line 1065) | Future mergeHistoriesFromLocal(String localPath)
method ping (line 1069) | Future<int> ping(String idx)
method pingImg (line 1074) | Future<int> pingImg(String idx)
method androidStorageRoot (line 1079) | Future<String> androidStorageRoot()
method importComicViewFormOff (line 1083) | Future importComicViewFormOff(String dbPath)
method startWebServer (line 1087) | Future startWebServer()
method stopWebServer (line 1091) | Future stopWebServer()
method androidDefaultExportsDir (line 1095) | Future<String> androidDefaultExportsDir()
method getHomeDir (line 1099) | Future getHomeDir()
method mkdirs (line 1103) | Future mkdirs(String path)
method androidMkdirs (line 1107) | Future androidMkdirs(String path)
method downloadAll (line 1111) | Future downloadAll(List<String> comicIds)
method setPatAccessKey (line 1115) | Future setPatAccessKey(String accessKey)
method reloadPatAccount (line 1119) | Future reloadPatAccount()
method bindThisAccount (line 1123) | Future bindThisAccount()
method clearPat (line 1127) | Future clearPat()
method getProServerName (line 1131) | Future<String> getProServerName()
method setProServerName (line 1135) | Future<dynamic> setProServerName(String serverName)
method loadSubscribed (line 1140) | Future<ComicSubscribe?> loadSubscribed(String comicId)
method addSubscribed (line 1148) | Future addSubscribed(String comicId)
method removeAllSubscribed (line 1152) | Future removeAllSubscribed()
method removeSubscribed (line 1156) | Future removeSubscribed(String comicId)
method allSubscribed (line 1160) | Future<List<ComicSubscribe>> allSubscribed()
method updateSubscribed (line 1166) | Future updateSubscribed()
method updateSubscribedForce (line 1170) | Future updateSubscribedForce()
method fontList (line 1174) | Future<List<String>> fontList()
method createLocalFavoriteFolder (line 1180) | Future<LocalFavoriteFolder> createLocalFavoriteFolder(String name)
method updateLocalFavoriteFolder (line 1186) | Future updateLocalFavoriteFolder(LocalFavoriteFolder folder)
method deleteLocalFavoriteFolder (line 1190) | Future deleteLocalFavoriteFolder(String folderId)
method getLocalFavoriteFolder (line 1194) | Future<LocalFavoriteFolder> getLocalFavoriteFolder(String folderId)
method listLocalFavoriteFolders (line 1199) | Future<List<LocalFavoriteFolder>> listLocalFavoriteFolders()
method countLocalFavoriteFolders (line 1205) | Future<int> countLocalFavoriteFolders()
method addLocalFavoriteComic (line 1210) | Future addLocalFavoriteComic(String comicId, String folderId,
method removeLocalFavoriteComic (line 1219) | Future removeLocalFavoriteComic(String comicId)
method moveLocalFavoriteComics (line 1223) | Future moveLocalFavoriteComics(List<String> comicIds, String folderId)
method getLocalFavoriteComic (line 1230) | Future<LocalFavoriteComic?> getLocalFavoriteComic(String comicId)
method listLocalFavoriteComics (line 1242) | Future<List<LocalFavoriteComic>> listLocalFavoriteComics(
method listAllLocalFavoriteComics (line 1250) | Future<List<LocalFavoriteComic>> listAllLocalFavoriteComics()
method mergeLocalFavoritesFromWebDav (line 1256) | Future mergeLocalFavoritesFromWebDav(
FILE: lib/basic/Navigator.dart
class _NavigatorObserver (line 19) | class _NavigatorObserver extends NavigatorObserver {
method didPop (line 21) | void didPop(Route route, Route? previousRoute)
method didPush (line 28) | void didPush(Route route, Route? previousRoute)
function navPushOrReplace (line 36) | Future<dynamic> navPushOrReplace(
FILE: lib/basic/config/Address.dart
function initAddress (line 31) | Future<void> initAddress()
function currentAddress (line 35) | String currentAddress()
function currentAddressName (line 37) | String currentAddressName()
function switchAddressSetting (line 39) | Widget switchAddressSetting()
function reloadSwitchAddressSetting (line 54) | Widget reloadSwitchAddressSetting()
function chooseAddressAndSwitch (line 89) | Future chooseAddressAndSwitch(BuildContext context)
function addressPopMenu (line 134) | Widget addressPopMenu(BuildContext context)
class ApiOptionRow (line 176) | class ApiOptionRow extends StatefulWidget {
method createState (line 183) | State<StatefulWidget> createState()
class _ApiOptionRowState (line 186) | class _ApiOptionRowState extends State<ApiOptionRow> {
method initState (line 190) | void initState()
method build (line 196) | Widget build(BuildContext context)
class PingStatus (line 243) | class PingStatus extends StatelessWidget {
method build (line 250) | Widget build(BuildContext context)
FILE: lib/basic/config/AndroidDisplayMode.dart
function initAndroidDisplayMode (line 16) | Future initAndroidDisplayMode()
function _changeMode (line 24) | Future _changeMode()
function _chooseAndroidDisplayMode (line 28) | Future<void> _chooseAndroidDisplayMode(BuildContext context)
function androidDisplayModeSetting (line 45) | Widget androidDisplayModeSetting()
FILE: lib/basic/config/AndroidSecureFlag.dart
function initAndroidSecureFlag (line 16) | Future<void> initAndroidSecureFlag()
function androidSecureFlagSetting (line 26) | Widget androidSecureFlagSetting()
FILE: lib/basic/config/AppOrientation.dart
type AppOrientation (line 14) | enum AppOrientation {
function appOrientationName (line 20) | String appOrientationName(AppOrientation type)
function initAppOrientation (line 31) | Future initAppOrientation()
function _fromString (line 37) | AppOrientation _fromString(String valueForm)
function chooseAppOrientation (line 48) | Future chooseAppOrientation(BuildContext context)
function appOrientationWidget (line 65) | Widget appOrientationWidget()
function _set (line 83) | void _set()
FILE: lib/basic/config/Authentication.dart
function initAuthentication (line 14) | Future<void> initAuthentication()
function currentAuthentication (line 25) | bool currentAuthentication()
function verifyAuthentication (line 29) | Future<bool> verifyAuthentication(BuildContext context)
function authenticationSetting (line 41) | Widget authenticationSetting()
FILE: lib/basic/config/AutoClean.dart
function initAutoClean (line 18) | Future<dynamic> initAutoClean()
function _currentAutoCleanSec (line 31) | String _currentAutoCleanSec()
function _chooseAutoCleanSec (line 40) | Future<void> _chooseAutoCleanSec(BuildContext context)
function autoCleanSecSetting (line 65) | Widget autoCleanSecSetting()
FILE: lib/basic/config/AutoDeleteDownloadOnUnfavorite.dart
function initAutoDeleteDownloadOnUnfavorite (line 12) | Future initAutoDeleteDownloadOnUnfavorite()
function autoDeleteDownloadOnUnfavorite (line 21) | bool autoDeleteDownloadOnUnfavorite()
function autoDeleteDownloadOnUnfavoriteSetting (line 25) | Widget autoDeleteDownloadOnUnfavoriteSetting()
FILE: lib/basic/config/AutoDownloadOnFavorite.dart
function initAutoDownloadOnFavorite (line 12) | Future initAutoDownloadOnFavorite()
function autoDownloadOnFavorite (line 21) | bool autoDownloadOnFavorite()
function autoDownloadOnFavoriteSetting (line 25) | Widget autoDownloadOnFavoriteSetting()
FILE: lib/basic/config/AutoFullScreen.dart
function initAutoFullScreen (line 12) | Future<void> initAutoFullScreen()
function currentAutoFullScreen (line 17) | bool currentAutoFullScreen()
function autoFullScreenSetting (line 21) | Widget autoFullScreenSetting()
FILE: lib/basic/config/AutoFullScreenOnForward.dart
function initAutoFullScreenOnForward (line 12) | Future<void> initAutoFullScreenOnForward()
function currentAutoFullScreenOnForward (line 17) | bool currentAutoFullScreenOnForward()
function setAutoFullScreenOnForward (line 21) | Future<void> setAutoFullScreenOnForward(bool value)
function autoFullScreenOnForwardSetting (line 26) | Widget autoFullScreenOnForwardSetting()
FILE: lib/basic/config/CategoriesColumnCount.dart
function initCategoriesColumnCount (line 14) | Future initCategoriesColumnCount()
function categoriesColumnCountSetting (line 19) | Widget categoriesColumnCountSetting()
FILE: lib/basic/config/CategoriesSort.dart
function initCategoriesSort (line 12) | Future initCategoriesSort()
function saveCategoriesSort (line 17) | Future saveCategoriesSort(List<String> categoriesSort)
function getCategoriesSort (line 23) | List<String> getCategoriesSort()
function categoriesSortSetting (line 29) | Widget categoriesSortSetting()
FILE: lib/basic/config/ChooserRoot.dart
function initChooserRoot (line 16) | Future<dynamic> initChooserRoot()
function currentChooserRoot (line 33) | Future<String> currentChooserRoot()
function _inputChooserRoot (line 48) | Future<dynamic> _inputChooserRoot(BuildContext context)
function chooserRootSetting (line 62) | Widget chooserRootSetting()
FILE: lib/basic/config/ContentFailedReloadAction.dart
type ContentFailedReloadAction (line 9) | enum ContentFailedReloadAction {
function initContentFailedReloadAction (line 17) | Future<void> initContentFailedReloadAction()
function _contentFailedReloadActionFromString (line 31) | ContentFailedReloadAction _contentFailedReloadActionFromString(String st...
function _currentContentFailedReloadActionName (line 40) | String _currentContentFailedReloadActionName()
function _chooseContentFailedReloadAction (line 49) | Future<void> _chooseContentFailedReloadAction(BuildContext context)
function contentFailedReloadActionSetting (line 59) | Widget contentFailedReloadActionSetting()
FILE: lib/basic/config/CopyFullName.dart
function initCopyFullName (line 9) | Future initCopyFullName()
function copyFullName (line 13) | bool copyFullName()
function copyFullNameSetting (line 17) | Widget copyFullNameSetting()
FILE: lib/basic/config/CopyFullNameTemplate.dart
function initCopyFullNameTemplate (line 10) | Future initCopyFullNameTemplate()
function copyFullNameTemplate (line 15) | String copyFullNameTemplate()
function copyFullNameTemplateSetting (line 19) | Widget copyFullNameTemplateSetting()
FILE: lib/basic/config/CopySkipConfirm.dart
function initCopySkipConfirm (line 9) | Future initCopySkipConfirm()
function copySkipConfirm (line 13) | bool copySkipConfirm()
function copySkipConfirmSetting (line 17) | Widget copySkipConfirmSetting()
FILE: lib/basic/config/DisableAutoDownloadOnMobile.dart
function initDisableAutoDownloadOnMobile (line 12) | Future initDisableAutoDownloadOnMobile()
function disableAutoDownloadOnMobile (line 21) | bool disableAutoDownloadOnMobile()
function disableAutoDownloadOnMobileSetting (line 25) | Widget disableAutoDownloadOnMobileSetting()
FILE: lib/basic/config/DownloadAndExportPath.dart
function initDownloadAndExportPath (line 14) | Future initDownloadAndExportPath()
function downloadAndExportPathSetting (line 23) | Widget downloadAndExportPathSetting()
FILE: lib/basic/config/DownloadCachePath.dart
function initDownloadCachePath (line 20) | Future initDownloadCachePath()
function downloadCachePathSetting (line 29) | Widget downloadCachePathSetting()
function importViewLogFromOff (line 81) | Widget importViewLogFromOff()
FILE: lib/basic/config/DownloadThreadCount.dart
function initDownloadThreadCount (line 13) | Future initDownloadThreadCount()
function downloadThreadCountSetting (line 17) | Widget downloadThreadCountSetting()
FILE: lib/basic/config/DragRegionLock.dart
function initDragRegionLock (line 11) | Future initDragRegionLock()
function dragRegionLock (line 15) | bool dragRegionLock()
function setDragRegionLock (line 19) | Future<void> setDragRegionLock(bool value)
function dragRegionLockSetting (line 24) | Widget dragRegionLockSetting()
FILE: lib/basic/config/EBookScrolling.dart
function initEBookScrolling (line 11) | Future initEBookScrolling()
function eBookScrollingSetting (line 16) | Widget eBookScrollingSetting()
FILE: lib/basic/config/EBookScrollingRange.dart
function initEBookScrollingRange (line 10) | Future initEBookScrollingRange()
function eBookScrollingRangeSetting (line 17) | Widget eBookScrollingRangeSetting()
FILE: lib/basic/config/EBookScrollingTrigger.dart
function initEBookScrollingTrigger (line 10) | Future initEBookScrollingTrigger()
function eBookScrollingTriggerSetting (line 17) | Widget eBookScrollingTriggerSetting()
FILE: lib/basic/config/ExportPath.dart
function initExportPath (line 14) | Future<dynamic> initExportPath()
function attachExportPath (line 34) | Future<String> attachExportPath()
function showExportPath (line 60) | String showExportPath()
function _setExportPath (line 67) | Future _setExportPath(String folder)
function displayExportPathInfo (line 72) | Widget displayExportPathInfo()
FILE: lib/basic/config/ExportRename.dart
function initExportRename (line 12) | Future<void> initExportRename()
function currentExportRename (line 16) | bool currentExportRename()
function exportRenameSetting (line 20) | Widget exportRenameSetting()
FILE: lib/basic/config/FullScreenAction.dart
type FullScreenAction (line 9) | enum FullScreenAction {
function initFullScreenAction (line 31) | Future<void> initFullScreenAction()
function currentFullScreenAction (line 45) | FullScreenAction currentFullScreenAction()
function _fullScreenActionFromString (line 49) | FullScreenAction _fullScreenActionFromString(String string)
function currentFullScreenActionName (line 58) | String currentFullScreenActionName()
function chooseFullScreenAction (line 67) | Future<void> chooseFullScreenAction(BuildContext context)
function fullScreenActionSetting (line 76) | Widget fullScreenActionSetting()
FILE: lib/basic/config/FullScreenUI.dart
type FullScreenUI (line 12) | enum FullScreenUI {
function initFullScreenUI (line 29) | Future<void> initFullScreenUI()
function _fullScreenUIFromString (line 50) | FullScreenUI _fullScreenUIFromString(String string)
function currentFullScreenUIName (line 59) | String currentFullScreenUIName()
function chooseFullScreenUI (line 68) | Future<void> chooseFullScreenUI(BuildContext context)
function switchFullScreenUI (line 78) | void switchFullScreenUI()
function fullScreenUISetting (line 108) | Widget fullScreenUISetting()
FILE: lib/basic/config/GestureSpeed.dart
function initGestureSpeed (line 10) | Future initGestureSpeed()
function currentGestureSpeed (line 14) | double currentGestureSpeed()
function setGestureSpeed (line 18) | Future<void> setGestureSpeed(double value)
function gestureSpeedSetting (line 23) | Widget gestureSpeedSetting()
FILE: lib/basic/config/HiddenFdIcon.dart
function initHiddenFdIcon (line 14) | Future initHiddenFdIcon()
function hiddenFdIconSetting (line 18) | Widget hiddenFdIconSetting()
FILE: lib/basic/config/HiddenSearchPersion.dart
function initHiddenSearchPersion (line 14) | Future initHiddenSearchPersion()
function hiddenSearchPersionSetting (line 19) | Widget hiddenSearchPersionSetting()
FILE: lib/basic/config/HiddenSubIcon.dart
function initHiddenSubIcon (line 14) | Future initHiddenSubIcon()
function hiddenSubIconSetting (line 19) | Widget hiddenSubIconSetting()
FILE: lib/basic/config/HiddenViewed.dart
function initHiddenViewed (line 14) | Future initHiddenViewed()
function hiddenViewedSetting (line 19) | Widget hiddenViewedSetting()
FILE: lib/basic/config/HiddenWords.dart
function initHiddenWords (line 14) | Future<String> initHiddenWords()
function saveHiddenWords (line 21) | Future<void> saveHiddenWords(List<String> words)
function addHiddenWord (line 27) | Future<void> addHiddenWord(String word)
function removeHiddenWord (line 35) | Future<void> removeHiddenWord(String word)
function clearHiddenWords (line 40) | Future<void> clearHiddenWords()
function hiddenWordsSetting (line 45) | Widget hiddenWordsSetting()
function subString (line 62) | String subString(String str)
FILE: lib/basic/config/HideOnlineFavorite.dart
function initHideOnlineFavorite (line 14) | Future initHideOnlineFavorite()
function hideOnlineFavoriteSetting (line 19) | Widget hideOnlineFavoriteSetting()
FILE: lib/basic/config/IconLoading.dart
function initIconLoading (line 14) | Future<void> initIconLoading()
function currentIconLoading (line 18) | bool currentIconLoading()
function iconLoadingSetting (line 22) | Widget iconLoadingSetting()
function mixRoute (line 38) | Route<T> mixRoute<T>({required WidgetBuilder builder})
FILE: lib/basic/config/IgnoreInfoHistory.dart
function initIgnoreInfoHistory (line 12) | Future<void> initIgnoreInfoHistory()
function currentIgnoreInfoHistory (line 17) | bool currentIgnoreInfoHistory()
function ignoreInfoHistorySetting (line 21) | Widget ignoreInfoHistorySetting()
FILE: lib/basic/config/IgnoreUpgradeConfirm.dart
function initIgnoreUpgradeConfirm (line 18) | Future<void> initIgnoreUpgradeConfirm()
function ignoreUpgradeConfirmSetting (line 27) | Widget ignoreUpgradeConfirmSetting()
FILE: lib/basic/config/ImageAddress.dart
function initImageAddress (line 19) | Future<void> initImageAddress()
function currentImageAddress (line 23) | int currentImageAddress()
function currentImageAddressName (line 27) | String currentImageAddressName()
function chooseImageAddress (line 31) | Future<void> chooseImageAddress(BuildContext context)
function imageSwitchAddressSetting (line 60) | Widget imageSwitchAddressSetting()
class ApiOptionRowImg (line 75) | class ApiOptionRowImg extends StatefulWidget {
method createState (line 82) | State<StatefulWidget> createState()
class _ApiOptionRowImgState (line 85) | class _ApiOptionRowImgState extends State<ApiOptionRowImg> {
method initState (line 89) | void initState()
method build (line 99) | Widget build(BuildContext context)
FILE: lib/basic/config/ImageFilter.dart
function processImageFilter (line 10) | Widget processImageFilter(Widget child)
function initImageFilter (line 12) | Future<void> initImageFilter()
function _imageFilterFromString (line 19) | ImageFilter _imageFilterFromString(String string)
class ImageFilter (line 28) | class ImageFilter {
function chooseImageFilter (line 80) | Future<void> chooseImageFilter(BuildContext context)
function imageFilterSetting (line 96) | Widget imageFilterSetting()
FILE: lib/basic/config/ImportNotice.dart
function importNotice (line 6) | Widget importNotice(BuildContext context)
FILE: lib/basic/config/IsPro.dart
function reloadIsPro (line 16) | Future reloadIsPro()
FILE: lib/basic/config/KeyboardController.dart
function initKeyboardController (line 15) | Future<void> initKeyboardController()
function keyboardControllerSetting (line 20) | Widget keyboardControllerSetting()
FILE: lib/basic/config/ListLayout.dart
type ListLayout (line 9) | enum ListLayout {
function initListLayout (line 28) | Future<void> initListLayout()
function _listLayoutFromString (line 40) | ListLayout _listLayoutFromString(String layoutString)
function _chooseListLayout (line 49) | void _chooseListLayout(BuildContext context)
function chooseLayoutActionButton (line 58) | IconButton chooseLayoutActionButton(BuildContext context)
FILE: lib/basic/config/LocalHistorySync.dart
function initLocalHistorySync (line 18) | Future initLocalHistorySync()
function localSync (line 33) | Future localSync()
function localHistorySyncTiles (line 43) | List<Widget> localHistorySyncTiles()
function localHistorySyncPathTile (line 49) | Widget localHistorySyncPathTile()
function localHistorySyncManualTile (line 112) | Widget localHistorySyncManualTile()
function localHistorySyncAutoTile (line 135) | Widget localHistorySyncAutoTile()
FILE: lib/basic/config/NoAnimation.dart
function initNoAnimation (line 11) | Future initNoAnimation()
function noAnimation (line 15) | bool noAnimation()
function setNoAnimation (line 19) | Future<void> setNoAnimation(bool value)
function noAnimationSetting (line 24) | Widget noAnimationSetting()
FILE: lib/basic/config/PagerAction.dart
type PagerAction (line 9) | enum PagerAction {
function initPagerAction (line 24) | Future<void> initPagerAction()
function currentPagerAction (line 33) | PagerAction currentPagerAction()
function _pagerActionFromString (line 37) | PagerAction _pagerActionFromString(String string)
function _currentPagerActionName (line 46) | String _currentPagerActionName()
function _choosePagerAction (line 55) | Future<void> _choosePagerAction(BuildContext context)
function pagerActionSetting (line 64) | Widget pagerActionSetting()
FILE: lib/basic/config/Platform.dart
function initPlatform (line 9) | Future<void> initPlatform()
FILE: lib/basic/config/Proxy.dart
function initProxy (line 11) | Future<String?> initProxy()
function currentProxyName (line 16) | String currentProxyName()
function inputProxy (line 20) | Future<dynamic> inputProxy(BuildContext context)
function proxySetting (line 34) | Widget proxySetting()
FILE: lib/basic/config/Quality.dart
function initQuality (line 30) | Future<void> initQuality()
function currentQualityCode (line 40) | String currentQualityCode()
function currentQualityName (line 44) | String currentQualityName()
function chooseQuality (line 53) | Future<void> chooseQuality(BuildContext context)
function qualitySetting (line 78) | Widget qualitySetting()
FILE: lib/basic/config/ReaderBackgroundColor.dart
function initReaderBackgroundColor (line 32) | Future<void> initReaderBackgroundColor()
function _readerBackgroundColorFromString (line 45) | ReaderBackgroundColor _readerBackgroundColorFromString(String string)
class ReaderBackgroundColor (line 54) | class ReaderBackgroundColor {
function chooseReaderBackgroundColor (line 61) | Future<void> chooseReaderBackgroundColor(BuildContext context)
function readerBackgroundColorSetting (line 77) | Widget readerBackgroundColorSetting()
FILE: lib/basic/config/ReaderDirection.dart
type ReaderDirection (line 7) | enum ReaderDirection {
function initReaderDirection (line 24) | Future<void> initReaderDirection()
function _pagerDirectionFromString (line 34) | ReaderDirection _pagerDirectionFromString(String pagerDirectionString)
function _currentReaderDirectionName (line 43) | String _currentReaderDirectionName()
function choosePagerDirection (line 55) | Future<void> choosePagerDirection(BuildContext buildContext)
function readerDirectionSetting (line 78) | Widget readerDirectionSetting()
FILE: lib/basic/config/ReaderScrollByScreenPercentage.dart
function initReaderScrollByScreenPercentage (line 10) | Future initReaderScrollByScreenPercentage()
function currentReaderScrollByScreenPercentage (line 17) | int currentReaderScrollByScreenPercentage()
function setReaderScrollByScreenPercentage (line 19) | Future<void> setReaderScrollByScreenPercentage(int value)
function readerScrollByScreenPercentageSetting (line 24) | Widget readerScrollByScreenPercentageSetting()
FILE: lib/basic/config/ReaderSliderPosition.dart
type ReaderSliderPosition (line 7) | enum ReaderSliderPosition { BOTTOM, RIGHT, LEFT }
function initReaderSliderPosition (line 20) | Future initReaderSliderPosition()
function _readerSliderPositionFromString (line 31) | ReaderSliderPosition _readerSliderPositionFromString(String str)
function currentReaderSliderPosition (line 38) | ReaderSliderPosition currentReaderSliderPosition()
function currentReaderSliderPositionName (line 40) | String currentReaderSliderPositionName()
function chooseReaderSliderPosition (line 43) | Future<void> chooseReaderSliderPosition(BuildContext context)
function readerSliderPositionSetting (line 56) | Widget readerSliderPositionSetting()
FILE: lib/basic/config/ReaderTwoPageDirection.dart
type ReaderTwoPageDirection (line 7) | enum ReaderTwoPageDirection {
function initReaderTwoPageDirection (line 24) | Future<void> initReaderTwoPageDirection()
function _pagerDirectionFromString (line 34) | ReaderTwoPageDirection _pagerDirectionFromString(String pagerDirectionSt...
function _currentReaderTwoPageDirectionName (line 43) | String _currentReaderTwoPageDirectionName()
function chooseTwoPagerDirection (line 55) | Future<void> chooseTwoPagerDirection(BuildContext buildContext)
function readerTwoPageDirectionSetting (line 78) | Widget readerTwoPageDirectionSetting()
FILE: lib/basic/config/ReaderType.dart
type ReaderType (line 7) | enum ReaderType {
type TwoPageDirection (line 25) | enum TwoPageDirection {
function _twoPageDirectionName (line 30) | String _twoPageDirectionName(TwoPageDirection direction)
function _twoPageDirectionFromString (line 39) | TwoPageDirection _twoPageDirectionFromString(String directionString)
function initReaderType (line 56) | Future<dynamic> initReaderType()
function currentReaderType (line 71) | ReaderType currentReaderType()
function _readerTypeFromString (line 75) | ReaderType _readerTypeFromString(String pagerTypeString)
function currentReaderTypeName (line 84) | String currentReaderTypeName()
function choosePagerType (line 93) | Future<void> choosePagerType(BuildContext buildContext)
function readerTypeSettings (line 116) | Widget readerTypeSettings()
function _readerTypeTile (line 129) | Widget _readerTypeTile(
function _twoPageDirectionTile (line 143) | Widget _twoPageDirectionTile(
FILE: lib/basic/config/ReaderZoomScale.dart
function setReaderZoomMinScale (line 18) | Future<void> setReaderZoomMinScale(double value)
function setReaderZoomMaxScale (line 26) | Future<void> setReaderZoomMaxScale(double value)
function setReaderZoomDoubleTapScale (line 34) | Future<void> setReaderZoomDoubleTapScale(double value)
function initReaderZoomScale (line 42) | Future<void> initReaderZoomScale()
function readerZoomMinScaleSetting (line 54) | Widget readerZoomMinScaleSetting()
function readerZoomMaxScaleSetting (line 80) | Widget readerZoomMaxScaleSetting()
function readerZoomDoubleTapScaleSetting (line 106) | Widget readerZoomDoubleTapScaleSetting()
FILE: lib/basic/config/RecommendLinks.dart
function currentRecommendLinks (line 9) | Map<String, String> currentRecommendLinks()
function initRecommendLinks (line 11) | Future<void> initRecommendLinks()
FILE: lib/basic/config/ShadowCategories.dart
function _loadShadowCategories (line 16) | Future<List<String>> _loadShadowCategories()
function _saveShadowCategories (line 22) | Future<dynamic> _saveShadowCategories(List<String> value)
function initShadowCategories (line 26) | Future<void> initShadowCategories()
function _chooseShadowCategories (line 30) | Future<void> _chooseShadowCategories(BuildContext context)
function shadowCategoriesActionButton (line 47) | Widget shadowCategoriesActionButton(BuildContext context)
function shadowCategoriesSetting (line 56) | Widget shadowCategoriesSetting()
class _ShadowCategoriesDialog (line 73) | class _ShadowCategoriesDialog extends StatefulWidget {
method createState (line 85) | State<_ShadowCategoriesDialog> createState()
class _ShadowCategoriesDialogState (line 88) | class _ShadowCategoriesDialogState extends State<_ShadowCategoriesDialog> {
method build (line 93) | Widget build(BuildContext context)
FILE: lib/basic/config/ShadowCategoriesMode.dart
type ShadowCategoriesMode (line 9) | enum ShadowCategoriesMode {
function initShadowCategoriesMode (line 24) | Future<void> initShadowCategoriesMode()
function currentShadowCategoriesMode (line 35) | ShadowCategoriesMode currentShadowCategoriesMode()
function _shadowCategoriesModeFromString (line 39) | ShadowCategoriesMode _shadowCategoriesModeFromString(String string)
function _currentShadowCategoriesMode (line 48) | String _currentShadowCategoriesMode()
function _chooseShadowCategoriesMode (line 57) | Future<void> _chooseShadowCategoriesMode(BuildContext context)
function shadowCategoriesModeSetting (line 67) | Widget shadowCategoriesModeSetting()
function shadowSwitchActionButton (line 82) | Widget shadowSwitchActionButton(BuildContext context)
FILE: lib/basic/config/ShowCommentAtDownload.dart
function initShowCommentAtDownload (line 11) | Future initShowCommentAtDownload()
function showCommentAtDownload (line 16) | bool showCommentAtDownload()
function showCommentAtDownloadSetting (line 20) | Widget showCommentAtDownloadSetting()
FILE: lib/basic/config/StartupPic.dart
function setStartupPicTile (line 11) | Widget setStartupPicTile(BuildContext context)
function clearStartupPicTile (line 25) | Widget clearStartupPicTile(BuildContext context)
function _updateStartupPicPhone (line 36) | Future<void> _updateStartupPicPhone(BuildContext context)
function _updateStartupPicDesktop (line 45) | Future<void> _updateStartupPicDesktop(BuildContext context)
function clearStartupPic (line 60) | Future<void> clearStartupPic(BuildContext context)
FILE: lib/basic/config/Themes.dart
function initFont (line 20) | Future initFont()
function _fontThemeData (line 37) | ThemeData _fontThemeData(bool dark)
function inputFont (line 45) | Future<void> inputFont(BuildContext context)
function chooseFontFromList (line 64) | Future<String?> chooseFontFromList(BuildContext context)
function chooseFont (line 93) | Future<void> chooseFont(BuildContext context)
function fontSetting (line 107) | Widget fontSetting()
function enableStatusBarColorSetting (line 130) | Widget enableStatusBarColorSetting()
class _ThemePackage (line 152) | abstract class _ThemePackage {
method code (line 153) | String code()
method name (line 155) | String name()
method themeData (line 157) | ThemeData themeData(ThemeData rawData)
method isDark (line 159) | bool isDark()
class _OriginTheme (line 162) | class _OriginTheme extends _ThemePackage {
method code (line 164) | String code()
method name (line 167) | String name()
method themeData (line 170) | ThemeData themeData(ThemeData rawData)
method isDark (line 173) | bool isDark()
class _BookTheme (line 176) | class _BookTheme extends _ThemePackage {
method code (line 178) | String code()
method name (line 181) | String name()
method themeData (line 184) | ThemeData themeData(ThemeData rawData)
method isDark (line 205) | bool isDark()
class _PinkTheme (line 208) | class _PinkTheme extends _ThemePackage {
method code (line 210) | String code()
method name (line 213) | String name()
method themeData (line 216) | ThemeData themeData(ThemeData rawData)
method isDark (line 251) | bool isDark()
class _BlackTheme (line 254) | class _BlackTheme extends _ThemePackage {
method code (line 256) | String code()
method name (line 259) | String name()
method themeData (line 262) | ThemeData themeData(ThemeData rawData)
method isDark (line 298) | bool isDark()
class _DarkTheme (line 301) | class _DarkTheme extends _ThemePackage {
method code (line 303) | String code()
method name (line 306) | String name()
method themeData (line 309) | ThemeData themeData(ThemeData rawData)
method isDark (line 353) | bool isDark()
class _DustyBlueTheme (line 356) | class _DustyBlueTheme extends _ThemePackage {
method code (line 358) | String code()
method name (line 361) | String name()
method themeData (line 364) | ThemeData themeData(ThemeData rawData)
method isDark (line 419) | bool isDark()
class _DarkBlackTheme (line 422) | class _DarkBlackTheme extends _ThemePackage {
method code (line 424) | String code()
method name (line 427) | String name()
method themeData (line 430) | ThemeData themeData(ThemeData rawData)
method isDark (line 469) | bool isDark()
function _codeToName (line 500) | String _codeToName(String? code)
function currentLightThemeName (line 509) | String currentLightThemeName()
function currentDarkThemeName (line 513) | String currentDarkThemeName()
function currentLightThemeData (line 517) | ThemeData? currentLightThemeData()
function currentDarkThemeData (line 521) | ThemeData? currentDarkThemeData()
function _themeByCode (line 527) | ThemeData? _themeByCode(String? themeCode)
function _reloadTheme (line 536) | void _reloadTheme()
function initTheme (line 546) | Future<dynamic> initTheme()
function _chooseTheme (line 560) | Future<String?> _chooseTheme(BuildContext buildContext)
function chooseLightTheme (line 582) | Future<dynamic> chooseLightTheme(BuildContext buildContext)
function chooseDarkTheme (line 591) | Future<dynamic> chooseDarkTheme(BuildContext buildContext)
function setAndroidNightMode (line 600) | Future setAndroidNightMode(bool value)
FILE: lib/basic/config/ThreeKeepRight.dart
function initThreeKeepRight (line 11) | Future initThreeKeepRight()
function threeKeepRightSetting (line 15) | Widget threeKeepRightSetting()
FILE: lib/basic/config/TimeOffsetHour.dart
function initTimeZone (line 12) | Future<void> initTimeZone()
function currentTimeOffsetHour (line 16) | int currentTimeOffsetHour()
function _chooseTimeZone (line 20) | Future<void> _chooseTimeZone(BuildContext context)
function timeZoneSetting (line 39) | Widget timeZoneSetting()
FILE: lib/basic/config/TimeoutLock.dart
function initLockTimeOut (line 23) | Future<dynamic> initLockTimeOut()
function _currentLockTimeOutSec (line 36) | String _currentLockTimeOutSec()
function _chooseLockTimeOutSec (line 45) | Future<void> _chooseLockTimeOutSec(BuildContext context)
function lockTimeOutSecSetting (line 70) | Widget lockTimeOutSecSetting()
function lockTimeOutSecNotice (line 85) | Widget lockTimeOutSecNotice()
FILE: lib/basic/config/UseApiLoadImage.dart
function initUseApiLoadImage (line 8) | Future<void> initUseApiLoadImage()
function currentUseApiLoadImageName (line 12) | String currentUseApiLoadImageName()
function useApiLoadImageSetting (line 15) | Widget useApiLoadImageSetting()
function chooseUseApiLoadImage (line 33) | Future<void> chooseUseApiLoadImage(BuildContext context)
FILE: lib/basic/config/UsingRightClickPop.dart
function initUsingRightClickPop (line 14) | Future<void> initUsingRightClickPop()
function currentUsingRightClickPop (line 19) | bool currentUsingRightClickPop()
function usingRightClickPopSetting (line 23) | Widget usingRightClickPopSetting()
FILE: lib/basic/config/Version.dart
function initVersion (line 18) | Future initVersion()
function currentVersion (line 29) | String currentVersion()
function latestVersion (line 33) | String? latestVersion()
function latestVersionInfo (line 37) | String? latestVersionInfo()
function downloadUrl (line 41) | String? downloadUrl()
function autoCheckNewVersion (line 45) | Future autoCheckNewVersion()
function manualCheckNewVersion (line 52) | Future manualCheckNewVersion(BuildContext context)
function dirtyVersion (line 62) | bool dirtyVersion()
function _versionCheck (line 67) | Future _versionCheck()
function _isServerNewer (line 82) | bool _isServerNewer(String current, String latest)
function versionPop (line 93) | void versionPop(BuildContext context)
class _SemVer (line 117) | class _SemVer {
method parse (line 124) | _SemVer? parse(String input)
method toString (line 140) | String toString()
function _isForceUpgrade (line 145) | bool _isForceUpgrade(String current, String latest)
function _openRelease (line 158) | Future<void> _openRelease(BuildContext context)
class TopConfirm (line 168) | class TopConfirm {
method topConfirm (line 169) | topConfirm(BuildContext context, String title, String message,
FILE: lib/basic/config/VolumeController.dart
function initVolumeController (line 13) | Future<void> initVolumeController()
function volumeControllerSetting (line 18) | Widget volumeControllerSetting()
FILE: lib/basic/config/VolumeNextChapter.dart
function initVolumeNextChapter (line 9) | Future initVolumeNextChapter()
function volumeNextChapter (line 14) | bool volumeNextChapter()
function volumeNextChapterSetting (line 18) | Widget volumeNextChapterSetting()
FILE: lib/basic/config/WebDav.dart
function initWebDav (line 30) | Future initWebDav()
function setUseLocalFavorite (line 79) | Future setUseLocalFavorite(bool value)
function useLocalFavoriteSetting (line 88) | Widget useLocalFavoriteSetting()
function syncLocalFavoriteToWebdav (line 104) | Future syncLocalFavoriteToWebdav(BuildContext context)
function localFavoriteSyncAutoTile (line 122) | Widget localFavoriteSyncAutoTile()
function localFavoriteSyncManualTile (line 154) | Widget localFavoriteSyncManualTile()
function syncWebDavIfAuto (line 167) | Future syncWebDavIfAuto(BuildContext context)
function syncHistoryToWebdav (line 184) | Future syncHistoryToWebdav(BuildContext context)
function uploadHistoryToWebdav (line 200) | Future uploadHistoryToWebdav(BuildContext context)
function webDavSettings (line 216) | List<Widget> webDavSettings(BuildContext context)
FILE: lib/basic/config/WebToonScrollMode.dart
type WebToonScrollMode (line 6) | enum WebToonScrollMode {
function initWebToonScrollMode (line 15) | Future initWebToonScrollMode()
function currentWebToonScrollMode (line 24) | WebToonScrollMode currentWebToonScrollMode()
function currentWebToonScrollModeName (line 26) | String currentWebToonScrollModeName()
function chooseWebToonScrollMode (line 31) | Future<void> chooseWebToonScrollMode(BuildContext context)
function webToonScrollModeSetting (line 63) | Widget webToonScrollModeSetting()
FILE: lib/basic/config/WillPopNotice.dart
function initWillPopNotice (line 9) | Future initWillPopNotice()
function willPopNotice (line 13) | bool willPopNotice()
function willPopNoticeSetting (line 17) | Widget willPopNoticeSetting()
FILE: lib/basic/config/i18n.dart
function languageListTile (line 7) | Widget languageListTile()
FILE: lib/basic/config/passed.dart
function initPassed (line 6) | Future<void> initPassed()
function currentPassed (line 10) | bool currentPassed()
function firstPassed (line 14) | Future<void> firstPassed()
FILE: lib/basic/connect.dart
function isMobileNetwork (line 7) | Future<bool> isMobileNetwork()
function checkConnectivity (line 15) | Future<void> checkConnectivity()
FILE: lib/basic/enum/ErrorTypes.dart
function errorType (line 7) | String errorType(String error)
FILE: lib/basic/enum/Sort.dart
class _Sort (line 17) | class _Sort {
FILE: lib/i18.dart
function loadTranslations (line 8) | Future<void> loadTranslations()
function putMap (line 15) | void putMap(String prefix, Map<String, dynamic> map)
function tr (line 27) | String tr(String key)
FILE: lib/i18b.dart
function setLocale (line 6) | void setLocale(BuildContext context, Locale locale)
FILE: lib/main.dart
function main (line 17) | main()
class PikapikaApp (line 34) | class PikapikaApp extends StatefulWidget {
method createState (line 38) | State<StatefulWidget> createState()
class _PikapikaAppState (line 41) | class _PikapikaAppState extends State<PikapikaApp> {
method initState (line 43) | void initState()
method dispose (line 49) | void dispose()
method _onChangeTheme (line 54) | void _onChangeTheme(EventArgs? args)
method build (line 59) | Widget build(BuildContext context)
FILE: lib/main_desktop.dart
function main (line 4) | void main()
FILE: lib/screens/AboutScreen.dart
class AboutScreen (line 13) | class AboutScreen extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _AboutScreenState (line 20) | class _AboutScreenState extends State<AboutScreen> {
method initState (line 22) | void initState()
method dispose (line 28) | void dispose()
method _onVersion (line 33) | void _onVersion(dynamic a)
method build (line 38) | Widget build(BuildContext context)
method buildScreen (line 46) | Widget buildScreen(BuildContext context)
method _buildNewVersion (line 122) | List<InlineSpan> _buildNewVersion(String? latestVersion)
method _buildDirty (line 182) | List<InlineSpan> _buildDirty()
method _openRelease (line 195) | Future _openRelease()
method _buildNewVersionInfo (line 202) | Widget _buildNewVersionInfo(String? latestVersionInfo)
FILE: lib/screens/AccessKeyReplaceScreen.dart
class AccessKeyReplaceScreen (line 8) | class AccessKeyReplaceScreen extends StatefulWidget {
method createState (line 15) | State<StatefulWidget> createState()
class _AccessKeyReplaceScreenState (line 18) | class _AccessKeyReplaceScreenState extends State<AccessKeyReplaceScreen> {
method _content (line 40) | Widget _content()
method build (line 66) | Widget build(BuildContext context)
FILE: lib/screens/AccountScreen.dart
class AccountScreen (line 23) | class AccountScreen extends StatefulWidget {
method createState (line 27) | _AccountScreenState createState()
class _AccountScreenState (line 30) | class _AccountScreenState extends State<AccountScreen> {
method initState (line 38) | void initState()
method dispose (line 49) | void dispose()
method _loadProperties (line 59) | Future _loadProperties()
method build (line 69) | Widget build(BuildContext context)
method _buildLogging (line 76) | Widget _buildLogging()
method _buildGui (line 82) | Widget _buildGui()
FILE: lib/screens/AppScreen.dart
class AppScreen (line 14) | class AppScreen extends StatefulWidget {
method createState (line 18) | State<AppScreen> createState()
class _AppScreenState (line 21) | class _AppScreenState extends State<AppScreen> {
method initState (line 25) | void initState()
method dispose (line 36) | void dispose()
method _onVersion (line 47) | void _onVersion(dynamic a)
method _onItemTapped (line 58) | void _onItemTapped(int index)
method build (line 65) | Widget build(BuildContext context)
method willPop (line 97) | Widget willPop(Scaffold body)
FILE: lib/screens/CategoriesScreen.dart
class CategoriesScreen (line 31) | class CategoriesScreen extends StatefulWidget {
method createState (line 35) | State<StatefulWidget> createState()
class _CategoriesScreenState (line 38) | class _CategoriesScreenState extends State<CategoriesScreen> {
method _fetch (line 69) | Future<List<Category>> _fetch()
method _reloadCategories (line 80) | void _reloadCategories()
method initState (line 87) | void initState()
method dispose (line 96) | void dispose()
method _onShadowChange (line 104) | void _onShadowChange(EventArgs? args)
method build (line 113) | Widget build(BuildContext context)
method _wrapItems (line 196) | List<Widget> _wrapItems(
method append (line 203) | append(Widget widget, String title, Function() onTap)
method _buildCategories (line 239) | List<CategoriesItem> _buildCategories(
method _buildChannels (line 294) | List<CategoriesItem> _buildChannels(double imageSize)
method _navigateToCategory (line 336) | void _navigateToCategory(String? categoryTitle)
class CategoriesItem (line 346) | class CategoriesItem {
FILE: lib/screens/CategoriesSortScreen.dart
class CategoriesSortScreen (line 13) | class CategoriesSortScreen extends StatefulWidget {
method createState (line 17) | _CategoriesSortScreenState createState()
class _CategoriesSortScreenState (line 20) | class _CategoriesSortScreenState extends State<CategoriesSortScreen> {
method build (line 32) | Widget build(BuildContext context)
class CategoriesSortPanel (line 67) | class CategoriesSortPanel extends StatefulWidget {
method createState (line 73) | _CategoriesSortPanelState createState()
class _CategoriesSortPanelState (line 76) | class _CategoriesSortPanelState extends State<CategoriesSortPanel> {
method build (line 90) | Widget build(BuildContext context)
method _wrapItems (line 150) | List<Widget> _wrapItems(
method append (line 158) | append(Widget widget, String title, Function() onTap)
method _buildCategories (line 227) | List<CategoriesItem> _buildCategories(
method _buildChannels (line 267) | List<CategoriesItem> _buildChannels(double imageSize)
method _saveIcon (line 294) | Widget _saveIcon()
FILE: lib/screens/CleanScreen.dart
class CleanScreen (line 12) | class CleanScreen extends StatefulWidget {
method createState (line 16) | State<StatefulWidget> createState()
class _CleanScreenState (line 19) | class _CleanScreenState extends State<CleanScreen> {
method initState (line 25) | void initState()
method dispose (line 31) | void dispose()
method _onMessageChange (line 36) | void _onMessageChange(String event)
method build (line 43) | Widget build(BuildContext context)
method buildScreen (line 51) | Widget buildScreen(BuildContext context)
method processCleanAction (line 99) | Future processCleanAction(Future Function() action)
FILE: lib/screens/CloseAppScreen.dart
class CloseAppScreen (line 6) | class CloseAppScreen extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/screens/ComicCollectionsScreen.dart
class ComicCollectionsScreen (line 11) | class ComicCollectionsScreen extends StatefulWidget {
method createState (line 15) | State<StatefulWidget> createState()
class _ComicCollectionsScreenState (line 18) | class _ComicCollectionsScreenState extends State<ComicCollectionsScreen> {
method initState (line 23) | void initState()
method dispose (line 29) | void dispose()
method build (line 35) | Widget build(BuildContext context)
method buildScreen (line 43) | Widget buildScreen(BuildContext context)
class PreferredSizeContainer (line 99) | class PreferredSizeContainer extends StatelessWidget
method build (line 114) | Widget build(BuildContext context)
FILE: lib/screens/ComicInfoScreen.dart
class ComicInfoScreen (line 33) | class ComicInfoScreen extends StatefulWidget {
method createState (line 41) | State<StatefulWidget> createState()
class _ComicInfoScreenState (line 44) | class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAwa...
method _loadComic (line 53) | Future<ComicInfo> _loadComic()
method _loadEps (line 62) | Future<List<Ep>> _loadEps()
method _loadViewLog (line 73) | Future<ViewLog?> _loadViewLog()
method _loadSubscribed (line 77) | Future<ComicSubscribe?> _loadSubscribed()
method didChangeDependencies (line 82) | void didChangeDependencies()
method didPopNext (line 88) | void didPopNext()
method initState (line 95) | void initState()
method dispose (line 104) | void dispose()
method _setState (line 111) | void _setState(dynamic args)
method build (line 116) | Widget build(BuildContext context)
method buildScreen (line 124) | Widget buildScreen(BuildContext context)
method _buildSubscribeAction (line 287) | Widget _buildSubscribeAction(
method _buildDownloadAction (line 332) | Widget _buildDownloadAction(
method _buildEpWrap (line 371) | Widget _buildEpWrap(Future<List<Ep>> _epListFuture, ComicInfo _comicInfo)
method _push (line 425) | Future _push(ComicInfo comicInfo, List<Ep> epList, int order, int? rank)
FILE: lib/screens/ComicReaderScreen.dart
class ComicReaderScreen (line 20) | class ComicReaderScreen extends StatefulWidget {
method createState (line 39) | State<StatefulWidget> createState()
class _ComicReaderScreenState (line 42) | class _ComicReaderScreenState extends State<ComicReaderScreen> {
method _load (line 49) | Future<List<RemoteImageInfo>> _load()
method _onPositionChange (line 77) | Future _onPositionChange(int position)
method _onChangeEp (line 83) | FutureOr<dynamic> _onChangeEp(int epOrder)
method _onReloadEp (line 103) | FutureOr<dynamic> _onReloadEp()
method _onDownload (line 117) | FutureOr<dynamic> _onDownload()
method initState (line 130) | void initState()
method dispose (line 143) | void dispose()
method build (line 151) | Widget build(BuildContext context)
method buildScreen (line 159) | Widget buildScreen(BuildContext context)
method _build (line 163) | Widget _build(BuildContext context)
method _onFullScreenChange (line 231) | Future _onFullScreenChange(bool fullScreen)
FILE: lib/screens/ComicSubscribesScreen.dart
class IntoComicSubscribesScreenButton (line 13) | class IntoComicSubscribesScreenButton extends StatefulWidget {
method createState (line 17) | State<IntoComicSubscribesScreenButton> createState()
class _IntoComicSubscribesScreenButtonState (line 21) | class _IntoComicSubscribesScreenButtonState
method initState (line 24) | void initState()
method dispose (line 31) | void dispose()
method _sync (line 40) | void _sync()
method build (line 45) | Widget build(BuildContext context)
class ComicSubscribesScreen (line 68) | class ComicSubscribesScreen extends StatefulWidget {
method createState (line 72) | State<ComicSubscribesScreen> createState()
class _ComicSubscribesScreenState (line 75) | class _ComicSubscribesScreenState extends State<ComicSubscribesScreen> {
method initState (line 77) | void initState()
method dispose (line 83) | void dispose()
method _setState (line 88) | void _setState(_)
method build (line 93) | Widget build(BuildContext context)
method _body (line 107) | Widget _body(BuildContext context)
function _popMenu (line 117) | Widget _popMenu(BuildContext context)
FILE: lib/screens/ComicsScreen.dart
class ComicsScreen (line 21) | class ComicsScreen extends StatefulWidget {
method createState (line 38) | State<StatefulWidget> createState()
class _ComicsScreenState (line 41) | class _ComicsScreenState extends State<ComicsScreen> {
method _chooseCategoryAction (line 75) | Widget _chooseCategoryAction()
method _load (line 114) | Future<ComicsPage> _load(String _currentSort, int _currentPage)
method build (line 132) | Widget build(BuildContext context)
method buildScreen (line 140) | Widget buildScreen(BuildContext context)
FILE: lib/screens/CommentScreen.dart
class _CommentChildPage (line 15) | class _CommentChildPage extends e.Page {
class CommentScreen (line 31) | class CommentScreen extends StatefulWidget {
method createState (line 40) | State<StatefulWidget> createState()
class _CommentScreenState (line 43) | class _CommentScreenState extends State<CommentScreen> {
method _loadPage (line 48) | Future<_CommentChildPage> _loadPage()
method _buildChildrenPager (line 65) | Widget _buildChildrenPager()
method build (line 86) | Widget build(BuildContext context)
method buildScreen (line 94) | Widget buildScreen(BuildContext context)
method _buildComment (line 120) | Widget _buildComment(CommentBase e)
method _onReply (line 124) | Future _onReply()
method _buildPostComment (line 147) | Widget _buildPostComment()
method _buildPrePage (line 173) | Widget _buildPrePage(_CommentChildPage page)
method _buildNextPage (line 194) | Widget _buildNextPage(_CommentChildPage page)
FILE: lib/screens/DesktopAuthenticationScreen.dart
function needDesktopAuthentication (line 7) | Future<bool> needDesktopAuthentication()
class VerifyPassword (line 11) | class VerifyPassword extends StatefulWidget {
method createState (line 15) | State<StatefulWidget> createState()
class _VerifyPasswordState (line 18) | class _VerifyPasswordState extends State<VerifyPassword> {
method build (line 22) | Widget build(BuildContext context)
class SetPassword (line 58) | class SetPassword extends StatefulWidget {
method createState (line 62) | State<StatefulWidget> createState()
class _SetPasswordState (line 65) | class _SetPasswordState extends State<SetPassword> {
method build (line 70) | Widget build(BuildContext context)
FILE: lib/screens/DownloadConfirmScreen.dart
class DownloadConfirmScreen (line 15) | class DownloadConfirmScreen extends StatefulWidget {
method createState (line 26) | State<StatefulWidget> createState()
class _DownloadConfirmScreenState (line 29) | class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
method _load (line 35) | Future<dynamic> _load()
method _selectAll (line 44) | void _selectAll()
method _download (line 55) | Future<dynamic> _download()
method build (line 109) | Widget build(BuildContext context)
method buildScreen (line 117) | Widget buildScreen(BuildContext context)
method _buildButtons (line 174) | Widget _buildButtons()
method _colorOfEp (line 207) | Color _colorOfEp(Ep e)
method _iconOfEp (line 217) | Icon _iconOfEp(Ep e)
method _clickOfEp (line 227) | void _clickOfEp(Ep e)
FILE: lib/screens/DownloadExportGroupScreen.dart
class DownloadExportGroupScreen (line 13) | class DownloadExportGroupScreen extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _DownloadExportGroupScreenState (line 20) | class _DownloadExportGroupScreenState extends State<DownloadExportGroupS...
method build (line 24) | Widget build(BuildContext context)
method downloadWidget (line 88) | Widget downloadWidget(DownloadComic e)
method _selectAllButton (line 121) | Widget _selectAllButton(List<String> exportableIds)
method _goToExport (line 151) | Widget _goToExport()
FILE: lib/screens/DownloadExportToFileScreen.dart
class DownloadExportToFileScreen (line 20) | class DownloadExportToFileScreen extends StatefulWidget {
method createState (line 31) | State<StatefulWidget> createState()
class _DownloadExportToFileScreenState (line 34) | class _DownloadExportToFileScreenState
method _load (line 42) | Future _load()
method initState (line 47) | void initState()
method dispose (line 53) | void dispose()
method _onMessageChange (line 58) | void _onMessageChange(event)
method build (line 65) | Widget build(BuildContext context)
method buildScreen (line 73) | Widget buildScreen(BuildContext context)
method _exportPkzButton (line 150) | Widget _exportPkzButton()
method _exportPkiButton (line 202) | Widget _exportPkiButton()
method _exportHtmlZipButton (line 254) | Widget _exportHtmlZipButton()
method _exportToHtmlJPEGButton (line 310) | Widget _exportToHtmlJPEGButton()
method _exportToHtmlPdfButton (line 364) | Widget _exportToHtmlPdfButton()
method _exportToHtmlEpubButton (line 418) | Widget _exportToHtmlEpubButton()
method _exportToHtmlPdfFolderButton (line 472) | Widget _exportToHtmlPdfFolderButton()
method _exportToJPEGSZIPButton (line 526) | Widget _exportToJPEGSZIPButton()
method _exportToHtmlJPEGNotDownOverButton (line 582) | Widget _exportToHtmlJPEGNotDownOverButton()
method _exportComicDownloadToCbzsZipButton (line 638) | Widget _exportComicDownloadToCbzsZipButton()
method _buildButtonInner (line 694) | Widget _buildButtonInner(String text)
FILE: lib/screens/DownloadExportToSocketScreen.dart
class DownloadExportToSocketScreen (line 16) | class DownloadExportToSocketScreen extends StatefulWidget {
method createState (line 29) | State<StatefulWidget> createState()
class _DownloadExportToSocketScreenState (line 32) | class _DownloadExportToSocketScreenState
method initState (line 40) | void initState()
method dispose (line 46) | void dispose()
method _onMessageChange (line 52) | void _onMessageChange(event)
method build (line 61) | Widget build(BuildContext context)
method buildScreen (line 69) | Widget buildScreen(BuildContext context)
FILE: lib/screens/DownloadExportingGroupScreen.dart
class DownloadExportingGroupScreen (line 12) | class DownloadExportingGroupScreen extends StatefulWidget {
method createState (line 19) | State<StatefulWidget> createState()
class _DownloadExportingGroupScreenState (line 22) | class _DownloadExportingGroupScreenState
method initState (line 31) | void initState()
method dispose (line 37) | void dispose()
method _onMessageChange (line 42) | void _onMessageChange(event)
method _body (line 48) | Widget _body()
method build (line 434) | Widget build(BuildContext context)
method _buildButtonInner (line 452) | Widget _buildButtonInner(String text)
FILE: lib/screens/DownloadImportScreen.dart
class DownloadImportScreen (line 22) | class DownloadImportScreen extends StatefulWidget {
method createState (line 26) | State<StatefulWidget> createState()
class _DownloadImportScreenState (line 29) | class _DownloadImportScreenState extends State<DownloadImportScreen> {
method initState (line 34) | void initState()
method dispose (line 40) | void dispose()
method _onMessageChange (line 45) | void _onMessageChange(event)
method build (line 54) | Widget build(BuildContext context)
method buildScreen (line 62) | Widget buildScreen(BuildContext context)
method _fileImportButton (line 93) | Widget _fileImportButton()
method _networkImportButton (line 177) | Widget _networkImportButton()
method _importDirFilesZipButton (line 221) | Widget _importDirFilesZipButton()
FILE: lib/screens/DownloadInfoScreen.dart
class DownloadInfoScreen (line 25) | class DownloadInfoScreen extends StatefulWidget {
method createState (line 36) | State<StatefulWidget> createState()
class _DownloadInfoScreenState (line 39) | class _DownloadInfoScreenState extends State<DownloadInfoScreen>
method _load (line 46) | Future _load()
method _loadViewLog (line 51) | Future<ViewLog?> _loadViewLog()
method didChangeDependencies (line 56) | void didChangeDependencies()
method didPopNext (line 62) | void didPopNext()
method dispose (line 69) | void dispose()
method build (line 75) | Widget build(BuildContext context)
method _bottom (line 151) | Widget _bottom()
method _chapters (line 188) | Widget _chapters()
method _push (line 222) | void _push(
FILE: lib/screens/DownloadListScreen.dart
class DownloadListScreen (line 22) | class DownloadListScreen extends StatefulWidget {
method createState (line 26) | State<StatefulWidget> createState()
class _DownloadListScreenState (line 29) | class _DownloadListScreenState extends State<DownloadListScreen> {
method _onMessageChange (line 127) | void _onMessageChange(String event)
method initState (line 141) | void initState()
method dispose (line 155) | void dispose()
method _selectAllButton (line 160) | Widget _selectAllButton(Color appBarIconColor)
method build (line 181) | Widget build(BuildContext context)
method _customFolderButton (line 255) | Widget _customFolderButton(Color appBarIconColor)
method _customFolderName (line 291) | String _customFolderName()
method downloadWidget (line 298) | Widget downloadWidget(DownloadComic e)
method selectingWidget (line 329) | Widget selectingWidget(DownloadComic e)
method _fileButton (line 385) | Widget _fileButton(Color appBarIconColor)
method _onPauseChangeClick (line 440) | Future<void> _onPauseChangeClick()
method pauseButton (line 475) | Widget pauseButton(Color appBarIconColor)
method _reloadList (line 527) | void _reloadList()
method _selectingCancelButton (line 544) | Widget _selectingCancelButton(Color appBarIconColor)
method _selectingMoveButton (line 556) | Widget _selectingMoveButton(Color appBarIconColor)
method _selectingDeleteButton (line 607) | Widget _selectingDeleteButton(Color appBarIconColor)
method _toSelectingButton (line 641) | Widget _toSelectingButton(Color appBarIconColor)
FILE: lib/screens/DownloadOnlyImportScreen.dart
class DownloadOnlyImportScreen (line 12) | class DownloadOnlyImportScreen extends StatefulWidget {
method createState (line 23) | State<StatefulWidget> createState()
class _DownloadOnlyImportScreenState (line 26) | class _DownloadOnlyImportScreenState extends State<DownloadOnlyImportScr...
method initState (line 35) | void initState()
method dispose (line 44) | void dispose()
method _onMessageChange (line 50) | void _onMessageChange(event)
method _body (line 56) | Widget _body()
method build (line 96) | Widget build(BuildContext context)
FILE: lib/screens/DownloadReaderScreen.dart
class DownloadReaderScreen (line 20) | class DownloadReaderScreen extends StatefulWidget {
method createState (line 41) | State<StatefulWidget> createState()
class _DownloadReaderScreenState (line 44) | class _DownloadReaderScreenState extends State<DownloadReaderScreen> {
method _load (line 52) | Future _load()
method _onPositionChange (line 73) | Future _onPositionChange(int position)
method _onDownload (line 79) | FutureOr<dynamic> _onDownload()
method _onChangeEp (line 83) | FutureOr<dynamic> _onChangeEp(int epOrder)
method _onReloadEp (line 103) | FutureOr<dynamic> _onReloadEp()
method initState (line 120) | void initState()
method dispose (line 133) | void dispose()
method build (line 141) | Widget build(BuildContext context)
method buildScreen (line 149) | Widget buildScreen(BuildContext context)
method _build (line 153) | Widget _build(BuildContext context)
method _onFullScreenChange (line 213) | Future _onFullScreenChange(bool fullScreen)
FILE: lib/screens/FavouritePaperScreen.dart
class FavouritePaperScreen (line 9) | class FavouritePaperScreen extends StatefulWidget {
method createState (line 13) | State<StatefulWidget> createState()
class _FavouritePaperScreen (line 16) | class _FavouritePaperScreen extends State<FavouritePaperScreen> {
method _fetch (line 17) | Future<ComicsPage> _fetch(String _currentSort, int _currentPage)
method build (line 22) | Widget build(BuildContext context)
method buildScreen (line 30) | Widget buildScreen(BuildContext context)
FILE: lib/screens/FilePhotoViewScreen.dart
class FilePhotoViewScreen (line 11) | class FilePhotoViewScreen extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
method buildScreen (line 25) | Widget buildScreen(BuildContext context)
FILE: lib/screens/ForgotPasswordScreen.dart
class ForgotPasswordScreen (line 10) | class ForgotPasswordScreen extends StatefulWidget {
method createState (line 14) | State<StatefulWidget> createState()
class _ForgotPasswordScreenState (line 17) | class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> {
method build (line 30) | Widget build(BuildContext context)
method _stateScreen (line 39) | Widget _stateScreen()
method _inputEmailScreen (line 54) | Widget _inputEmailScreen()
method _confirmEmail (line 84) | void _confirmEmail()
method _inputAnswerScreen (line 108) | Widget _inputAnswerScreen()
method _showNewPasswordScreen (line 250) | Widget _showNewPasswordScreen()
FILE: lib/screens/GameDownloadScreen.dart
class GameDownloadScreen (line 13) | class GameDownloadScreen extends StatefulWidget {
method createState (line 19) | State<StatefulWidget> createState()
class _GameDownloadScreenState (line 22) | class _GameDownloadScreenState extends State<GameDownloadScreen> {
method build (line 27) | Widget build(BuildContext context)
method buildScreen (line 35) | Widget buildScreen(BuildContext context)
method _copyCard (line 69) | Widget _copyCard(String string)
FILE: lib/screens/GameInfoScreen.dart
class GameInfoScreen (line 17) | class GameInfoScreen extends StatefulWidget {
method createState (line 23) | State<StatefulWidget> createState()
class _GameInfoScreenState (line 26) | class _GameInfoScreenState extends State<GameInfoScreen> {
method build (line 31) | Widget build(BuildContext context)
method buildScreen (line 39) | Widget buildScreen(BuildContext context)
FILE: lib/screens/GamesScreen.dart
class GamesScreen (line 15) | class GamesScreen extends StatefulWidget {
method createState (line 19) | State<StatefulWidget> createState()
class _GamesScreenState (line 22) | class _GamesScreenState extends State<GamesScreen> {
method _loadPage (line 27) | Future<GamePage> _loadPage()
method _onPageChange (line 31) | void _onPageChange(int number)
method build (line 40) | Widget build(BuildContext context)
method buildScreen (line 48) | Widget buildScreen(BuildContext context)
class GameCard (line 201) | class GameCard extends StatelessWidget {
method build (line 207) | Widget build(BuildContext context)
FILE: lib/screens/HiddenWordsScreen.dart
class HiddenWordsScreen (line 8) | class HiddenWordsScreen extends StatefulWidget {
method createState (line 12) | State<StatefulWidget> createState()
class _HiddenWordsScreenState (line 15) | class _HiddenWordsScreenState extends State<HiddenWordsScreen> {
method _addWord (line 20) | Future<void> _addWord()
method _removeWord (line 30) | Future<void> _removeWord(String word)
method _clearAll (line 38) | Future<void> _clearAll()
method dispose (line 47) | void dispose()
method build (line 53) | Widget build(BuildContext context)
method buildScreen (line 61) | Widget buildScreen(BuildContext context)
FILE: lib/screens/ImportFromOffScreen.dart
class ImportFromOffScreen (line 10) | class ImportFromOffScreen extends StatefulWidget {
method createState (line 16) | State<StatefulWidget> createState()
class _ImportFromOffScreenState (line 19) | class _ImportFromOffScreenState extends State<ImportFromOffScreen> {
method initState (line 24) | void initState()
method dispose (line 31) | void dispose()
method _onMessageChange (line 36) | void _onMessageChange(event)
method build (line 45) | Widget build(BuildContext context)
method buildScreen (line 53) | Widget buildScreen(BuildContext context)
FILE: lib/screens/InitScreen.dart
class InitScreen (line 93) | class InitScreen extends StatefulWidget {
method createState (line 97) | State<StatefulWidget> createState()
class _InitScreenState (line 100) | class _InitScreenState extends State<InitScreen> {
method _defaultLoadingPic (line 104) | Widget _defaultLoadingPic()
method _init (line 114) | Future<dynamic> _init()
method build (line 293) | Widget build(BuildContext context)
method _goApplication (line 330) | Future _goApplication()
method _goAuthentication (line 347) | Future _goAuthentication()
FILE: lib/screens/LocalFavoriteScreen.dart
class LocalFavoriteScreen (line 13) | class LocalFavoriteScreen extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
function _viewLogToComicSimple (line 21) | ComicSimple _viewLogToComicSimple(ViewLog view)
class _LocalFavoriteScreenState (line 45) | class _LocalFavoriteScreenState extends State<LocalFavoriteScreen>
method initState (line 55) | void initState()
method _loadFolders (line 60) | Future<void> _loadFolders()
method _currentFolderTitle (line 95) | String _currentFolderTitle()
method _loadComics (line 107) | Future<void> _loadComics()
method build (line 160) | Widget build(BuildContext context)
method _openFolderPicker (line 183) | Future<void> _openFolderPicker()
method _buildBody (line 241) | Widget _buildBody()
method ComicList (line 289) | Widget ComicList(List<ComicSimple> comics)
method _buildMenuButton (line 341) | Widget _buildMenuButton()
method _createFolder (line 473) | Future<void> _createFolder()
method _deleteFolder (line 537) | Future<void> _deleteFolder()
method _batchDownload (line 584) | Future<void> _batchDownload()
method _moveToFolder (line 616) | Future<void> _moveToFolder()
method _removeSelected (line 691) | Future<void> _removeSelected()
FILE: lib/screens/MigrateScreen.dart
class MigrateScreen (line 13) | class MigrateScreen extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _MigrateScreenState (line 20) | class _MigrateScreenState extends State<MigrateScreen> {
method _load (line 29) | Future _load()
method build (line 38) | Widget build(BuildContext context)
method buildScreen (line 46) | Widget buildScreen(BuildContext context)
FILE: lib/screens/ModifyPasswordScreen.dart
class ModifyPasswordScreen (line 10) | class ModifyPasswordScreen extends StatefulWidget {
method createState (line 14) | State<StatefulWidget> createState()
class _ModifyPasswordScreenState (line 17) | class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
method build (line 24) | Widget build(BuildContext context)
method buildScreen (line 32) | Widget buildScreen(BuildContext context)
method _buildForm (line 53) | Widget _buildForm()
FILE: lib/screens/NetworkSettingsScreen.dart
class NetworkSettingsScreen (line 8) | class NetworkSettingsScreen extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
method buildScreen (line 20) | Widget buildScreen(BuildContext context)
FILE: lib/screens/PkzArchiveScreen.dart
class PkzArchiveScreen (line 21) | class PkzArchiveScreen extends StatefulWidget {
method createState (line 32) | State<StatefulWidget> createState()
class _PkzArchiveScreenState (line 35) | class _PkzArchiveScreenState extends State<PkzArchiveScreen> with RouteA...
method initState (line 44) | void initState()
method didChangeDependencies (line 55) | void didChangeDependencies()
method dispose (line 61) | void dispose()
method didPopNext (line 68) | void didPopNext()
method _load (line 78) | Future _load()
method build (line 108) | Widget build(BuildContext context)
FILE: lib/screens/PkzComicInfoScreen.dart
class PkzComicInfoScreen (line 15) | class PkzComicInfoScreen extends StatefulWidget {
method createState (line 28) | State<StatefulWidget> createState()
class _PkzComicInfoScreenState (line 31) | class _PkzComicInfoScreenState extends State<PkzComicInfoScreen>
method initState (line 37) | void initState()
method didChangeDependencies (line 46) | void didChangeDependencies()
method dispose (line 52) | void dispose()
method didPopNext (line 59) | void didPopNext()
method build (line 84) | Widget build(BuildContext context)
FILE: lib/screens/PkzReaderScreen.dart
class PkzReaderScreen (line 22) | class PkzReaderScreen extends StatefulWidget {
method createState (line 50) | State<StatefulWidget> createState()
class _PkzReaderScreenState (line 53) | class _PkzReaderScreenState extends State<PkzReaderScreen> {
method initState (line 63) | void initState()
method dispose (line 89) | void dispose()
method _load (line 96) | Future _load()
method _onPositionChange (line 110) | Future _onPositionChange(int position)
method _onDownload (line 124) | FutureOr<dynamic> _onDownload()
method _onChangeEp (line 128) | FutureOr<dynamic> _onChangeEp(int epOrder)
method _onReloadEp (line 143) | FutureOr<dynamic> _onReloadEp()
method build (line 160) | Widget build(BuildContext context)
method buildScreen (line 168) | Widget buildScreen(BuildContext context)
method _build (line 172) | Widget _build(BuildContext context)
method _onFullScreenChange (line 240) | Future _onFullScreenChange(bool fullScreen)
FILE: lib/screens/ProScreen.dart
class ProScreen (line 14) | class ProScreen extends StatefulWidget {
method createState (line 18) | State<StatefulWidget> createState()
class _ProScreenState (line 21) | class _ProScreenState extends State<ProScreen> {
method initState (line 25) | void initState()
method dispose (line 36) | void dispose()
method build (line 46) | Widget build(BuildContext context)
method patPro (line 144) | List<Widget> patPro()
method addPatAccount (line 240) | void addPatAccount()
class ProServerNameWidget (line 281) | class ProServerNameWidget extends StatefulWidget {
method createState (line 285) | State<StatefulWidget> createState()
class _ProServerNameWidgetState (line 288) | class _ProServerNameWidgetState extends State<ProServerNameWidget> {
method initState (line 292) | void initState()
method build (line 302) | Widget build(BuildContext context)
method _loadServerName (line 327) | String _loadServerName()
FILE: lib/screens/RandomComicsScreen.dart
class RandomComicsScreen (line 14) | class RandomComicsScreen extends StatefulWidget {
method createState (line 18) | State<StatefulWidget> createState()
class _RandomComicsScreenState (line 21) | class _RandomComicsScreenState extends State<RandomComicsScreen> {
method build (line 24) | Widget build(BuildContext context)
method buildScreen (line 32) | Widget buildScreen(BuildContext context)
FILE: lib/screens/RankingsScreen.dart
class RankingsScreen (line 18) | class RankingsScreen extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
method buildScreen (line 30) | Widget buildScreen(BuildContext context)
class _Leaderboard (line 75) | class _Leaderboard extends StatefulWidget {
method createState (line 81) | State<StatefulWidget> createState()
class _LeaderboardState (line 84) | class _LeaderboardState extends State<_Leaderboard> {
method build (line 86) | Widget build(BuildContext context)
class _KnightLeaderBoard (line 91) | class _KnightLeaderBoard extends StatefulWidget {
method createState (line 95) | State<StatefulWidget> createState()
class _KnightLeaderBoardState (line 98) | class _KnightLeaderBoardState extends State<_KnightLeaderBoard> {
method build (line 103) | Widget build(BuildContext context)
method _knightCard (line 142) | Widget _knightCard(Knight e)
FILE: lib/screens/RegisterScreen.dart
class RegisterScreen (line 13) | class RegisterScreen extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _RegisterScreenState (line 20) | class _RegisterScreenState extends State<RegisterScreen> {
method _register (line 36) | Future _register()
method build (line 94) | Widget build(BuildContext context)
method buildScreen (line 102) | Widget buildScreen(BuildContext context)
method _genderText (line 351) | String _genderText(String gender)
FILE: lib/screens/SearchAuthorScreen.dart
class ComicSearchAuthorScreenButton (line 18) | class ComicSearchAuthorScreenButton extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
class SearchAuthorScreen (line 38) | class SearchAuthorScreen extends StatefulWidget {
method createState (line 49) | State<StatefulWidget> createState()
class _SearchAuthorScreenState (line 52) | class _SearchAuthorScreenState extends State<SearchAuthorScreen> {
method _chooseCategoryAction (line 92) | Widget _chooseCategoryAction()
method _fetch (line 118) | Future<ComicsPage> _fetch(String _currentSort, int _currentPage)
method build (line 142) | Widget build(BuildContext context)
method buildScreen (line 150) | Widget buildScreen(BuildContext context)
FILE: lib/screens/SearchScreen.dart
class SearchScreen (line 19) | class SearchScreen extends StatefulWidget {
method createState (line 30) | State<StatefulWidget> createState()
class _SearchScreenState (line 33) | class _SearchScreenState extends State<SearchScreen> {
method _chooseCategoryAction (line 72) | Widget _chooseCategoryAction()
method _fetch (line 98) | Future<ComicsPage> _fetch(String _currentSort, int _currentPage)
method build (line 118) | Widget build(BuildContext context)
method buildScreen (line 126) | Widget buildScreen(BuildContext context)
FILE: lib/screens/SettingsScreen.dart
class SettingsScreen (line 80) | class SettingsScreen extends StatefulWidget {
method createState (line 87) | State<StatefulWidget> createState()
class _SettingsScreenState (line 90) | class _SettingsScreenState extends State<SettingsScreen> {
method build (line 92) | Widget build(BuildContext context)
method buildScreen (line 100) | Widget buildScreen(BuildContext context)
method migrate (line 314) | Widget migrate(BuildContext context)
class _IconAndWidgets (line 346) | class _IconAndWidgets {
FILE: lib/screens/SpaceScreen.dart
class SpaceScreen (line 25) | class SpaceScreen extends StatefulWidget {
method createState (line 29) | State<StatefulWidget> createState()
class _SpaceScreenState (line 32) | class _SpaceScreenState extends State<SpaceScreen> {
method initState (line 34) | void initState()
method dispose (line 44) | void dispose()
method _onEvent (line 53) | void _onEvent(dynamic a)
method build (line 58) | Widget build(BuildContext context)
FILE: lib/screens/ThemeScreen.dart
class ThemeScreen (line 9) | class ThemeScreen extends StatefulWidget {
method createState (line 13) | State<StatefulWidget> createState()
class _ThemeScreenState (line 16) | class _ThemeScreenState extends State<ThemeScreen> {
method build (line 18) | Widget build(BuildContext context)
method buildScreen (line 26) | Widget buildScreen(BuildContext context)
function themeWidgets (line 36) | List<Widget> themeWidgets(
FILE: lib/screens/ViewLogsScreen.dart
class ViewLogsScreen (line 17) | class ViewLogsScreen extends StatefulWidget {
method createState (line 21) | State<StatefulWidget> createState()
class _ViewLogsScreenState (line 24) | class _ViewLogsScreenState extends State<ViewLogsScreen> {
method _clearAll (line 38) | Future _clearAll()
method _deleteSelected (line 54) | Future _deleteSelected()
method _viewSelected (line 79) | Future _viewSelected()
method _clearOnce (line 94) | Future _clearOnce(String id)
method _loadPage (line 114) | Future<dynamic> _loadPage()
method _handScroll (line 134) | void _handScroll()
method initState (line 145) | void initState()
method dispose (line 151) | void dispose()
method build (line 157) | Widget build(BuildContext context)
method _chooseComic (line 287) | void _chooseComic(String comicId)
method _decodeCate (line 298) | List<String> _decodeCate(String categories)
class ViewInfoCard (line 311) | class ViewInfoCard extends StatelessWidget {
method build (line 328) | Widget build(BuildContext context)
FILE: lib/screens/WebServerScreen.dart
class WebServerScreen (line 10) | class WebServerScreen extends StatefulWidget {
method createState (line 14) | State<StatefulWidget> createState()
class _WebServerScreenState (line 17) | class _WebServerScreenState extends State<WebServerScreen> {
method dispose (line 22) | void dispose()
method build (line 28) | Widget build(BuildContext context)
method buildScreen (line 36) | Widget buildScreen(BuildContext context)
FILE: lib/screens/calculator_screen.dart
class CalculatorScreen (line 7) | class CalculatorScreen extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
class ContentBody (line 20) | class ContentBody extends StatefulWidget {
method createState (line 24) | State<StatefulWidget> createState()
class ContentBodyState (line 27) | class ContentBodyState extends State<ContentBody> {
method build (line 41) | Widget build(BuildContext context)
FILE: lib/screens/components/Avatar.dart
class Avatar (line 9) | class Avatar extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/screens/components/Badge.dart
class Badged (line 4) | class Badged extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/screens/components/BottomSheetInput.dart
function showInputModalBottomSheet (line 6) | Future showInputModalBottomSheet({
class BottomSheetInput (line 26) | class BottomSheetInput extends StatefulWidget {
method createState (line 39) | State<StatefulWidget> createState()
class _BottomSheetInputState (line 42) | class _BottomSheetInputState extends State<BottomSheetInput> {
method initState (line 47) | void initState()
method build (line 59) | Widget build(BuildContext context)
method _buildTextField (line 157) | Widget _buildTextField()
FILE: lib/screens/components/ComicDescriptionCard.dart
class ComicDescriptionCard (line 4) | class ComicDescriptionCard extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/screens/components/ComicInfoCard.dart
class ComicInfoCard (line 25) | class ComicInfoCard extends StatefulWidget {
method createState (line 38) | State<StatefulWidget> createState()
class _ComicInfoCard (line 41) | class _ComicInfoCard extends State<ComicInfoCard> {
method initState (line 48) | void initState()
method _loadLocalFavoriteStatus (line 55) | Future<void> _loadLocalFavoriteStatus()
method _encodeComicSimpleInfo (line 66) | String _encodeComicSimpleInfo(ComicSimple info)
method build (line 85) | Widget build(BuildContext context)
method _changeFavourite (line 346) | Future _changeFavourite()
method _maybeAutoDownloadOnFavorite (line 368) | Future<void> _maybeAutoDownloadOnFavorite()
method _maybeAutoDeleteOnUnfavorite (line 390) | Future<void> _maybeAutoDeleteOnUnfavorite()
method _changeLike (line 405) | Future _changeLike()
method _changeLocalFavorite (line 421) | Future<void> _changeLocalFavorite()
method _showFolderSelector (line 475) | Future<void> _showFolderSelector()
method _createNewFolder (line 591) | Future<void> _createNewFolder()
method _addToFolder (line 644) | Future<void> _addToFolder(String folderId)
function buildFinished (line 680) | Widget buildFinished(bool comicFinished)
function buildViewed (line 705) | List<Widget> buildViewed(viewed)
FILE: lib/screens/components/ComicList.dart
class ComicListController (line 21) | class ComicListController {
class ComicList (line 42) | class ComicList extends StatefulWidget {
method createState (line 58) | State<StatefulWidget> createState()
class _ComicListState (line 61) | class _ComicListState extends State<ComicList> {
method _loadViewed (line 83) | Future _loadViewed()
method initState (line 94) | void initState()
method dispose (line 102) | void dispose()
method _onLayoutChange (line 110) | void _onLayoutChange(EventArgs? args)
method build (line 115) | Widget build(BuildContext context)
method _buildInfoCardList (line 128) | Widget _buildInfoCardList()
method _buildGridImageWarp (line 309) | Widget _buildGridImageWarp()
method _buildGridImageTitleWarp (line 540) | Widget _buildGridImageTitleWarp()
FILE: lib/screens/components/ComicListBuilder.dart
class ComicListBuilder (line 10) | class ComicListBuilder extends StatefulWidget {
method createState (line 16) | State<StatefulWidget> createState()
class _ComicListBuilderState (line 19) | class _ComicListBuilderState extends State<ComicListBuilder> {
method initState (line 24) | void initState()
method dispose (line 30) | void dispose()
method _onShadowChange (line 35) | void _onShadowChange(EventArgs? args)
method _reload (line 39) | Future _reload()
method build (line 47) | Widget build(BuildContext context)
FILE: lib/screens/components/ComicPager.dart
class ComicPager (line 17) | class ComicPager extends StatefulWidget {
method createState (line 31) | State<StatefulWidget> createState()
class _ComicPagerState (line 34) | class _ComicPagerState extends State<ComicPager> {
method initState (line 36) | void initState()
method dispose (line 42) | void dispose()
method _onShadowChange (line 47) | void _onShadowChange(EventArgs? args)
method build (line 52) | Widget build(BuildContext context)
class ControllerComicPager (line 72) | class ControllerComicPager extends StatefulWidget {
method createState (line 85) | State<StatefulWidget> createState()
class _ControllerComicPagerState (line 88) | class _ControllerComicPagerState extends State<ControllerComicPager> {
method _load (line 95) | Future<dynamic> _load()
method initState (line 102) | void initState()
method build (line 108) | Widget build(BuildContext context)
method _buildAppBar (line 138) | PreferredSize _buildAppBar(ComicsPage comicsPage, BuildContext context)
method _buildNextButton (line 261) | Widget? _buildNextButton(ComicsPage comicsPage)
class StreamComicPager (line 279) | class StreamComicPager extends StatefulWidget {
method createState (line 292) | State<StatefulWidget> createState()
class _StreamComicPagerState (line 295) | class _StreamComicPagerState extends State<StreamComicPager> {
method _onScroll (line 316) | void _onScroll()
method _load (line 327) | Future<dynamic> _load()
method _fetch (line 334) | Future<dynamic> _fetch()
method initState (line 361) | void initState()
method dispose (line 368) | void dispose()
method build (line 376) | Widget build(BuildContext context)
method _buildAppBar (line 388) | PreferredSize _buildAppBar(BuildContext context)
method _buildLoadingCell (line 489) | Widget? _buildLoadingCell()
FILE: lib/screens/components/ComicTagsCard.dart
class ComicTagsCard (line 6) | class ComicTagsCard extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/screens/components/CommentItem.dart
class ComicCommentItem (line 11) | class ComicCommentItem extends StatefulWidget {
method createState (line 20) | State<StatefulWidget> createState()
class _ComicCommentItemState (line 23) | class _ComicCommentItemState extends State<ComicCommentItem> {
method build (line 27) | Widget build(BuildContext context)
FILE: lib/screens/components/CommentList.dart
class _CommentBasePage (line 14) | class _CommentBasePage extends e.Page {
class CommentList (line 31) | class CommentList extends StatefulWidget {
method createState (line 38) | State<StatefulWidget> createState()
class _CommentListState (line 41) | class _CommentListState extends State<CommentList> {
method _loadPage (line 45) | Future<_CommentBasePage> _loadPage()
method build (line 59) | Widget build(BuildContext context)
method _buildComment (line 84) | Widget _buildComment(CommentBase comment)
method _buildPostComment (line 98) | Widget _buildPostComment()
method _buildPrePage (line 143) | Widget _buildPrePage(_CommentBasePage page)
method _buildNextPage (line 163) | Widget _buildNextPage(_CommentBasePage page)
FILE: lib/screens/components/CommentMainType.dart
type CommentMainType (line 1) | enum CommentMainType {
FILE: lib/screens/components/Common.dart
function commonPopMenu (line 11) | Widget commonPopMenu(
FILE: lib/screens/components/CommonData.dart
function updateSubscribed (line 10) | Future updateSubscribed()
function updateSubscribedForce (line 15) | Future updateSubscribedForce()
function _update (line 20) | Future _update()
function removeAllSubscribed (line 29) | Future removeAllSubscribed()
function subscribedViewed (line 35) | Future subscribedViewed(String id)
FILE: lib/screens/components/ContentBuilder.dart
class ContentBuilder (line 6) | class ContentBuilder<T> extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/screens/components/ContentError.dart
class ContentError (line 7) | class ContentError extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: lib/screens/components/ContentLoading.dart
class ContentLoading (line 4) | class ContentLoading extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/screens/components/ContentMessage.dart
class ContentMessage (line 6) | class ContentMessage extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/screens/components/ContinueReadButton.dart
class ContinueReadButton (line 6) | class ContinueReadButton extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _ContinueReadButtonState (line 20) | class _ContinueReadButtonState extends State<ContinueReadButton> {
method build (line 22) | Widget build(BuildContext context)
FILE: lib/screens/components/DesktopCropper.dart
class DesktopCropper (line 8) | class DesktopCropper extends StatefulWidget {
method createState (line 21) | State<StatefulWidget> createState()
class _DesktopCropperState (line 24) | class _DesktopCropperState extends State<DesktopCropper> {
method dispose (line 30) | void dispose()
method build (line 36) | Widget build(BuildContext context)
method _finish (line 56) | Future _finish()
FILE: lib/screens/components/DownloadComicsScreen.dart
class DownloadComicsScreen (line 8) | class DownloadComicsScreen extends StatefulWidget {
method createState (line 14) | State<StatefulWidget> createState()
class _DownloadComicsScreenState (line 17) | class _DownloadComicsScreenState extends State<DownloadComicsScreen> {
method initState (line 25) | void initState()
method dispose (line 31) | void dispose()
method _onMessageChange (line 36) | void _onMessageChange(event)
method build (line 43) | Widget build(BuildContext context)
method _body (line 61) | Widget _body()
method _buildButtonInner (line 109) | Widget _buildButtonInner(String text)
FILE: lib/screens/components/DownloadInfoCard.dart
class DownloadInfoCard (line 14) | class DownloadInfoCard extends StatelessWidget {
method build (line 27) | Widget build(BuildContext context)
FILE: lib/screens/components/FitButton.dart
class FitButton (line 3) | class FitButton extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/screens/components/GameTitleCard.dart
class GameTitleCard (line 9) | class GameTitleCard extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/screens/components/GoDownloadSelect.dart
function downAppBar (line 8) | AppBar downAppBar(
FILE: lib/screens/components/ImageReader.dart
class _ReaderControllerEventArgs (line 54) | class _ReaderControllerEventArgs extends EventArgs {
function readerKeyboardHolder (line 60) | Widget readerKeyboardHolder(Widget widget)
function _onVolumeEvent (line 83) | void _onVolumeEvent(dynamic args)
function addVolumeListen (line 96) | void addVolumeListen()
function delVolumeListen (line 104) | void delVolumeListen()
class PkzFile (line 115) | class PkzFile {
class ImageReaderItemPosition (line 122) | class ImageReaderItemPosition {
class ReaderImageInfo (line 131) | class ReaderImageInfo {
class ImageReaderStruct (line 153) | class ImageReaderStruct {
class ImageReader (line 183) | class ImageReader extends StatefulWidget {
method createState (line 189) | State<StatefulWidget> createState()
class _ImageReaderState (line 192) | class _ImageReaderState extends State<ImageReader> {
method build (line 206) | Widget build(BuildContext context)
class _ImageReaderContent (line 219) | class _ImageReaderContent extends StatefulWidget {
method createState (line 236) | State<StatefulWidget> createState()
class _ImageReaderContentState (line 254) | abstract class _ImageReaderContentState extends State<_ImageReaderConten...
method _buildViewer (line 258) | Widget _buildViewer()
method _buildViewerProcess (line 260) | Widget _buildViewerProcess()
method _sliderDraggingText (line 269) | Widget _sliderDraggingText()
method _needJumpTo (line 289) | void _needJumpTo(int index, bool animation)
method _needScrollForward (line 291) | void _needScrollForward()
method _needScrollBackward (line 293) | void _needScrollBackward()
method _onPositionsChange (line 303) | void _onPositionsChange(List<ImageReaderItemPosition> positions)
method _commonWebToonScrollForward (line 310) | void _commonWebToonScrollForward(
method _commonWebToonScrollBackward (line 347) | void _commonWebToonScrollBackward(
method initState (line 381) | void initState()
method dispose (line 392) | void dispose()
method _onPageControl (line 400) | void _onPageControl(_ReaderControllerEventArgs? args)
method _initCurrent (line 477) | void _initCurrent()
method _onCurrentChange (line 488) | void _onCurrentChange(int index)
method build (line 501) | Widget build(BuildContext context)
method _buildBar (line 542) | Widget _buildBar(Widget child)
method _buildAppBar (line 626) | Widget _buildAppBar()
method _buildSliderBottom (line 643) | Widget _buildSliderBottom()
method _buildSliderLeft (line 656) | Widget _buildSliderLeft()
method _buildSliderRight (line 681) | Widget _buildSliderRight()
method _buildSliderWidget (line 706) | Widget _buildSliderWidget(Axis axis)
method _buildFullScreenControllerStackItem (line 749) | Widget _buildFullScreenControllerStackItem()
method _buildTouchOnceControllerAction (line 820) | Widget _buildTouchOnceControllerAction(Widget child)
method _buildTouchDoubleControllerAction (line 830) | Widget _buildTouchDoubleControllerAction(Widget child)
method _buildTouchDoubleOnceNextControllerAction (line 840) | Widget _buildTouchDoubleOnceNextControllerAction(Widget child)
method _buildThreeAreaControllerAction (line 853) | Widget _buildThreeAreaControllerAction()
method _onChooseEp (line 925) | Future _onChooseEp()
method _onMoreSetting (line 943) | Future _onMoreSetting()
method _fullscreenController (line 974) | bool _fullscreenController()
method _onNextAction (line 989) | Future _onNextAction()
method _hasNextEp (line 997) | bool _hasNextEp()
method _topBarHeight (line 1011) | double _topBarHeight()
method _bottomBarHeight (line 1013) | double _bottomBarHeight()
class _EpChooser (line 1017) | class _EpChooser extends StatefulWidget {
method createState (line 1025) | State<StatefulWidget> createState()
class _EpChooserState (line 1028) | class _EpChooserState extends State<_EpChooser> {
method build (line 1030) | Widget build(BuildContext context)
class _SettingPanel (line 1065) | class _SettingPanel extends StatefulWidget {
method createState (line 1072) | State<StatefulWidget> createState()
class _SettingPanelState (line 1075) | class _SettingPanelState extends State<_SettingPanel> {
method build (line 1077) | Widget build(BuildContext context)
method _chooseTile (line 1265) | Widget _chooseTile({
method _actionTile (line 1295) | Widget _actionTile({
method _switchTile (line 1308) | Widget _switchTile({
method _sliderTile (line 1325) | Widget _sliderTile({
class _WebToonReaderState (line 1365) | class _WebToonReaderState extends _ImageReaderContentState {
method initState (line 1375) | void initState()
method _onScroll (line 1398) | void _onScroll(double delta)
method dispose (line 1417) | void dispose()
method _onListCurrentChange (line 1423) | void _onListCurrentChange()
method _needJumpTo (line 1434) | void _needJumpTo(int index, bool animation)
method _needScrollForward (line 1452) | void _needScrollForward()
method _needScrollBackward (line 1470) | void _needScrollBackward()
method _buildViewer (line 1488) | Widget _buildViewer()
method _buildList (line 1497) | Widget _buildList()
method onTrueSize (line 1535) | onTrueSize(Size size)
method _buildNextEp (line 1606) | Widget _buildNextEp()
class _WebToonDownloadImage (line 1632) | class _WebToonDownloadImage extends _WebToonReaderImage {
method imageData (line 1654) | Future<RemoteImageData> imageData()
class _WebToonPkzImage (line 1670) | class _WebToonPkzImage extends StatelessWidget {
method build (line 1688) | Widget build(BuildContext context)
class _WebToonRemoteImage (line 1700) | class _WebToonRemoteImage extends _WebToonReaderImage {
method imageData (line 1712) | Future<RemoteImageData> imageData()
class _WebToonReaderImage (line 1718) | abstract class _WebToonReaderImage extends StatefulWidget {
method createState (line 1725) | State<StatefulWidget> createState()
method imageData (line 1727) | Future<RemoteImageData> imageData()
class _WebToonReaderImageState (line 1730) | class _WebToonReaderImageState extends State<_WebToonReaderImage> {
method _load (line 1733) | Future<RemoteImageData> _load()
method build (line 1743) | Widget build(BuildContext context)
class _WebToonZoomReaderState (line 1788) | class _WebToonZoomReaderState extends _ImageReaderContentState {
method initState (line 1798) | void initState()
method _onScroll (line 1821) | void _onScroll(double delta)
method dispose (line 1830) | void dispose()
method _onListCurrentChange (line 1836) | void _onListCurrentChange()
method _needJumpTo (line 1847) | void _needJumpTo(int index, bool animation)
method _needScrollForward (line 1865) | void _needScrollForward()
method _needScrollBackward (line 1883) | void _needScrollBackward()
method _buildViewer (line 1911) | Widget _buildViewer()
method _buildList (line 1920) | Widget _buildList()
method onTrueSize (line 1955) | onTrueSize(Size size)
method _buildNextEp (line 2033) | Widget _buildNextEp()
class _ListViewReaderState (line 2062) | class _ListViewReaderState extends _ImageReaderContentState
method initState (line 2075) | void initState()
method _onScroll (line 2093) | void _onScroll()
method dispose (line 2104) | void dispose()
method _needJumpTo (line 2112) | void _needJumpTo(int index, bool animation)
method _needScrollForward (line 2117) | void _needScrollForward()
method _needScrollBackward (line 2148) | void _needScrollBackward()
method _buildViewer (line 2160) | Widget _buildViewer()
method _buildList (line 2169) | Widget _buildList()
method onTrueSize (line 2207) | onTrueSize(Size size)
method _buildNextEp (line 2289) | Widget _buildNextEp()
method _handleDoubleTapDown (line 2312) | void _handleDoubleTapDown(TapDownDetails details)
method _handleDoubleTap (line 2316) | void _handleDoubleTap()
class _GalleryReaderState (line 2340) | class _GalleryReaderState extends _ImageReaderContentState {
method initState (line 2347) | void initState()
method dispose (line 2389) | void dispose()
method _needJumpTo (line 2395) | void _needJumpTo(int index, bool animation)
method _needScrollForward (line 2411) | void _needScrollForward()
method _needScrollBackward (line 2414) | void _needScrollBackward()
method fn (line 2417) | fn()
method _onLongPress (line 2432) | Future _onLongPress()
method load (line 2438) | Future<String> load()
method _onGalleryPageChange (line 2472) | void _onGalleryPageChange(int to)
method _buildViewer (line 2489) | Widget _buildViewer()
method _buildNextEpController (line 2529) | Widget _buildNextEpController()
class _TwoPageGalleryReaderState (line 2571) | class _TwoPageGalleryReaderState extends _ImageReaderContentState {
method initState (line 2580) | void initState()
method dispose (line 2711) | void dispose()
method _needJumpTo (line 2717) | void _needJumpTo(int index, bool animation)
method _needScrollBackward (line 2733) | void _needScrollBackward()
method _needScrollForward (line 2738) | void _needScrollForward()
method fn (line 2743) | fn()
method _buildViewer (line 2759) | Widget _buildViewer()
method _onGalleryPageChange (line 2771) | void _onGalleryPageChange(int to)
method _buildNextEpController (line 2789) | Widget _buildNextEpController()
method _onLongPress (line 2828) | Future _onLongPress()
function invertColor (line 2867) | Color invertColor(Color color)
FILE: lib/screens/components/Images.dart
class ResourceFileImageProvider (line 17) | class ResourceFileImageProvider
method load (line 25) | ImageStreamCompleter load(
method obtainKey (line 36) | Future<ResourceFileImageProvider> obtainKey(
method _loadAsync (line 41) | Future<ui.Codec> _loadAsync(ResourceFileImageProvider key)
method toString (line 59) | String toString()
class ResourceDownloadFileImageProvider (line 66) | class ResourceDownloadFileImageProvider
method load (line 74) | ImageStreamCompleter load(
method obtainKey (line 85) | Future<ResourceDownloadFileImageProvider> obtainKey(
method _loadAsync (line 90) | Future<ui.Codec> _loadAsync(ResourceDownloadFileImageProvider key)
method toString (line 107) | String toString()
class ResourceRemoteImageProvider (line 114) | class ResourceRemoteImageProvider
method load (line 123) | ImageStreamCompleter load(
method obtainKey (line 134) | Future<ResourceRemoteImageProvider> obtainKey(
method _loadAsync (line 139) | Future<ui.Codec> _loadAsync(ResourceRemoteImageProvider key)
method toString (line 160) | String toString()
class DownloadImage (line 168) | class DownloadImage extends StatefulWidget {
method createState (line 181) | State<StatefulWidget> createState()
class _DownloadImageState (line 184) | class _DownloadImageState extends State<DownloadImage> {
method build (line 188) | Widget build(BuildContext context)
class RemoteImage (line 199) | class RemoteImage extends StatefulWidget {
method createState (line 216) | State<StatefulWidget> createState()
class _RemoteImageState (line 219) | class _RemoteImageState extends State<RemoteImage> {
method initState (line 224) | void initState()
method build (line 236) | Widget build(BuildContext context)
function pathFutureImage (line 250) | Widget pathFutureImage(Future<String> future, double? width, double? hei...
function buildSvg (line 275) | Widget buildSvg(String source, double? width, double? height,
function buildMock (line 293) | Widget buildMock(double? width, double? height)
function buildError (line 310) | Widget buildError(double? width, double? height)
function buildLoading (line 328) | Widget buildLoading(double? width, double? height)
function buildFile (line 346) | Widget buildFile(String file, double? width, double? height,
FILE: lib/screens/components/ItemBuilder.dart
class ItemBuilder (line 4) | class ItemBuilder<T> extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: lib/screens/components/LinkToComicInfo.dart
class LinkToComicInfo (line 6) | class LinkToComicInfo extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/screens/components/ListView.dart
class PikaListView (line 7) | class PikaListView extends StatefulWidget {
method createState (line 22) | State<StatefulWidget> createState()
class _PikaListViewState (line 25) | class _PikaListViewState extends State<PikaListView> {
method initState (line 29) | void initState()
method dispose (line 37) | void dispose()
method build (line 48) | Widget build(BuildContext context)
FILE: lib/screens/components/MouseAndTouchScrollBehavior.dart
class MouseAndTouchScrollBehavior (line 6) | class MouseAndTouchScrollBehavior extends MaterialScrollBehavior {
FILE: lib/screens/components/NetworkSetting.dart
class NetworkSetting (line 8) | class NetworkSetting extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/screens/components/PkzComicInfoCard.dart
class PkzComicInfoCard (line 16) | class PkzComicInfoCard extends StatefulWidget {
method createState (line 31) | State<StatefulWidget> createState()
class _ComicInfoCard (line 34) | class _ComicInfoCard extends State<PkzComicInfoCard> {
method build (line 36) | Widget build(BuildContext context)
FILE: lib/screens/components/PkzImages.dart
class PkzImageProvider (line 9) | class PkzImageProvider extends ImageProvider<PkzImageProvider> {
method load (line 17) | ImageStreamCompleter load(
method obtainKey (line 28) | Future<PkzImageProvider> obtainKey(ImageConfiguration configuration)
method _loadAsync (line 32) | Future<ui.Codec> _loadAsync(PkzImageProvider key)
method toString (line 52) | String toString()
class PkzImage (line 60) | class PkzImage extends StatefulWidget {
method createState (line 77) | State<StatefulWidget> createState()
class _PkzImageState (line 80) | class _PkzImageState extends State<PkzImage> {
method initState (line 84) | void initState()
method build (line 90) | Widget build(BuildContext context)
class PkzLoadingImage (line 109) | class PkzLoadingImage extends StatefulWidget {
method createState (line 128) | State<StatefulWidget> createState()
class _PkzLoadingImageState (line 131) | class _PkzLoadingImageState extends State<PkzLoadingImage> {
method initState (line 136) | void initState()
method build (line 157) | Widget build(BuildContext context)
FILE: lib/screens/components/RecommendLinksPanel.dart
class RecommendLinksPanel (line 5) | class RecommendLinksPanel extends StatefulWidget {
method createState (line 14) | State<StatefulWidget> createState()
class _RecommendLinksPanelState (line 17) | class _RecommendLinksPanelState extends State<RecommendLinksPanel> {
method initState (line 19) | void initState()
method dispose (line 25) | void dispose()
method _setState (line 30) | void _setState(_)
method build (line 35) | Widget build(BuildContext context)
FILE: lib/screens/components/Recommendation.dart
class Recommendation (line 11) | class Recommendation extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _RecommendationState (line 20) | class _RecommendationState extends State<Recommendation> {
method build (line 24) | Widget build(BuildContext context)
FILE: lib/screens/components/RightClickPop.dart
function rightClickPop (line 5) | Widget rightClickPop({
FILE: lib/screens/components/TimeoutLock.dart
class TimeoutLock (line 8) | class TimeoutLock extends StatefulWidget {
method createState (line 14) | State<StatefulWidget> createState()
class _TimeoutLockState (line 17) | class _TimeoutLockState extends State<TimeoutLock> with WidgetsBindingOb...
method initState (line 22) | void initState()
method dispose (line 28) | void dispose()
method didChangeAppLifecycleState (line 34) | void didChangeAppLifecycleState(AppLifecycleState state)
method build (line 68) | Widget build(BuildContext context)
class TimeoutScreen (line 73) | class TimeoutScreen extends StatelessWidget {
method build (line 77) | Widget build(BuildContext context)
FILE: lib/screens/components/UserProfileCard.dart
class UserProfileCard (line 23) | class UserProfileCard extends StatefulWidget {
method createState (line 27) | State<StatefulWidget> createState()
class _UserProfileCardState (line 30) | class _UserProfileCardState extends State<UserProfileCard> {
method _load (line 33) | Future<UserProfile> _load()
method initState (line 44) | void initState()
method dispose (line 49) | void dispose()
method build (line 54) | Widget build(BuildContext context)
method _updateAvatarPhone (line 178) | Future _updateAvatarPhone()
method _updateAvatarDesktop (line 214) | Future _updateAvatarDesktop()
method _reload (line 237) | void _reload()
FILE: lib/screens/components/flutter_search_bar.dart
type Widget (line 6) | typedef Widget AppBarCallback(BuildContext context);
type TextFieldSubmitCallback (line 7) | typedef void TextFieldSubmitCallback(String value);
type TextFieldChangeCallback (line 8) | typedef void TextFieldChangeCallback(String value);
type SetStateCallback (line 9) | typedef void SetStateCallback(void fn());
class SearchBar (line 11) | class SearchBar {
method beginSearch (line 104) | void beginSearch(context)
method buildAppBar (line 119) | AppBar buildAppBar(BuildContext context)
method buildSearchBar (line 129) | AppBar buildSearchBar(BuildContext context)
method getSearchAction (line 195) | IconButton getSearchAction(BuildContext context)
method build (line 204) | AppBar build(BuildContext context)
FILE: lib/screens/components/gesture_zoom_box.dart
class GestureZoomBox (line 4) | class GestureZoomBox extends StatefulWidget {
method createState (line 25) | State<StatefulWidget> createState()
class _GestureZoomBoxState (line 30) | class _GestureZoomBoxState extends State<GestureZoomBox>
method initState (line 46) | void initState()
method build (line 51) | Widget build(BuildContext context)
method dispose (line 74) | void dispose()
FILE: linux/flutter/generated_plugin_registrant.cc
function fl_register_plugins (line 11) | void fl_register_plugins(FlPluginRegistry* registry) {
FILE: linux/main.cc
function main (line 3) | int main(int argc, char** argv) {
FILE: linux/my_application.cc
type _MyApplication (line 10) | struct _MyApplication {
function my_application_activate (line 18) | static void my_application_activate(GApplication* application) {
function gboolean (line 67) | static gboolean my_application_local_command_line(GApplication* applicat...
function my_application_dispose (line 86) | static void my_application_dispose(GObject *object) {
function my_application_class_init (line 92) | static void my_application_class_init(MyApplicationClass* klass) {
function my_application_init (line 98) | static void my_application_init(MyApplication* self) {}
function MyApplication (line 100) | MyApplication* my_application_new() {
FILE: scripts/json_compairer.py
function flatten_json (line 12) | def flatten_json(data: Dict[str, Any], parent_key: str = '', separator: ...
function unflatten_json (line 33) | def unflatten_json(data: Dict[str, Any], separator: str = '.') -> Dict[s...
function load_json_file (line 55) | def load_json_file(file_path: str) -> Dict[str, Any]:
function save_json_file (line 78) | def save_json_file(file_path: str, data: Dict[str, Any]) -> bool:
function get_all_json_files (line 97) | def get_all_json_files(translations_dir: str) -> List[str]:
function find_reference_value (line 114) | def find_reference_value(key: str, all_data: Dict[str, Dict[str, Any]]) ...
function generate_missing_keys_report (line 162) | def generate_missing_keys_report(translations_dir: str, output_file: Uni...
function fix_missing_keys (line 240) | def fix_missing_keys(translations_dir: str, dry_run: bool = True):
function compare_translation_files (line 309) | def compare_translation_files(translations_dir: str):
function main (line 400) | def main():
FILE: test/widget_test.dart
function main (line 13) | void main()
FILE: windows/flutter/generated_plugin_registrant.cc
function RegisterPlugins (line 12) | void RegisterPlugins(flutter::PluginRegistry* registry) {
FILE: windows/runner/flutter_window.cpp
function LRESULT (line 43) | LRESULT
FILE: windows/runner/flutter_window.h
function class (line 13) | class FlutterWindow : public Win32Window {
FILE: windows/runner/main.cpp
function wWinMain (line 9) | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
FILE: windows/runner/run_loop.h
function class (line 11) | class RunLoop {
FILE: windows/runner/utils.cpp
function CreateAndAttachConsole (line 10) | void CreateAndAttachConsole() {
function GetCommandLineArguments (line 24) | std::vector<std::string> GetCommandLineArguments() {
function Utf8FromUtf16 (line 44) | std::string Utf8FromUtf16(const wchar_t* utf16_string) {
FILE: windows/runner/win32_window.cpp
function Scale (line 18) | int Scale(int source, double scale_factor) {
function EnableFullDpiSupportIfAvailable (line 24) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
class WindowClassRegistrar (line 41) | class WindowClassRegistrar {
method WindowClassRegistrar (line 46) | static WindowClassRegistrar* GetInstance() {
method WindowClassRegistrar (line 62) | WindowClassRegistrar() = default;
function wchar_t (line 71) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
function LRESULT (line 133) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
function LRESULT (line 152) | LRESULT
function Win32Window (line 208) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
function RECT (line 224) | RECT Win32Window::GetClientArea() {
function HWND (line 230) | HWND Win32Window::GetHandle() {
FILE: windows/runner/win32_window.h
type Size (line 21) | struct Size {
Condensed preview — 319 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,428K chars).
[
{
"path": ".fvmrc",
"chars": 25,
"preview": "{\n \"flutter\": \"3.13.9\"\n}"
},
{
"path": ".github/workflows/Package.core.yml",
"chars": 2982,
"preview": "name: Package-core\non:\n workflow_dispatch:\n\nenv:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n GO_VERSION: \"1.24\"\n NDK"
},
{
"path": ".github/workflows/Package.yml",
"chars": 15133,
"preview": "name: Build\n\non:\n workflow_dispatch:\n\nenv:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n ANDROID_NDK_VERSION: \"23.1.777"
},
{
"path": ".github/workflows/Release.core.yml",
"chars": 3325,
"preview": "name: Release-core\n\npermissions:\n contents: write\n\non:\n workflow_dispatch:\n\nenv:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TO"
},
{
"path": ".github/workflows/Release.yml",
"chars": 16243,
"preview": "name: Release\n\npermissions:\n contents: write\n\non:\n workflow_dispatch:\n inputs:\n skip_community_notification:\n "
},
{
"path": ".gitignore",
"chars": 967,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
},
{
"path": ".metadata",
"chars": 305,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": "README-zh_CN.md",
"chars": 2468,
"preview": "<div align=\"center\">\n <h1 align=\"center\">\n Pikapika \n\n[\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
},
{
"path": "android/app/src/debug/AndroidManifest.xml",
"chars": 566,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"opensource.pic2acg\">\n <!-- Flutter "
},
{
"path": "android/app/src/main/AndroidManifest.xml",
"chars": 6265,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"opensource.pic2acg\">\n\n <uses-permis"
},
{
"path": "android/app/src/main/kotlin/opensource/pic2acg/MainActivity.kt",
"chars": 17412,
"preview": "package opensource.pic2acg\n\nimport android.content.ContentValues\nimport android.graphics.Bitmap\nimport android.graphics."
},
{
"path": "android/app/src/main/res/drawable/launch_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 266,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "android/app/src/main/res/values/styles.xml",
"chars": 1142,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Theme applied"
},
{
"path": "android/app/src/main/res/values-night/styles.xml",
"chars": 1141,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Theme applied"
},
{
"path": "android/app/src/profile/AndroidManifest.xml",
"chars": 326,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"opensource.pic2acg\">\n <!-- Flutter "
},
{
"path": "android/build.gradle",
"chars": 599,
"preview": "buildscript {\n ext.kotlin_version = '1.7.10'\n repositories {\n google()\n mavenCentral()\n }\n\n de"
},
{
"path": "android/gradle/wrapper/gradle-wrapper.properties",
"chars": 230,
"preview": "#Fri Oct 29 09:53:43 CST 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributio"
},
{
"path": "android/gradle.properties",
"chars": 82,
"preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
},
{
"path": "android/settings.gradle",
"chars": 462,
"preview": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Prop"
},
{
"path": "ci/cmd/check_asset/main.go",
"chars": 1871,
"preview": "package main\n\nimport (\n\t\"ci/commons\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n)\n\nfunc main() {\n\t// get ghT"
},
{
"path": "ci/cmd/check_asset_core/main.go",
"chars": 1591,
"preview": "package main\n\nimport (\n\t\"ci/commons\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n)\n\nfunc main() {\n\t// get ghT"
},
{
"path": "ci/cmd/check_release/main.go",
"chars": 2010,
"preview": "package main\n\nimport (\n\t\"bytes\"\n\t\"ci/commons\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n)\n\nfunc main() {\n\t/"
},
{
"path": "ci/cmd/send_to_community/main.go",
"chars": 2499,
"preview": "package main\n\nimport (\n\t\"ci/commons\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.c"
},
{
"path": "ci/cmd/upload_asset/main.go",
"chars": 3628,
"preview": "package main\n\nimport (\n\t\"ci/commons\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n)\n\nfunc main() {\n\t//"
},
{
"path": "ci/cmd/upload_asset_core/main.go",
"chars": 2439,
"preview": "package main\n\nimport (\n\t\"ci/commons\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n)\n\nfunc main() {\n\t//"
},
{
"path": "ci/commons/funcs.go",
"chars": 1690,
"preview": "package commons\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"strings\"\n)\n\nconst Ua = \"pikapika ci\"\nconst MainBranch = \"master\"\n\nfunc L"
},
{
"path": "ci/commons/types.go",
"chars": 3337,
"preview": "package commons\n\nimport \"time\"\n\ntype Version struct {\n\tCode string `json:\"code\"`\n\tInfo string `json:\"info\"`\n}\n\ntype Rele"
},
{
"path": "ci/go.mod",
"chars": 532,
"preview": "module ci\n\ngo 1.17\n\nrequire (\n\tgithub.com/andersfylling/disgord v0.35.1\n\tgithub.com/go-telegram-bot-api/telegram-bot-api"
},
{
"path": "ci/go.sum",
"chars": 11330,
"preview": "github.com/andersfylling/disgord v0.35.1 h1:auhxW9z96/uSF7MYwfuv8AP71AVIc0+jZQWjZdwIqNE=\ngithub.com/andersfylling/disgor"
},
{
"path": "ci/linux_font.yaml",
"chars": 73,
"preview": "\n fonts:\n - family: Roboto\n fonts:\n - asset: fonts/Roboto.ttf\n\n"
},
{
"path": "ci/version.code.txt",
"chars": 7,
"preview": "v1.8.19"
},
{
"path": "ci/version.info.txt",
"chars": 7,
"preview": "v1.8.19"
},
{
"path": "ios/.gitignore",
"chars": 561,
"preview": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedDat"
},
{
"path": "ios/Flutter/AppFrameworkInfo.plist",
"chars": 774,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Flutter/Debug.xcconfig",
"chars": 107,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Flutter/Release.xcconfig",
"chars": 109,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Podfile",
"chars": 1479,
"preview": "# Uncomment this line to define a global platform for your project\n# platform :ios, '12.0'\n\n# CocoaPods analytics sends "
},
{
"path": "ios/Runner/AppDelegate.swift",
"chars": 6742,
"preview": "import UIKit\nimport Flutter\nimport Mobile\nimport LocalAuthentication\nimport Network\n\n@UIApplicationMain\n@objc class AppD"
},
{
"path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2519,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"20x20\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"Icon-App-20x20@2x.png\",\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
"chars": 391,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"LaunchImage.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
"chars": 336,
"preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
},
{
"path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
"chars": 2377,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Base.lproj/Main.storyboard",
"chars": 1605,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Info.plist",
"chars": 3526,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner/Runner-Bridging-Header.h",
"chars": 38,
"preview": "#import \"GeneratedPluginRegistrant.h\"\n"
},
{
"path": "ios/Runner.xcodeproj/project.pbxproj",
"chars": 23330,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
"chars": 3291,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1430\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
"chars": 224,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Runner.xcodepr"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "lib/assets/translations/en-US.json",
"chars": 37738,
"preview": "{\n \"language\": {\n \"title\": \"Language\",\n \"name\": \"English - United States\"\n },\n \"app\": {\n \"categories\": \"Cate"
},
{
"path": "lib/assets/translations/ja-JP.json",
"chars": 30325,
"preview": "{\n \"language\": {\n \"title\": \"言語\",\n \"name\": \"日本語 - 日本\"\n },\n \"app\": {\n \"categories\": \"カテゴリ\",\n \"my\": \"マイ\",\n "
},
{
"path": "lib/assets/translations/ko-KR.json",
"chars": 29923,
"preview": "{\n \"language\": {\n \"title\": \"언어\",\n \"name\": \"한국어 - 대한민국\"\n },\n \"app\": {\n \"categories\": \"카테고리\",\n \"my\": \"내 정보\""
},
{
"path": "lib/assets/translations/zh-CN.json",
"chars": 26773,
"preview": "{\n \"language\": {\n \"title\": \"语言\",\n \"name\": \"简体中文 - 中国大陆\"\n },\n \"app\": {\n \"categories\": \"分类\",\n \"my\": \"我的\",\n "
},
{
"path": "lib/assets/translations/zh-TW.json",
"chars": 26768,
"preview": "{\n \"language\": {\n \"title\": \"語言\",\n \"name\": \"繁體中文 - 中國台灣\"\n },\n \"app\": {\n \"categories\": \"分類\",\n \"my\": \"我的\",\n "
},
{
"path": "lib/basic/Channels.dart",
"chars": 1297,
"preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/services.dart';\n\n// EventChannel\n// 由于Flutter的Event"
},
{
"path": "lib/basic/Common.dart",
"chars": 9988,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimpo"
},
{
"path": "lib/basic/Cross.dart",
"chars": 3032,
"preview": "/// 与平台交互的操作\nimport 'dart:io';\n\nimport 'package:clipboard/clipboard.dart';\nimport 'package:pikapika/i18.dart';\nimport 'p"
},
{
"path": "lib/basic/Entities.dart",
"chars": 34517,
"preview": "import 'dart:convert';\n\n/// 图片\nclass RemoteImageInfo {\n late String originalName;\n late String path;\n late String fil"
},
{
"path": "lib/basic/Method.dart",
"chars": 32426,
"preview": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:flutter/services.dart';\nimport 'package:pikapika/basic"
},
{
"path": "lib/basic/Navigator.dart",
"chars": 1097,
"preview": "/// 导航相关\n\nimport 'dart:async';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/config/IconLoading"
},
{
"path": "lib/basic/config/Address.dart",
"chars": 6820,
"preview": "/// 分流地址\n\n// addr = \"172.67.7.24:443\"\n// addr = \"104.20.180.50:443\"\n// addr = \"172.67.208.169:443\"\n\nimport 'package:pika"
},
{
"path": "lib/basic/config/AndroidDisplayMode.dart",
"chars": 1837,
"preview": "/// 显示模式, 仅安卓有效\n\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/basic/config/AndroidSecureFlag.dart",
"chars": 1387,
"preview": "/// 音量键翻页\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Co"
},
{
"path": "lib/basic/config/AppOrientation.dart",
"chars": 2740,
"preview": "// AppOrientation.dart\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\ni"
},
{
"path": "lib/basic/config/Authentication.dart",
"chars": 2179,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/"
},
{
"path": "lib/basic/config/AutoClean.dart",
"chars": 2144,
"preview": "/// 自动清理\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Met"
},
{
"path": "lib/basic/config/AutoDeleteDownloadOnUnfavorite.dart",
"chars": 1504,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pikapika/i18.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/AutoDownloadOnFavorite.dart",
"chars": 1407,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pikapika/i18.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/AutoFullScreen.dart",
"chars": 840,
"preview": "/// 自动全屏\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/AutoFullScreenOnForward.dart",
"chars": 1088,
"preview": "/// 前进时自动全屏\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimpor"
},
{
"path": "lib/basic/config/CategoriesColumnCount.dart",
"chars": 1486,
"preview": "/// 多线程下载并发数\n\nimport 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.da"
},
{
"path": "lib/basic/config/CategoriesSort.dart",
"chars": 1281,
"preview": "import 'dart:convert';\nimport 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/cu"
},
{
"path": "lib/basic/config/ChooserRoot.dart",
"chars": 1986,
"preview": "/// 文件夹选择器的根路径\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'p"
},
{
"path": "lib/basic/config/ContentFailedReloadAction.dart",
"chars": 2192,
"preview": "/// 全屏操作\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/CopyFullName.dart",
"chars": 778,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _propertyNam"
},
{
"path": "lib/basic/config/CopyFullNameTemplate.dart",
"chars": 1207,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Common.dart';\nimport '../Method.d"
},
{
"path": "lib/basic/config/CopySkipConfirm.dart",
"chars": 809,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _propertyNam"
},
{
"path": "lib/basic/config/DisableAutoDownloadOnMobile.dart",
"chars": 1468,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pikapika/i18.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/DownloadAndExportPath.dart",
"chars": 2203,
"preview": "/// 下载的同时导出到文件系统\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport "
},
{
"path": "lib/basic/config/DownloadCachePath.dart",
"chars": 4986,
"preview": "/// 下载的同时导出到文件系统\n\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:file_pic"
},
{
"path": "lib/basic/config/DownloadThreadCount.dart",
"chars": 1262,
"preview": "/// 多线程下载并发数\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic"
},
{
"path": "lib/basic/config/DragRegionLock.dart",
"chars": 961,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/EBookScrolling.dart",
"chars": 795,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _propertyNam"
},
{
"path": "lib/basic/config/EBookScrollingRange.dart",
"chars": 1187,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\n\nconst _propertyNa"
},
{
"path": "lib/basic/config/EBookScrollingTrigger.dart",
"chars": 1171,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\n\nconst _propertyNa"
},
{
"path": "lib/basic/config/ExportPath.dart",
"chars": 3797,
"preview": "/// 文件夹选择器的根路径\n\nimport 'dart:io';\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'pa"
},
{
"path": "lib/basic/config/ExportRename.dart",
"chars": 961,
"preview": "/// 自动全屏\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '."
},
{
"path": "lib/basic/config/FullScreenAction.dart",
"chars": 2650,
"preview": "/// 全屏操作\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/FullScreenUI.dart",
"chars": 3167,
"preview": "/// 全屏操作\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package"
},
{
"path": "lib/basic/config/GalleryPreloadCount.dart",
"chars": 83,
"preview": "/// 相册模式下预加载图片数量\n\nconst galleryPrePreloadCount = 1;\nconst galleryPreloadCount = 2;\n"
},
{
"path": "lib/basic/config/GestureSpeed.dart",
"chars": 2492,
"preview": "import 'package:pikapika/basic/Common.dart';\nimport 'package:pikapika/basic/Method.dart';\nimport 'package:flutter/materi"
},
{
"path": "lib/basic/config/HiddenFdIcon.dart",
"chars": 893,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport '."
},
{
"path": "lib/basic/config/HiddenSearchPersion.dart",
"chars": 1027,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport '."
},
{
"path": "lib/basic/config/HiddenSubIcon.dart",
"chars": 955,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport '."
},
{
"path": "lib/basic/config/HiddenViewed.dart",
"chars": 942,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport '."
},
{
"path": "lib/basic/config/HiddenWords.dart",
"chars": 1750,
"preview": "import 'dart:convert';\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../../screen"
},
{
"path": "lib/basic/config/HideOnlineFavorite.dart",
"chars": 1036,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport '."
},
{
"path": "lib/basic/config/IconLoading.dart",
"chars": 1179,
"preview": "/// 自动全屏\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/IgnoreInfoHistory.dart",
"chars": 870,
"preview": "/// 自动全屏\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/IgnoreUpgradeConfirm.dart",
"chars": 1327,
"preview": "/// 音量键翻页\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Co"
},
{
"path": "lib/basic/config/ImageAddress.dart",
"chars": 3528,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\nimport 'Address.da"
},
{
"path": "lib/basic/config/ImageFilter.dart",
"chars": 2562,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/ImportNotice.dart",
"chars": 534,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nWidget importNotice(Buil"
},
{
"path": "lib/basic/config/IsPro.dart",
"chars": 457,
"preview": "import 'package:event/event.dart';\nimport 'package:pikapika/basic/Method.dart';\n\nimport '../Entities.dart';\n\nbool get is"
},
{
"path": "lib/basic/config/KeyboardController.dart",
"chars": 963,
"preview": "/// 上下键翻页\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Co"
},
{
"path": "lib/basic/config/ListLayout.dart",
"chars": 1735,
"preview": "/// 列表页的布局\n\nimport 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart"
},
{
"path": "lib/basic/config/LocalHistorySync.dart",
"chars": 4781,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:fl"
},
{
"path": "lib/basic/config/NoAnimation.dart",
"chars": 925,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/PagerAction.dart",
"chars": 1886,
"preview": "/// 列表页下一页的行为\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimp"
},
{
"path": "lib/basic/config/Platform.dart",
"chars": 202,
"preview": "/// 平台信息\n\nimport 'dart:io';\n\nimport '../Method.dart';\n\nint androidVersion = 0;\n\nFuture<void> initPlatform()async{\n if ("
},
{
"path": "lib/basic/config/Proxy.dart",
"chars": 1092,
"preview": "/// 代理设置\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/Quality.dart",
"chars": 2312,
"preview": "/// 图片质量\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _I"
},
{
"path": "lib/basic/config/ReaderBackgroundColor.dart",
"chars": 2272,
"preview": "import 'dart:ui';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';"
},
{
"path": "lib/basic/config/ReaderDirection.dart",
"chars": 2557,
"preview": "/// 阅读器的方向\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/M"
},
{
"path": "lib/basic/config/ReaderScrollByScreenPercentage.dart",
"chars": 1447,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\n\nconst _propertyNa"
},
{
"path": "lib/basic/config/ReaderSliderPosition.dart",
"chars": 2199,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/basic/config/ReaderTwoPageDirection.dart",
"chars": 2740,
"preview": "/// 阅读器的方向\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/M"
},
{
"path": "lib/basic/config/ReaderType.dart",
"chars": 4887,
"preview": "/// 阅读器的类型\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nenum R"
},
{
"path": "lib/basic/config/ReaderZoomScale.dart",
"chars": 4001,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pikapika/i18.dart';\n\nimport '../Method.dart';\n\nconst _readerZoom"
},
{
"path": "lib/basic/config/RecommendLinks.dart",
"chars": 400,
"preview": "import 'package:event/event.dart';\n\nimport '../Method.dart';\n\nvar recommendLinksEvent = Event<EventArgs>();\n\nMap<String,"
},
{
"path": "lib/basic/config/ShadowCategories.dart",
"chars": 4724,
"preview": "/// 屏蔽的分类\n\nimport 'dart:convert';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '"
},
{
"path": "lib/basic/config/ShadowCategoriesEvent.dart",
"chars": 85,
"preview": "\nimport 'package:event/event.dart';\n\nvar shadowCategoriesEvent = Event<EventArgs>();\n"
},
{
"path": "lib/basic/config/ShadowCategoriesMode.dart",
"chars": 2581,
"preview": "/// 屏蔽方式\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Common.dart';\nimport '."
},
{
"path": "lib/basic/config/ShowCommentAtDownload.dart",
"chars": 904,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '../Method."
},
{
"path": "lib/basic/config/StartupPic.dart",
"chars": 2292,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:fl"
},
{
"path": "lib/basic/config/Themes.dart",
"chars": 17446,
"preview": "/// 主题\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutte"
},
{
"path": "lib/basic/config/ThreeKeepRight.dart",
"chars": 790,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _propertyNam"
},
{
"path": "lib/basic/config/TimeOffsetHour.dart",
"chars": 1387,
"preview": "/// 时区设置\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Common.dart';\nimport '"
},
{
"path": "lib/basic/config/TimeoutLock.dart",
"chars": 2367,
"preview": "/// 自动清理\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Met"
},
{
"path": "lib/basic/config/UseApiLoadImage.dart",
"chars": 1728,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\n\nlate bool _curren"
},
{
"path": "lib/basic/config/UsingRightClickPop.dart",
"chars": 1044,
"preview": "/// 自动全屏\n\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Com"
},
{
"path": "lib/basic/config/Version.dart",
"chars": 6676,
"preview": "import 'dart:async' show Future;\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport 'pack"
},
{
"path": "lib/basic/config/VolumeController.dart",
"chars": 862,
"preview": "/// 音量键翻页\n\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\nimport 'package:pikapika"
},
{
"path": "lib/basic/config/VolumeNextChapter.dart",
"chars": 833,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _propertyNam"
},
{
"path": "lib/basic/config/WebDav.dart",
"chars": 10350,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\n\nimport '"
},
{
"path": "lib/basic/config/WebToonScrollMode.dart",
"chars": 2137,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../Method.dart';\n\nenum WebToonScrol"
},
{
"path": "lib/basic/config/WillPopNotice.dart",
"chars": 782,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../Method.dart';\n\nconst _propertyNam"
},
{
"path": "lib/basic/config/i18n.dart",
"chars": 2239,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:pikapika/i18b.dart';\nimport 'package:flutter/mate"
},
{
"path": "lib/basic/config/passed.dart",
"chars": 343,
"preview": "import 'package:pikapika/basic/Method.dart';\n\nconst _propertyName = \"passed\";\nlate bool _passed;\n\nFuture<void> initPasse"
},
{
"path": "lib/basic/connect.dart",
"chars": 498,
"preview": "import 'dart:io';\n\nimport 'package:flutter/services.dart';\n\nconst MethodChannel _networkChannel = MethodChannel('network"
},
{
"path": "lib/basic/define.dart",
"chars": 263,
"preview": "import 'package:flutter/material.dart';\n\nconst supportedLocales = [Locale('en', 'US'), Locale(\"zh\", \"CN\"), Locale('zh', "
},
{
"path": "lib/basic/enum/ErrorTypes.dart",
"chars": 1214,
"preview": "const ERROR_TYPE_NETWORK = \"NETWORK_ERROR\";\nconst ERROR_TYPE_PERMISSION = \"PERMISSION_ERROR\";\nconst ERROR_TYPE_TIME = \"T"
},
{
"path": "lib/basic/enum/Sort.dart",
"chars": 1303,
"preview": "/// 官方提供的排序方式\n\nimport 'package:flutter/material.dart';\n\nconst SORT_DEFAULT = \"ua\";\nconst SORT_TIME_NEWEST = \"dd\";\nconst "
},
{
"path": "lib/basic/store/Categories.dart",
"chars": 66,
"preview": "/// 全局配置文件, 项目启动时加载\n\n\n// 数据缓存\nvar storedCategories = <String>[];\n\n"
},
{
"path": "lib/i18.dart",
"chars": 909,
"preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:easy_localization/easy_localization.dart' as el;\nimport 'packag"
},
{
"path": "lib/i18b.dart",
"chars": 186,
"preview": "\n\nimport 'package:flutter/material.dart';\nimport 'package:easy_localization/easy_localization.dart';\n\nvoid setLocale(Bui"
},
{
"path": "lib/main.dart",
"chars": 2214,
"preview": "import 'dart:io';\n\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/s"
},
{
"path": "lib/main_desktop.dart",
"chars": 151,
"preview": "import 'main.dart' as original_main;\n\n// This file is the default main entry-point for go-flutter application.\nvoid main"
},
{
"path": "lib/screens/AboutScreen.dart",
"chars": 6669,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimpo"
},
{
"path": "lib/screens/AccessKeyReplaceScreen.dart",
"chars": 1738,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/screens/AccountScreen.dart",
"chars": 7067,
"preview": "import 'dart:async';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutte"
},
{
"path": "lib/screens/AppScreen.dart",
"chars": 3318,
"preview": "import 'dart:async';\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter"
},
{
"path": "lib/screens/CategoriesScreen.dart",
"chars": 10221,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/material.dart';\nimport 'S"
},
{
"path": "lib/screens/CategoriesSortScreen.dart",
"chars": 8694,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/screens/CleanScreen.dart",
"chars": 2878,
"preview": "import 'dart:async';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapi"
},
{
"path": "lib/screens/CloseAppScreen.dart",
"chars": 573,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nclass CloseAppScreen ext"
},
{
"path": "lib/screens/ComicCollectionsScreen.dart",
"chars": 3367,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Entities.dart"
},
{
"path": "lib/screens/ComicInfoScreen.dart",
"chars": 14311,
"preview": "import 'dart:async';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:event/event.dart';\nimport 'package:flutter/mat"
},
{
"path": "lib/screens/ComicReaderScreen.dart",
"chars": 6857,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimpo"
},
{
"path": "lib/screens/ComicSubscribesScreen.dart",
"chars": 3704,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Entities.dart"
},
{
"path": "lib/screens/ComicsScreen.dart",
"chars": 5815,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'components/flutter_search_bar.dart' "
},
{
"path": "lib/screens/CommentScreen.dart",
"chars": 5876,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Common.dart';"
},
{
"path": "lib/screens/DesktopAuthenticationScreen.dart",
"chars": 4198,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/screens/DownloadConfirmScreen.dart",
"chars": 7045,
"preview": "import 'dart:convert';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pika"
},
{
"path": "lib/screens/DownloadExportGroupScreen.dart",
"chars": 5112,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Common.dart';"
},
{
"path": "lib/screens/DownloadExportToFileScreen.dart",
"chars": 21151,
"preview": "import 'dart:async';\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapik"
},
{
"path": "lib/screens/DownloadExportToSocketScreen.dart",
"chars": 3740,
"preview": "import 'dart:async';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapi"
},
{
"path": "lib/screens/DownloadExportingGroupScreen.dart",
"chars": 12222,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Common.dart';"
},
{
"path": "lib/screens/DownloadImportScreen.dart",
"chars": 7956,
"preview": "import 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:fi"
},
{
"path": "lib/screens/DownloadInfoScreen.dart",
"chars": 6752,
"preview": "import 'dart:convert';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pika"
},
{
"path": "lib/screens/DownloadListScreen.dart",
"chars": 19066,
"preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:math';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flu"
},
{
"path": "lib/screens/DownloadOnlyImportScreen.dart",
"chars": 2722,
"preview": "import 'dart:async';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:path/p"
},
{
"path": "lib/screens/DownloadReaderScreen.dart",
"chars": 6493,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n"
},
{
"path": "lib/screens/FavouritePaperScreen.dart",
"chars": 1037,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/screens/FilePhotoViewScreen.dart",
"chars": 1992,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:photo_view/photo_view.dart';"
},
{
"path": "lib/screens/ForgotPasswordScreen.dart",
"chars": 7774,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\n\nimport '../basic/Common.dart';\nimport '../b"
},
{
"path": "lib/screens/GameDownloadScreen.dart",
"chars": 2621,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Cross.dart';\n"
},
{
"path": "lib/screens/GameInfoScreen.dart",
"chars": 6994,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Entities.dart"
},
{
"path": "lib/screens/GamesScreen.dart",
"chars": 9479,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimpo"
},
{
"path": "lib/screens/HiddenWordsScreen.dart",
"chars": 4471,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport '../basic/config/HiddenWords.dart';\ni"
},
{
"path": "lib/screens/ImportFromOffScreen.dart",
"chars": 2093,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/screens/InitScreen.dart",
"chars": 12712,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:path/path.dart' as p;\nim"
},
{
"path": "lib/screens/LocalFavoriteScreen.dart",
"chars": 20628,
"preview": "import 'package:pikapika/i18.dart';\nimport 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:pikap"
},
{
"path": "lib/screens/MigrateScreen.dart",
"chars": 4261,
"preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Common.dart';\nimport 'package:"
},
{
"path": "lib/screens/ModifyPasswordScreen.dart",
"chars": 4676,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/basic/Method.dart';"
},
{
"path": "lib/screens/NetworkSettingsScreen.dart",
"chars": 753,
"preview": "import 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pikapika/screens/components/"
},
{
"path": "lib/screens/PkzArchiveScreen.dart",
"chars": 4244,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:path/path.dart' as p;\nim"
},
{
"path": "lib/screens/PkzComicInfoScreen.dart",
"chars": 7724,
"preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:pika"
},
{
"path": "lib/screens/PkzReaderScreen.dart",
"chars": 6976,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:pikapika/i18.dart';\nimport 'package:flutter/material.dart';\nimpo"
},
{
"path": "lib/screens/ProScreen.dart",
"chars": 9942,
"preview": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimport 'package:pikapik"
}
]
// ... and 119 more files (download for full content)
About this extraction
This page contains the full source code of the ComicSparks/pikapika GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 319 files (1.3 MB), approximately 331.1k tokens, and a symbol index with 1622 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.