Feature/logging (#251)

* Add logging package

* Refresh linux files

* Android flavor setup

* Setup ios flavors

* Setup release CI

* Refactor CI

* Remove debug prints

* Create prod signingConfig only if exists

* Store recent logs

* Remove flavoring on desktop

* Fix android signing

* Fix release paths (except windows)

* Quote secret var

* debug

* Fix env vars

* Add log console

* Add logs section in bug issue template

* Add time to logs

* Add changelog entry

* Rename log console

* Remove key

* Change way of routing

* Add title
This commit is contained in:
Marcin Wojnarowski 2021-09-23 19:25:03 +02:00 committed by GitHub
parent 6a7b999436
commit 9f9cc52cf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 901 additions and 280 deletions

View File

@ -24,6 +24,14 @@ A clear and concise description of what the bug is.
3. Scroll down to '....'
4. See error
### Relevant logs
<details>
<summary>Logs</summary>
Paste your logs here. Logs can be found in lemmur: settings > about lemmur > logs.
</details>
### Expected behavior
A clear and concise description of what you expected to happen.

View File

@ -7,16 +7,12 @@ on:
branches: [master]
jobs:
android:
name: Android
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
channel: "stable"
@ -33,12 +29,51 @@ jobs:
- name: Run tests
run: flutter test
android:
name: Android
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
channel: "stable"
- name: Inject keystore
working-directory: android/app
run: |
echo "${{ secrets.SIGNING_KEY }}" | base64 -d | tee key.jks >/dev/null
- name: Android build
run: flutter build apk --split-per-abi
env:
ANDROID_KEY_ALIAS: ${{ secrets.ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
ANDROID_STORE_PATH: key.jks
ANDROID_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
run: flutter build apk --split-per-abi --release --target lib/main_prod.dart --flavor prod
ios:
name: iOS
runs-on: macos-latest
needs: lint
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
with:
channel: "stable"
- run: flutter build ios --no-codesign --release --target lib/main_prod.dart --flavor prod
linux:
name: Linux
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v2
@ -57,11 +92,12 @@ jobs:
- name: Build
run: |
flutter build linux
flutter build linux --release --target lib/main_prod.dart
windows:
name: Windows
runs-on: windows-latest
needs: lint
steps:
- uses: actions/checkout@v2
@ -75,4 +111,4 @@ jobs:
- name: Build
run: |
flutter build windows
flutter build windows --release --target lib/main_prod.dart

View File

@ -37,36 +37,36 @@ jobs:
run: flutter pub get
- name: Inject keystore
working-directory: android
env:
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
working-directory: android/app
run: |
echo storePassword=$KEY_STORE_PASSWORD > key.properties
echo keyPassword=$KEY_PASSWORD >> key.properties
echo keyAlias=$ALIAS >> key.properties
echo storeFile=$HOME/key.jks >> key.properties
echo $SIGNING_KEY | base64 -d | tee ~/key.jks >/dev/null
echo "${{ secrets.SIGNING_KEY }}" | base64 -d | tee key.jks >/dev/null
- name: Generate appbundle
run: flutter build appbundle
env:
ANDROID_KEY_ALIAS: ${{ secrets.ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
ANDROID_STORE_PATH: key.jks
ANDROID_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
run: flutter build appbundle --release --target lib/main_prod.dart --flavor prod
- uses: actions/upload-artifact@v2
with:
name: android-appbundle
path: |
build/app/outputs/bundle/release/app-release.aab
build/app/outputs/bundle/prodRelease/app-prod-release.aab
- name: Android build
run: |
flutter build apk --split-per-abi
env:
ANDROID_KEY_ALIAS: ${{ secrets.ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
ANDROID_STORE_PATH: key.jks
ANDROID_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
run:
flutter build apk --split-per-abi --release --target lib/main_prod.dart --flavor prod
mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk lemmur-${{ needs.get-vars.outputs.tag }}-arm64-v8a-android.apk
mv build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk lemmur-${{ needs.get-vars.outputs.tag }}-armeabi-v7a-android.apk
mv build/app/outputs/flutter-apk/app-x86_64-release.apk lemmur-${{ needs.get-vars.outputs.tag }}-x86_64-android.apk
mv build/app/outputs/flutter-apk/app-arm64-v8a-prod-release.apk lemmur-${{ needs.get-vars.outputs.tag }}-arm64-v8a-android.apk
mv build/app/outputs/flutter-apk/app-armeabi-v7a-prod-release.apk lemmur-${{ needs.get-vars.outputs.tag }}-armeabi-v7a-android.apk
mv build/app/outputs/flutter-apk/app-x86_64-prod-release.apk lemmur-${{ needs.get-vars.outputs.tag }}-x86_64-android.apk
- uses: actions/upload-artifact@v2
with:
@ -96,17 +96,17 @@ jobs:
- name: Build
run: |
flutter build linux
flutter build linux --release --target lib/main_prod.dart
- name: Archive
working-directory: build/linux/release/bundle
working-directory: build/linux/x64/release/bundle
run: |
tar -czf lemmur-${{ needs.get-vars.outputs.tag }}-x86_64-linux.tar.gz *
- uses: actions/upload-artifact@v2
with:
name: linux-build
path: build/linux/release/bundle/lemmur-*.tar.gz
path: build/linux/x64/release/bundle/lemmur-*.tar.gz
windows-build:
name: Windows build
@ -125,7 +125,7 @@ jobs:
- name: Build
run: |
flutter build windows
flutter build windows --release --target lib/main_prod.dart
- name: Archive
working-directory: build/windows/runner/Release

3
.gitignore vendored
View File

@ -36,3 +36,6 @@ app.*.map.json
# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
# Xcode build files
ios/build

12
.vscode/launch.json vendored
View File

@ -4,19 +4,25 @@
{
"name": "Debug",
"request": "launch",
"type": "dart"
"type": "dart",
"program": "lib/main_dev.dart",
"args": ["--flavor", "dev"]
},
{
"name": "Profile",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
"flutterMode": "profile",
"program": "lib/main_dev.dart",
"args": ["--flavor", "dev"]
},
{
"name": "Release",
"request": "launch",
"type": "dart",
"flutterMode": "release"
"flutterMode": "release",
"program": "lib/main_dev.dart",
"args": ["--flavor", "dev"]
}
]
}

View File

@ -29,5 +29,20 @@
"L10n string": {
"prefix": "l10n",
"body": ["L10n.of(context)!.$0"]
},
"Mobx store": {
"prefix": "mobxstore",
"body": [
"import 'package:mobx/mobx.dart';",
"",
"part '$TM_FILENAME_BASE.g.dart';",
"",
"class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g} = _${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g} with _$${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g};",
"",
"abstract class _${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g} with Store {",
"\t@observable",
"\t$0",
"}"
]
}
}

View File

@ -1,3 +1,9 @@
## Unreleased
### Added
- Logging: local logs about some actions/errors. Can be accessed from **settings > about lemmur > logs**
## v0.6.0 - 2021-09-06
### Added

View File

@ -8,6 +8,7 @@ linter:
- avoid_init_to_null
- avoid_null_checks_in_equality_operators
- avoid_positional_boolean_parameters
- avoid_print
- avoid_private_typedef_functions
- avoid_redundant_argument_values
- avoid_relative_lib_imports

View File

@ -25,12 +25,6 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
compileSdkVersion 30
@ -51,21 +45,55 @@ android {
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
dev { }
if (System.getenv("ANDROID_STORE_PATH")) {
prod {
keyAlias System.getenv("ANDROID_KEY_ALIAS")
keyPassword System.getenv("ANDROID_KEY_PASSWORD")
storeFile file(System.getenv("ANDROID_STORE_PATH"))
storePassword System.getenv("ANDROID_STORE_PASSWORD")
}
} else {
prod { }
}
}
}
flavorDimensions "app"
productFlavors {
dev {
dimension "app"
applicationIdSuffix ".dev"
versionNameSuffix "-dev"
manifestPlaceholders = [
appName: "lemmur DEV"
]
signingConfig signingConfigs.debug
}
prod {
dimension "app"
manifestPlaceholders = [
appName: "lemmur"
]
signingConfig signingConfigs.prod
}
}
buildTypes {
debug {
testCoverageEnabled true
debuggable true
minifyEnabled false
signingConfig null
}
release {
if (keystorePropertiesFile.exists()) {
signingConfig signingConfigs.release
} else {
signingConfig signingConfigs.debug
}
debuggable false
minifyEnabled true
shrinkResources false
zipAlignEnabled true
}
}
}

View File

@ -11,7 +11,7 @@
<application
android:name="io.flutter.app.FlutterApplication"
android:label="lemmur"
android:label="${appName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objectVersion = 51;
objects = {
/* Begin PBXBuildFile section */
@ -33,10 +33,13 @@
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>"; };
20AF123CE6B282DF5FCC0E08 /* 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>"; };
3064BA8287AEF7F9E6523E2E /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
4E5591CE3BD9F89AE791097F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5D359FC3B8BF643CBF087D7C /* 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>"; };
5DC9EF56CF79F18EC6F8E97B /* 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>"; };
5F74EE2F2B11182F6DF33F2E /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = "<group>"; };
61F7B8503D323D03015ED0C2 /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.xcconfig"; sourceTree = "<group>"; };
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>"; };
@ -47,6 +50,8 @@
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>"; };
BAF12CFD300959413D4373DD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = "<group>"; };
C282F331F7E23515AB5C91ED /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -67,6 +72,11 @@
20AF123CE6B282DF5FCC0E08 /* Pods-Runner.debug.xcconfig */,
5D359FC3B8BF643CBF087D7C /* Pods-Runner.release.xcconfig */,
5DC9EF56CF79F18EC6F8E97B /* Pods-Runner.profile.xcconfig */,
C282F331F7E23515AB5C91ED /* Pods-Runner.debug-dev.xcconfig */,
3064BA8287AEF7F9E6523E2E /* Pods-Runner.debug-prod.xcconfig */,
BAF12CFD300959413D4373DD /* Pods-Runner.release-dev.xcconfig */,
5F74EE2F2B11182F6DF33F2E /* Pods-Runner.release-prod.xcconfig */,
61F7B8503D323D03015ED0C2 /* Pods-Runner.profile-dev.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@ -163,7 +173,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1020;
LastUpgradeCheck = 1250;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@ -306,87 +316,7 @@
/* 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;
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 = 8.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 = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = NMDSW6KGG7;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
1889477126E7F08600887334 /* Debug-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
@ -433,15 +363,47 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
name = "Debug-prod";
};
97C147041CF9000F007C117D /* Release */ = {
1889477226E7F08600887334 /* Debug-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUNDLE_NAME = lemmur;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = NMDSW6KGG7;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Debug-prod";
};
1889477326E7F09600887334 /* Release-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
@ -482,7 +444,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -491,13 +453,14 @@
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
name = "Release-prod";
};
97C147061CF9000F007C117D /* Debug */ = {
1889477426E7F09600887334 /* Release-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUNDLE_NAME = lemmur;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = NMDSW6KGG7;
@ -518,17 +481,237 @@
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-prod";
};
249021D3217E4FDB00AE95B9 /* Profile-dev */ = {
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;
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-dev";
};
249021D4217E4FDB00AE95B9 /* Profile-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUNDLE_NAME = "lemmur DEV";
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = NMDSW6KGG7;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-dev";
};
97C147031CF9000F007C117D /* Debug-dev */ = {
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;
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-dev";
};
97C147041CF9000F007C117D /* Release-dev */ = {
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;
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-dev";
};
97C147061CF9000F007C117D /* Debug-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUNDLE_NAME = "lemmur DEV";
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = NMDSW6KGG7;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
name = "Debug-dev";
};
97C147071CF9000F007C117D /* Release */ = {
97C147071CF9000F007C117D /* Release-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUNDLE_NAME = "lemmur DEV";
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = NMDSW6KGG7;
@ -546,13 +729,13 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur;
PRODUCT_BUNDLE_IDENTIFIER = com.krawieck.lemmur.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
name = "Release-dev";
};
/* End XCBuildConfiguration section */
@ -560,22 +743,26 @@
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
97C147031CF9000F007C117D /* Debug-dev */,
1889477126E7F08600887334 /* Debug-prod */,
97C147041CF9000F007C117D /* Release-dev */,
1889477326E7F09600887334 /* Release-prod */,
249021D3217E4FDB00AE95B9 /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
defaultConfigurationName = "Release-dev";
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
97C147061CF9000F007C117D /* Debug-dev */,
1889477226E7F08600887334 /* Debug-prod */,
97C147071CF9000F007C117D /* Release-dev */,
1889477426E7F09600887334 /* Release-prod */,
249021D4217E4FDB00AE95B9 /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
defaultConfigurationName = "Release-dev";
};
/* End XCConfigurationList section */
};

View File

@ -2,6 +2,6 @@
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
location = "self:">
</FileRef>
</Workspace>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1250"
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-dev"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug-dev"
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>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release-dev"
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-dev">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release-dev"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
LastUpgradeVersion = "1250"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -23,7 +23,7 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
buildConfiguration = "Debug-prod"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
@ -40,7 +40,7 @@
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Debug-prod"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -61,7 +61,7 @@
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
buildConfiguration = "Release-prod"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
@ -78,10 +78,10 @@
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
buildConfiguration = "Debug-prod">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
buildConfiguration = "Release-prod"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,53 +1,55 @@
<?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>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>lemmur</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</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/>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(BUNDLE_NAME)</string>
<key>CFBundleDisplayName</key>
<string>$(BUNDLE_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</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/>
<!-- Image picker -->
<key>NSPhotoLibraryUsageDescription</key>
<string>For uploading images for posts/avatars</string>
<key>NSCameraUsageDescription</key>
<string>For uploading images for posts/avatars</string>
<key>NSMicrophoneUsageDescription</key>
<string>For recording videos for posts</string>
</dict>
<!-- Image picker -->
<key>NSPhotoLibraryUsageDescription</key>
<string>For uploading images for posts/avatars</string>
<key>NSCameraUsageDescription</key>
<string>For uploading images for posts/avatars</string>
<key>NSMicrophoneUsageDescription</key>
<string>For recording videos for posts</string>
</dict>
</plist>

30
lib/app.dart Normal file
View File

@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart';
import 'hooks/stores.dart';
import 'l10n/l10n.dart';
import 'pages/home_page.dart';
import 'theme.dart';
class MyApp extends HookWidget {
const MyApp();
@override
Widget build(BuildContext context) {
final configStore = useConfigStore();
return KeyboardDismisser(
child: MaterialApp(
title: 'lemmur',
supportedLocales: L10n.supportedLocales,
localizationsDelegates: L10n.localizationsDelegates,
themeMode: configStore.theme,
darkTheme: configStore.amoledDarkMode ? amoledTheme : darkTheme,
locale: configStore.locale,
theme: lightTheme,
home: const HomePage(),
),
);
}
}

7
lib/app_config.dart Normal file
View File

@ -0,0 +1,7 @@
class AppConfig {
final bool debugMode;
const AppConfig({
required this.debugMode,
});
}

57
lib/main_common.dart Normal file
View File

@ -0,0 +1,57 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import 'app.dart';
import 'app_config.dart';
import 'pages/log_console_page/log_console_page_store.dart';
import 'stores/accounts_store.dart';
import 'stores/config_store.dart';
Future<void> mainCommon(AppConfig appConfig) async {
WidgetsFlutterBinding.ensureInitialized();
final logConsoleStore = LogConsolePageStore();
_setupLogger(appConfig, logConsoleStore);
final configStore = await ConfigStore.load();
final accountsStore = await AccountsStore.load();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider.value(value: configStore),
ChangeNotifierProvider.value(value: accountsStore),
Provider.value(value: logConsoleStore),
],
child: const MyApp(),
),
);
}
void _setupLogger(AppConfig appConfig, LogConsolePageStore logConsoleStore) {
Logger.root.level = Level.ALL;
Logger.root.onRecord.listen((logRecord) {
// ignore: avoid_print
print(logRecord);
logConsoleStore.addLog(logRecord);
});
final flutterErrorLogger = Logger('FlutterError');
FlutterError.onError = (details) {
if (appConfig.debugMode) {
FlutterError.dumpErrorToConsole(details);
} else {
flutterErrorLogger.warning(
details.summary.name,
details.exception,
details.stack,
);
}
};
}

6
lib/main_dev.dart Normal file
View File

@ -0,0 +1,6 @@
import 'app_config.dart';
import 'main_common.dart';
void main() {
mainCommon(const AppConfig(debugMode: true));
}

6
lib/main_prod.dart Normal file
View File

@ -0,0 +1,6 @@
import 'app_config.dart';
import 'main_common.dart';
void main() {
mainCommon(const AppConfig(debugMode: false));
}

View File

@ -1,64 +1,16 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart';
import 'package:provider/provider.dart';
import 'hooks/stores.dart';
import 'l10n/l10n.dart';
import 'pages/communities_tab.dart';
import 'pages/create_post.dart';
import 'pages/home_tab.dart';
import 'pages/profile_tab.dart';
import 'pages/search_tab.dart';
import 'stores/accounts_store.dart';
import 'stores/config_store.dart';
import 'theme.dart';
import 'util/extensions/brightness.dart';
import '../util/extensions/brightness.dart';
import 'communities_tab.dart';
import 'create_post.dart';
import 'home_tab.dart';
import 'profile_tab.dart';
import 'search_tab.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final configStore = await ConfigStore.load();
final accountsStore = await AccountsStore.load();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider.value(value: configStore),
ChangeNotifierProvider.value(value: accountsStore),
],
child: const MyApp(),
),
);
}
class MyApp extends HookWidget {
const MyApp();
@override
Widget build(BuildContext context) {
final configStore = useConfigStore();
return KeyboardDismisser(
child: MaterialApp(
title: 'lemmur',
supportedLocales: L10n.supportedLocales,
localizationsDelegates: L10n.localizationsDelegates,
themeMode: configStore.theme,
darkTheme: configStore.amoledDarkMode ? amoledTheme : darkTheme,
locale: configStore.locale,
theme: lightTheme,
home: const MyHomePage(),
),
);
}
}
class MyHomePage extends HookWidget {
const MyHomePage();
class HomePage extends HookWidget {
const HomePage();
static const List<Widget> pages = [
HomeTab(),

View File

@ -0,0 +1,81 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import '../../util/observer_consumers.dart';
import '../../widgets/bottom_safe.dart';
import 'log_console_page_store.dart';
class LogConsolePage extends StatelessWidget {
const LogConsolePage();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Logs')),
body: SafeArea(
child: ObserverBuilder<LogConsolePageStore>(
builder: (context, store) {
final logStrings = store.stringified();
if (store.logs.isEmpty) {
return const Center(
child: Text(
'no logs',
style: TextStyle(fontStyle: FontStyle.italic),
),
);
}
return ListView.separated(
padding: const EdgeInsets.all(8)
.copyWith(bottom: BottomSafe.fabPadding + 8),
itemCount: store.logs.length,
itemBuilder: (context, i) => SelectableText(
logStrings[i],
style: TextStyle(color: store.logs[i].level.color),
),
separatorBuilder: (context, i) => const SizedBox(height: 6),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
final data = context.read<LogConsolePageStore>().stringified();
await Clipboard.setData(ClipboardData(text: data.join('\n')));
ScaffoldMessenger.of(context)
..hideCurrentSnackBar()
..showSnackBar(
const SnackBar(content: Text('all logs copied to the clipboard')),
);
},
tooltip: 'Copy to clipboard',
child: const Icon(Icons.copy),
),
);
}
static Route route() => MaterialPageRoute(
builder: (context) => const LogConsolePage(),
fullscreenDialog: true,
);
}
extension on Level {
Color get color {
if (this == Level.FINEST) return Colors.lime[100]!;
if (this == Level.FINER) return Colors.lime[300]!;
if (this == Level.FINE) return Colors.lime;
if (this == Level.CONFIG) return Colors.green;
if (this == Level.INFO) return Colors.blue;
if (this == Level.WARNING) return Colors.amber;
if (this == Level.SEVERE) return Colors.orange;
if (this == Level.SHOUT) return Colors.red;
throw StateError('unreachable');
}
}

View File

@ -0,0 +1,33 @@
import 'package:logging/logging.dart';
import 'package:mobx/mobx.dart';
part 'log_console_page_store.g.dart';
class LogConsolePageStore = _LogConsolePageStore with _$LogConsolePageStore;
abstract class _LogConsolePageStore with Store {
// TODO: implement as an ObservableDeque
final logs = ObservableList<LogRecord>();
static const _bufferSize = 200;
@action
void addLog(LogRecord logRecord) {
if (logs.length == _bufferSize) {
logs.removeAt(0);
}
logs.add(logRecord);
}
List<String> stringified() {
return logs.map(
(log) {
var str = '${log.time} $log';
if (log.stackTrace != null) str += '\n${log.stackTrace}';
return str;
},
).toList();
}
}

View File

@ -0,0 +1,32 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'log_console_page_store.dart';
// **************************************************************************
// StoreGenerator
// **************************************************************************
// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic
mixin _$LogConsolePageStore on _LogConsolePageStore, Store {
final _$_LogConsolePageStoreActionController =
ActionController(name: '_LogConsolePageStore');
@override
void addLog(LogRecord logRecord) {
final _$actionInfo = _$_LogConsolePageStoreActionController.startAction(
name: '_LogConsolePageStore.addLog');
try {
return super.addLog(logRecord);
} finally {
_$_LogConsolePageStoreActionController.endAction(_$actionInfo);
}
}
@override
String toString() {
return '''
''';
}
}

View File

@ -0,0 +1,32 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'log_console_store.dart';
// **************************************************************************
// StoreGenerator
// **************************************************************************
// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic
mixin _$LogConsoleStore on _LogConsoleStore, Store {
final _$_LogConsoleStoreActionController =
ActionController(name: '_LogConsoleStore');
@override
void addLog(LogRecord logRecord) {
final _$actionInfo = _$_LogConsoleStoreActionController.startAction(
name: '_LogConsoleStore.addLog');
try {
return super.addLog(logRecord);
} finally {
_$_LogConsoleStoreActionController.endAction(_$actionInfo);
}
}
@override
String toString() {
return '''
''';
}
}

View File

@ -63,7 +63,6 @@ Future<void> linkLauncher({
return goToPost(context, matchedInstance, int.parse(split[2]));
} else if (split.length == 5) {
// TODO: post with focus on comment thread
print('comment in post');
return goToPost(context, matchedInstance, int.parse(split[2]));
}
break;
@ -73,21 +72,17 @@ Future<void> linkLauncher({
case 'communities':
// TODO: put here push to communities page
print('communities');
return;
case 'modlog':
// TODO: put here push to modlog
print('modlog');
return;
case 'inbox':
// TODO: put here push to inbox
print('inbox');
return;
case 'search':
// TODO: *maybe* put here push to search. we'll see
// how much web version differs form the app
print('search');
return;
case 'create_post':
case 'create_community':

View File

@ -6,6 +6,7 @@ import 'package:package_info_plus/package_info_plus.dart';
import '../gen/assets.gen.dart';
import '../hooks/memo_future.dart';
import '../pages/log_console_page/log_console_page.dart';
import '../url_launcher.dart';
import 'bottom_modal.dart';
@ -72,7 +73,14 @@ class AboutTile extends HookWidget {
),
),
);
}, // TODO: link to some donation site
},
),
TextButton.icon(
icon: const Icon(Icons.list_alt),
label: const Text('logs'),
onPressed: () {
Navigator.of(context).push(LogConsolePage.route());
},
),
],
applicationIcon: ClipRRect(

View File

@ -2,9 +2,18 @@ import 'package:flutter/material.dart';
class BottomSafe extends StatelessWidget {
final double additionalPadding;
static const fabPadding =
// FAB size + FAB margin, 56 is as per https://material.io/components/buttons-floating-action-button#anatomy
56 + kFloatingActionButtonMargin;
const BottomSafe([this.additionalPadding = 0]);
const BottomSafe.fab() : this(fabPadding);
@override
Widget build(BuildContext context) => SizedBox(
height: MediaQuery.of(context).padding.bottom + additionalPadding);
Widget build(BuildContext context) {
return SizedBox(
height: MediaQuery.of(context).padding.bottom + additionalPadding,
);
}
}

View File

@ -105,7 +105,7 @@ class CommentSection extends HookWidget {
com,
key: ValueKey(com),
),
const BottomSafe(kMinInteractiveDimension + kFloatingActionButtonMargin),
const BottomSafe.fab(),
]);
}
}

View File

@ -31,10 +31,10 @@ class PostListOptions extends StatelessWidget {
),
const Spacer(),
if (styleButton)
IconButton(
icon: const Icon(Icons.view_stream),
const IconButton(
icon: Icon(Icons.view_stream),
// TODO: create compact post and dropdown for selecting
onPressed: () => print('TBD'),
onPressed: null,
),
],
),

View File

@ -82,7 +82,7 @@ add_custom_command(
COMMAND ${CMAKE_COMMAND} -E env
${FLUTTER_TOOL_ENVIRONMENT}
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
linux-x64 ${CMAKE_BUILD_TYPE}
${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
VERBATIM
)
add_custom_target(flutter_assemble DEPENDS

View File

@ -456,7 +456,7 @@ packages:
source: hosted
version: "0.16.0"
logging:
dependency: transitive
dependency: "direct main"
description:
name: logging
url: "https://pub.dartlang.org"

View File

@ -55,6 +55,7 @@ dependencies:
json_annotation: ^4.1.0
keyboard_dismisser: ^2.0.0
freezed_annotation: ^0.14.3
logging: ^1.0.1
flutter:
sdk: flutter

View File

@ -1,3 +1,4 @@
// ignore_for_file: avoid_print
import 'dart:io';
void confirm(String message) {

View File

@ -1,3 +1,4 @@
// ignore_for_file: avoid_print
/// Used to create a new lemmur release. Bumps semver, build number, updates changelog, fastlane, pubspec, and finishes by adding a git tag
import 'dart:io';