diff --git a/android/app/build.gradle b/android/app/build.gradle index 1fc01445..b4fad3b1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,6 +27,10 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { compileSdkVersion 28 + packagingOptions { + exclude 'META-INF/proguard/androidx-annotations.pro' + } + lintOptions { disable 'InvalidPackage' } diff --git a/lib/api.dart b/lib/api.dart index 30e4423b..73b2a6d2 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -211,7 +211,7 @@ class InvenTreeAPI { Future patch(String url, {Map body}) async { var _url = makeApiUrl(url); - var _headers = _defaultHeaders(); + var _headers = defaultHeaders(); var _body = Map(); // Copy across provided data @@ -231,7 +231,7 @@ class InvenTreeAPI { Future post(String url, {Map body}) async { var _url = makeApiUrl(url); - var _headers = _defaultHeaders(); + var _headers = defaultHeaders(); var _body = Map(); // Copy across provided data @@ -249,7 +249,7 @@ class InvenTreeAPI { Future get(String url, {Map params}) async { var _url = makeApiUrl(url); - var _headers = _defaultHeaders(); + var _headers = defaultHeaders(); // If query parameters are supplied, form a query string if (params != null && params.isNotEmpty) { @@ -270,18 +270,21 @@ class InvenTreeAPI { return http.get(_url, headers: _headers); } - Map _defaultHeaders() { + Map defaultHeaders() { var headers = Map(); - // Preference authentication token if available - if (_token.isNotEmpty) { - headers[HttpHeaders.authorizationHeader] = "Token " + _token; - } else { - headers[HttpHeaders.authorizationHeader] = 'Basic ' + base64Encode(utf8.encode('$_username:$_password')); - } + headers[HttpHeaders.authorizationHeader] = _authorizationHeader(); + //headers['Authorization'] = _authorizationHeader(); return headers; } + String _authorizationHeader () { + if (_token.isNotEmpty) { + return "Token $_token"; + } else { + return "Basic " + base64Encode(utf8.encode('$_username:$_password')); + } + } } \ No newline at end of file diff --git a/lib/cache.dart b/lib/cache.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index 6597a82d..2d334c30 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -1,7 +1,7 @@ import 'package:InvenTree/api.dart'; import 'model.dart'; -import 'dart:convert'; +import 'dart:io'; import 'package:path/path.dart' as path; import 'package:http/http.dart' as http; @@ -38,6 +38,31 @@ class InvenTreePart extends InvenTreeModel { String get categoryName => jsondata['category__name'] ?? ''; + String get _image => jsondata['image'] ?? ''; + + String get _thumbnail => jsondata['thumbnail'] ?? ''; + + // Return a fully-qualified path to the image for this Part + String get image { + String img = _image.isNotEmpty ? _image : _thumbnail; + + if (img.isEmpty) { + return InvenTreeAPI().makeUrl('/static/img/blank_image.png'); + } else { + return InvenTreeAPI().makeUrl(img); + } + } + + String get thumbnail { + String img = _thumbnail.isNotEmpty ? _thumbnail : _image; + + if (img.isEmpty) { + return InvenTreeAPI().makeUrl('/static/img/blank_image.thumbnail.png'); + } else { + return InvenTreeAPI().makeUrl(img); + } + } + InvenTreePart() : super(); InvenTreePart.fromJson(Map json) : super.fromJson(json) { @@ -50,6 +75,5 @@ class InvenTreePart extends InvenTreeModel { var part = InvenTreePart.fromJson(json); return part; - } } \ No newline at end of file diff --git a/lib/widget/category_display.dart b/lib/widget/category_display.dart index 9d75f569..a610f2bb 100644 --- a/lib/widget/category_display.dart +++ b/lib/widget/category_display.dart @@ -1,4 +1,5 @@ +import 'package:InvenTree/api.dart'; import 'package:InvenTree/inventree/part.dart'; import 'package:InvenTree/widget/part_display.dart'; @@ -8,6 +9,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_advanced_networkimage/provider.dart'; + class CategoryDisplayWidget extends StatefulWidget { CategoryDisplayWidget(this.category, {Key key}) : super(key: key); @@ -176,14 +179,15 @@ class PartList extends StatelessWidget { return ListTile( title: Text("${part.name}"), subtitle: Text("${part.description}"), - - /* - leading: CachedNetworkImage( - imageUrl: part.imageurl, - placeholder: (context, url) => CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), + leading: Image( + image: AdvancedNetworkImage( + part.thumbnail, + header: InvenTreeAPI().defaultHeaders(), + useDiskCache: true, + cacheRule: CacheRule(maxAge: const Duration(days: 1)), + ), + width: 48, ), - */ onTap: () { _openPart(context, part.pk); }, diff --git a/pubspec.lock b/pubspec.lock index 253192c9..c8d23e33 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -69,6 +69,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_advanced_networkimage: + dependency: "direct main" + description: + name: flutter_advanced_networkimage + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -76,6 +83,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.7.4" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.3+1" flutter_test: dependency: "direct dev" description: flutter @@ -135,6 +149,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.4" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.5" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" pedantic: dependency: transitive description: @@ -149,6 +198,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 91dd351c..29eebb06 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,6 +26,8 @@ dependencies: http: ^0.12.0+2 shared_preferences: ^0.5.3+1 + flutter_advanced_networkimage: any + preferences: ^5.1.0 qr_utils: ^0.1.4