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 Configuration.instance.init();
|
||||
await UserService.instance.init();
|
||||
await LocationService.instance.init();
|
||||
LocationService.instance.init(preferences);
|
||||
await UserRemoteFlagService.instance.init();
|
||||
await UpdateService.instance.init();
|
||||
BillingService.instance.init();
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import "dart:collection";
|
||||
import "dart:convert";
|
||||
import "dart:math";
|
||||
|
||||
|
@ -8,27 +7,33 @@ import 'package:photos/models/location_tag/location_tag.dart';
|
|||
import "package:shared_preferences/shared_preferences.dart";
|
||||
|
||||
class LocationService {
|
||||
SharedPreferences? prefs;
|
||||
late SharedPreferences prefs;
|
||||
|
||||
LocationService._privateConstructor();
|
||||
|
||||
static final LocationService instance = LocationService._privateConstructor();
|
||||
|
||||
Future<void> init() async {
|
||||
prefs ??= await SharedPreferences.getInstance();
|
||||
void init(SharedPreferences preferences) {
|
||||
prefs = preferences;
|
||||
}
|
||||
|
||||
List<String> getAllLocationTags() {
|
||||
var list = prefs!.getStringList('locations');
|
||||
List<String> _getStoredLocationTags() {
|
||||
var list = prefs.getStringList('locations');
|
||||
list ??= [];
|
||||
return list;
|
||||
}
|
||||
|
||||
List<LocationTag> getLocationTags() {
|
||||
final list = _getStoredLocationTags();
|
||||
return list.map((e) => LocationTag.fromJson(json.decode(e))).toList();
|
||||
}
|
||||
|
||||
Future<void> addLocation(
|
||||
String location,
|
||||
Location centerPoint,
|
||||
int radius,
|
||||
) async {
|
||||
final list = getAllLocationTags();
|
||||
final list = _getStoredLocationTags();
|
||||
//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)
|
||||
//a & b are the semi-major and semi-minor axes of the ellipse
|
||||
|
@ -46,7 +51,7 @@ class LocationService {
|
|||
centerPoint: centerPoint,
|
||||
);
|
||||
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
|
||||
|
@ -59,11 +64,8 @@ class LocationService {
|
|||
|
||||
List<LocationTag> enclosingLocationTags(Location fileCoordinates) {
|
||||
final result = List<LocationTag>.of([]);
|
||||
final locationTagsData = getAllLocationTags();
|
||||
for (String locationTagData in locationTagsData) {
|
||||
final locationTag = LocationTag.fromJson(json.decode(locationTagData));
|
||||
// final locationJson = json.decode(locationTag);
|
||||
// final center = locationJson["center"];
|
||||
final locationTagsData = getLocationTags();
|
||||
for (LocationTag locationTag in locationTagsData) {
|
||||
final x = fileCoordinates.latitude! - locationTag.centerPoint.latitude!;
|
||||
final y = fileCoordinates.longitude! - locationTag.centerPoint.longitude!;
|
||||
if ((x * x) / (locationTag.aSquare) + (y * y) / (locationTag.bSquare) <=
|
||||
|
@ -91,49 +93,6 @@ class LocationService {
|
|||
}
|
||||
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 {
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import "dart:convert";
|
||||
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:photos/core/event_bus.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_type.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/generic_search_result.dart';
|
||||
import 'package:photos/models/search/location_api_response.dart';
|
||||
|
@ -269,27 +268,40 @@ class SearchService {
|
|||
Future<List<GenericSearchResult>> getLocationResults(
|
||||
String query,
|
||||
) async {
|
||||
final locations = LocationService.instance.getLocationTags();
|
||||
final Map<LocationTag, List<File>> result = {};
|
||||
|
||||
final List<GenericSearchResult> searchResults = [];
|
||||
final locations = LocationService.instance.getAllLocationTags();
|
||||
for (String location in locations) {
|
||||
final locationJson = json.decode(location);
|
||||
final locationName = locationJson["name"].toString();
|
||||
_logger.info(locationName);
|
||||
if (locationName.toLowerCase().contains(query.toLowerCase())) {
|
||||
_logger.info("TRUEEE");
|
||||
final fileIDs = LocationService.instance
|
||||
.getFilesByLocation(locationJson["id"].toString());
|
||||
final files = List<File>.empty(growable: true);
|
||||
for (String fileID in fileIDs) {
|
||||
final id = int.parse(fileID);
|
||||
final file = await FilesDB.instance.getFile(id);
|
||||
files.add(file!);
|
||||
|
||||
for (LocationTag tag in locations) {
|
||||
if (tag.name.toLowerCase().contains(query.toLowerCase())) {
|
||||
result[tag] = [];
|
||||
}
|
||||
}
|
||||
if (result.isEmpty) {
|
||||
return searchResults;
|
||||
}
|
||||
final allFiles = await _getAllFiles();
|
||||
for (File file in allFiles) {
|
||||
if (file.hasLocation) {
|
||||
for (LocationTag tag in result.keys) {
|
||||
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(
|
||||
GenericSearchResult(
|
||||
ResultType.location,
|
||||
locationName,
|
||||
files,
|
||||
entry.key.name,
|
||||
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