Merge branch 'location_tag_screen_4' into location_tag_screen_5

This commit is contained in:
ashilkn 2023-04-03 17:23:30 +05:30
commit 195d2a72ca
4 changed files with 46 additions and 112 deletions

View file

@ -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();

View file

@ -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 {

View file

@ -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,
), ),
); );
} }

View file

@ -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),
);
}