/*
* Copyright 2015 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.iosched.map.util;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.maps.android.ui.IconGenerator;
import com.google.samples.apps.iosched.provider.ScheduleContract;
import com.google.samples.apps.iosched.util.MapUtils;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import java.util.ArrayList;
import java.util.List;
/**
* Background task that queries the content provider and prepares a list of {@link MarkerModel}s
* wrapped in a {@link com.google.samples.apps.iosched.map.util.MarkerLoadingTask.MarkerEntry}
* that can be used to create Markers.
*/
public class MarkerLoadingTask extends AsyncTaskLoader<List<MarkerLoadingTask.MarkerEntry>> {
public MarkerLoadingTask(Context context) {
super(context);
}
@Override
public List<MarkerEntry> loadInBackground() {
List<MarkerEntry> list = null;
// Create a URI to get a cursor of all map markers
final Uri uri = ScheduleContract.MapMarkers.buildMarkerUri();
Cursor cursor = getContext().getContentResolver().query(uri, MarkerQuery.PROJECTION,
null, null, null);
// Create a MarkerModel for each entry
final int count = cursor.getCount();
if (cursor != null) {
list = new ArrayList<>(count);
final IconGenerator labelIconGenerator = MapUtils.getLabelIconGenerator(getContext());
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
// get data
final String id = cursor.getString(MarkerQuery.MARKER_ID);
final int floor = cursor.getInt(MarkerQuery.MARKER_FLOOR);
final float lat = cursor.getFloat(MarkerQuery.MARKER_LATITUDE);
final float lon = cursor.getFloat(MarkerQuery.MARKER_LONGITUDE);
final String typeString = cursor.getString(MarkerQuery.MARKER_TYPE);
final int type = MapUtils.detectMarkerType(typeString);
final String label = cursor.getString(MarkerQuery.MARKER_LABEL);
final LatLng position = new LatLng(lat, lon);
MarkerOptions marker = null;
if (type == MarkerModel.TYPE_LABEL) {
// Label markers contain the label as its icon
marker = MapUtils.createLabelMarker(labelIconGenerator, id, position, label);
} else if (type == MarkerModel.TYPE_ICON) {
// An icon marker is mapped to a drawable based on its full type name
marker = MapUtils.createIconMarker(typeString, id, position, getContext());
} else if (type != MarkerModel.TYPE_INACTIVE) {
// All other markers (that are not inactive) contain a pin icon
marker = MapUtils.createPinMarker(id, position);
}
MarkerModel model = new MarkerModel(id, floor, type, label, null);
MarkerEntry entry = new MarkerEntry(model, marker);
list.add(entry);
cursor.moveToNext();
}
cursor.close();
}
return list;
}
private interface MarkerQuery {
String[] PROJECTION = {
ScheduleContract.MapMarkers.MARKER_ID,
ScheduleContract.MapMarkers.MARKER_FLOOR,
ScheduleContract.MapMarkers.MARKER_LATITUDE,
ScheduleContract.MapMarkers.MARKER_LONGITUDE,
ScheduleContract.MapMarkers.MARKER_TYPE,
ScheduleContract.MapMarkers.MARKER_LABEL
};
int MARKER_ID = 0;
int MARKER_FLOOR = 1;
int MARKER_LATITUDE = 2;
int MARKER_LONGITUDE = 3;
int MARKER_TYPE = 4;
int MARKER_LABEL = 5;
}
public class MarkerEntry {
public MarkerModel model;
public MarkerOptions options;
public MarkerEntry(MarkerModel model, MarkerOptions options) {
this.model = model;
this.options = options;
}
}
}