Merge branch 'location_tag_screen_4' into location_tag_screen_5
This commit is contained in:
commit
195d2a72ca
|
@ -154,7 +154,7 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
|
||||||
await NetworkClient.instance.init();
|
await NetworkClient.instance.init();
|
||||||
await Configuration.instance.init();
|
await Configuration.instance.init();
|
||||||
await UserService.instance.init();
|
await UserService.instance.init();
|
||||||
await LocationService.instance.init();
|
LocationService.instance.init(preferences);
|
||||||
await UserRemoteFlagService.instance.init();
|
await UserRemoteFlagService.instance.init();
|
||||||
await UpdateService.instance.init();
|
await UpdateService.instance.init();
|
||||||
BillingService.instance.init();
|
BillingService.instance.init();
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import "dart:collection";
|
|
||||||
import "dart:convert";
|
import "dart:convert";
|
||||||
import "dart:math";
|
import "dart:math";
|
||||||
|
|
||||||
|
@ -8,27 +7,33 @@ import 'package:photos/models/location_tag/location_tag.dart';
|
||||||
import "package:shared_preferences/shared_preferences.dart";
|
import "package:shared_preferences/shared_preferences.dart";
|
||||||
|
|
||||||
class LocationService {
|
class LocationService {
|
||||||
SharedPreferences? prefs;
|
late SharedPreferences prefs;
|
||||||
|
|
||||||
LocationService._privateConstructor();
|
LocationService._privateConstructor();
|
||||||
|
|
||||||
static final LocationService instance = LocationService._privateConstructor();
|
static final LocationService instance = LocationService._privateConstructor();
|
||||||
|
|
||||||
Future<void> init() async {
|
void init(SharedPreferences preferences) {
|
||||||
prefs ??= await SharedPreferences.getInstance();
|
prefs = preferences;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> getAllLocationTags() {
|
List<String> _getStoredLocationTags() {
|
||||||
var list = prefs!.getStringList('locations');
|
var list = prefs.getStringList('locations');
|
||||||
list ??= [];
|
list ??= [];
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<LocationTag> getLocationTags() {
|
||||||
|
final list = _getStoredLocationTags();
|
||||||
|
return list.map((e) => LocationTag.fromJson(json.decode(e))).toList();
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> addLocation(
|
Future<void> addLocation(
|
||||||
String location,
|
String location,
|
||||||
Location centerPoint,
|
Location centerPoint,
|
||||||
int radius,
|
int radius,
|
||||||
) async {
|
) async {
|
||||||
final list = getAllLocationTags();
|
final list = _getStoredLocationTags();
|
||||||
//The area enclosed by the location tag will be a circle on a 3D spherical
|
//The area enclosed by the location tag will be a circle on a 3D spherical
|
||||||
//globe and an ellipse on a 2D Mercator projection (2D map)
|
//globe and an ellipse on a 2D Mercator projection (2D map)
|
||||||
//a & b are the semi-major and semi-minor axes of the ellipse
|
//a & b are the semi-major and semi-minor axes of the ellipse
|
||||||
|
@ -46,7 +51,7 @@ class LocationService {
|
||||||
centerPoint: centerPoint,
|
centerPoint: centerPoint,
|
||||||
);
|
);
|
||||||
list.add(json.encode(locationTag.toJson()));
|
list.add(json.encode(locationTag.toJson()));
|
||||||
await prefs!.setStringList('locations', list);
|
await prefs.setStringList('locations', list);
|
||||||
}
|
}
|
||||||
|
|
||||||
///The area bounded by the location tag becomes more elliptical with increase
|
///The area bounded by the location tag becomes more elliptical with increase
|
||||||
|
@ -59,11 +64,8 @@ class LocationService {
|
||||||
|
|
||||||
List<LocationTag> enclosingLocationTags(Location fileCoordinates) {
|
List<LocationTag> enclosingLocationTags(Location fileCoordinates) {
|
||||||
final result = List<LocationTag>.of([]);
|
final result = List<LocationTag>.of([]);
|
||||||
final locationTagsData = getAllLocationTags();
|
final locationTagsData = getLocationTags();
|
||||||
for (String locationTagData in locationTagsData) {
|
for (LocationTag locationTag in locationTagsData) {
|
||||||
final locationTag = LocationTag.fromJson(json.decode(locationTagData));
|
|
||||||
// final locationJson = json.decode(locationTag);
|
|
||||||
// final center = locationJson["center"];
|
|
||||||
final x = fileCoordinates.latitude! - locationTag.centerPoint.latitude!;
|
final x = fileCoordinates.latitude! - locationTag.centerPoint.latitude!;
|
||||||
final y = fileCoordinates.longitude! - locationTag.centerPoint.longitude!;
|
final y = fileCoordinates.longitude! - locationTag.centerPoint.longitude!;
|
||||||
if ((x * x) / (locationTag.aSquare) + (y * y) / (locationTag.bSquare) <=
|
if ((x * x) / (locationTag.aSquare) + (y * y) / (locationTag.bSquare) <=
|
||||||
|
@ -91,49 +93,6 @@ class LocationService {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addFileToLocation(int locationId, int fileId) async {
|
|
||||||
final list = getFilesByLocation(locationId.toString());
|
|
||||||
list.add(fileId.toString());
|
|
||||||
await prefs!.setStringList("location_$locationId", list);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> getFilesByLocation(String locationId) {
|
|
||||||
var fileList = prefs!.getStringList("location_$locationId");
|
|
||||||
fileList ??= [];
|
|
||||||
return fileList;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> getLocationsByFileID(int fileId) {
|
|
||||||
final locationList = getAllLocationTags();
|
|
||||||
final locations = List<dynamic>.of([]);
|
|
||||||
for (String locationString in locationList) {
|
|
||||||
final locationJson = json.decode(locationString);
|
|
||||||
locations.add(locationJson);
|
|
||||||
}
|
|
||||||
final res = List<String>.of([]);
|
|
||||||
for (dynamic location in locations) {
|
|
||||||
final list = getFilesByLocation(location["id"].toString());
|
|
||||||
if (list.contains(fileId.toString())) {
|
|
||||||
res.add(location["name"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, List<String>> clusterFilesByLocation() {
|
|
||||||
final map = HashMap<String, List<String>>();
|
|
||||||
var locations = prefs!.getStringList('locations');
|
|
||||||
locations ??= [];
|
|
||||||
for (String locationData in locations) {
|
|
||||||
final locationJson = json.decode(locationData);
|
|
||||||
map.putIfAbsent(
|
|
||||||
locationData,
|
|
||||||
() => getFilesByLocation(locationJson['id'].toString()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class GPSData {
|
class GPSData {
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import "dart:convert";
|
|
||||||
|
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:photos/core/event_bus.dart';
|
import 'package:photos/core/event_bus.dart';
|
||||||
import 'package:photos/data/holidays.dart';
|
import 'package:photos/data/holidays.dart';
|
||||||
|
@ -12,6 +10,7 @@ import 'package:photos/models/collection_items.dart';
|
||||||
import 'package:photos/models/file.dart';
|
import 'package:photos/models/file.dart';
|
||||||
import 'package:photos/models/file_type.dart';
|
import 'package:photos/models/file_type.dart';
|
||||||
import 'package:photos/models/location/location.dart';
|
import 'package:photos/models/location/location.dart';
|
||||||
|
import "package:photos/models/location_tag/location_tag.dart";
|
||||||
import 'package:photos/models/search/album_search_result.dart';
|
import 'package:photos/models/search/album_search_result.dart';
|
||||||
import 'package:photos/models/search/generic_search_result.dart';
|
import 'package:photos/models/search/generic_search_result.dart';
|
||||||
import 'package:photos/models/search/location_api_response.dart';
|
import 'package:photos/models/search/location_api_response.dart';
|
||||||
|
@ -269,27 +268,40 @@ class SearchService {
|
||||||
Future<List<GenericSearchResult>> getLocationResults(
|
Future<List<GenericSearchResult>> getLocationResults(
|
||||||
String query,
|
String query,
|
||||||
) async {
|
) async {
|
||||||
|
final locations = LocationService.instance.getLocationTags();
|
||||||
|
final Map<LocationTag, List<File>> result = {};
|
||||||
|
|
||||||
final List<GenericSearchResult> searchResults = [];
|
final List<GenericSearchResult> searchResults = [];
|
||||||
final locations = LocationService.instance.getAllLocationTags();
|
|
||||||
for (String location in locations) {
|
for (LocationTag tag in locations) {
|
||||||
final locationJson = json.decode(location);
|
if (tag.name.toLowerCase().contains(query.toLowerCase())) {
|
||||||
final locationName = locationJson["name"].toString();
|
result[tag] = [];
|
||||||
_logger.info(locationName);
|
}
|
||||||
if (locationName.toLowerCase().contains(query.toLowerCase())) {
|
}
|
||||||
_logger.info("TRUEEE");
|
if (result.isEmpty) {
|
||||||
final fileIDs = LocationService.instance
|
return searchResults;
|
||||||
.getFilesByLocation(locationJson["id"].toString());
|
}
|
||||||
final files = List<File>.empty(growable: true);
|
final allFiles = await _getAllFiles();
|
||||||
for (String fileID in fileIDs) {
|
for (File file in allFiles) {
|
||||||
final id = int.parse(fileID);
|
if (file.hasLocation) {
|
||||||
final file = await FilesDB.instance.getFile(id);
|
for (LocationTag tag in result.keys) {
|
||||||
files.add(file!);
|
if (LocationService.instance.isFileInsideLocationTag(
|
||||||
|
tag.centerPoint,
|
||||||
|
file.location!,
|
||||||
|
tag.radius,
|
||||||
|
)) {
|
||||||
|
result[tag]!.add(file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (MapEntry<LocationTag, List<File>> entry in result.entries) {
|
||||||
|
if (entry.value.isNotEmpty) {
|
||||||
searchResults.add(
|
searchResults.add(
|
||||||
GenericSearchResult(
|
GenericSearchResult(
|
||||||
ResultType.location,
|
ResultType.location,
|
||||||
locationName,
|
entry.key.name,
|
||||||
files,
|
entry.value,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
import "package:flutter/material.dart";
|
|
||||||
import "package:photos/services/location_service.dart";
|
|
||||||
|
|
||||||
Widget locationChipList(int id, BuildContext context) {
|
|
||||||
final locationService = LocationService.instance;
|
|
||||||
final list = locationService.getLocationsByFileID(id);
|
|
||||||
return Wrap(
|
|
||||||
spacing: 6.0,
|
|
||||||
runSpacing: 6.0,
|
|
||||||
children: [
|
|
||||||
...list.map((e) => _buildChip(e, context)).toList(),
|
|
||||||
_addLocation(context)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildChip(String label, BuildContext context) {
|
|
||||||
return Chip(
|
|
||||||
labelPadding: const EdgeInsets.all(2.0),
|
|
||||||
label: Text(
|
|
||||||
label,
|
|
||||||
style: TextStyle(
|
|
||||||
color: Theme.of(context).hintColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
backgroundColor: Theme.of(context).cardColor,
|
|
||||||
elevation: 6.0,
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _addLocation(BuildContext context) {
|
|
||||||
return IconButton(
|
|
||||||
onPressed: () {},
|
|
||||||
icon: const Icon(Icons.add),
|
|
||||||
);
|
|
||||||
}
|
|
Loading…
Reference in a new issue