/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
* copy, modify, and distribute this software in source code or binary form for use
* in connection with the web services and APIs provided by Facebook.
*
* As with any software that integrates with the Facebook platform, your use of
* this software is subject to the Facebook Developer Principles and Policies
* [http://developers.facebook.com/policy/]. This copyright notice shall be
* included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.example.places.model;
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
import com.example.places.R;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class PlaceTextUtils {
private static final int[] DAY_OF_WEEK_STRINGID = new int[]{
R.string.monday,
R.string.tuesday,
R.string.wednesday,
R.string.thursday,
R.string.friday,
R.string.saturday,
R.string.sunday,
};
public static String getFieldName(Context context, String placeField) {
Resources resources = context.getResources();
if (Place.ABOUT.equals(placeField)) {
return resources.getString(R.string.place_field_about);
} else if (Place.APP_LINKS.equals(placeField)) {
return resources.getString(R.string.place_field_app_link);
} else if (Place.CATEGORY_LIST.equals(placeField)) {
return resources.getString(R.string.place_field_categories);
} else if (Place.CHECKINS.equals(placeField)) {
return resources.getString(R.string.place_field_checkins);
} else if (Place.DESCRIPTION.equals(placeField)) {
return resources.getString(R.string.place_field_description);
} else if (Place.ENGAGEMENT.equals(placeField)) {
return resources.getString(R.string.place_field_engagement);
} else if (Place.HOURS.equals(placeField)) {
return resources.getString(R.string.place_field_hours);
} else if (Place.LOCATION.equals(placeField)) {
return resources.getString(R.string.place_field_address);
} else if (Place.LINK.equals(placeField)) {
return resources.getString(R.string.place_field_link);
} else if (Place.OVERALL_STAR_RATING.equals(placeField)) {
return resources.getString(R.string.place_field_rating);
} else if (Place.PARKING.equals(placeField)) {
return resources.getString(R.string.place_field_parking);
} else if (Place.PAYMENT_OPTIONS.equals(placeField)) {
return resources.getString(R.string.place_field_payment_options);
} else if (Place.PHONE.equals(placeField)) {
return resources.getString(R.string.place_field_phone);
} else if (Place.PRICE_RANGE.equals(placeField)) {
return resources.getString(R.string.place_field_price_range);
} else if (Place.RATING_COUNT.equals(placeField)) {
return resources.getString(R.string.place_field_rating_count);
} else if (Place.RESTAURANT_SPECIALTIES.equals(placeField)) {
return resources.getString(R.string.place_field_specialties);
} else if (Place.RESTAURANT_SERVICES.equals(placeField)) {
return resources.getString(R.string.place_field_services);
} else if (Place.WEBSITE.equals(placeField)) {
return resources.getString(R.string.place_field_website);
}
return null;
}
public static String getFieldValue(Context context, Place place, String field) {
Resources resources = context.getResources();
if (Place.CATEGORY_LIST.equals(field)) {
List<String> categories = getCategories(place);
return TextUtils.join(", ", categories);
} else if (Place.LOCATION.equals(field)) {
return getAddress(place);
} else if (Place.PHONE.equals(field)) {
return place.get(field);
} else if (Place.WEBSITE.equals(field)) {
return place.get(field);
} else if (Place.LINK.equals(field)) {
return place.get(field);
} else if (Place.HOURS.equals(field)) {
return getOpeningHours(context, place);
} else if (Place.DESCRIPTION.equals(field)) {
return place.get(field);
} else if (Place.ABOUT.equals(field)) {
return place.get(field);
} else if (Place.CHECKINS.equals(field)) {
int checkins = place.getInt(field);
return resources.getString(R.string.place_info_checkins, checkins);
} else if (Place.OVERALL_STAR_RATING.equals(field)) {
String rating = place.get(Place.OVERALL_STAR_RATING);
int ratingCount = place.getInt(Place.RATING_COUNT);
if (!TextUtils.isEmpty(rating) && ratingCount > 0) {
return resources.getString(R.string.place_info_rating, rating, ratingCount);
}
} else if (Place.ENGAGEMENT.equals(field)) {
JSONObject jsonObject = place.getJson(Place.ENGAGEMENT);
if (jsonObject != null) {
return jsonObject.optString("social_sentence");
}
} else if (Place.RESTAURANT_SPECIALTIES.equals(field)) {
List<String> specialties = getRestaurantSpecialties(context, place);
if (!specialties.isEmpty()) {
return TextUtils.join(", ", specialties);
}
} else if (Place.PRICE_RANGE.equals(field)) {
return place.get(Place.PRICE_RANGE);
} else if (Place.IS_ALWAYS_OPEN.equals(field)) {
boolean isAlwaysOpen = place.getBoolean(field);
if (isAlwaysOpen) {
return resources.getString(R.string.place_always_open);
}
} else if (Place.IS_PERMANENTLY_CLOSED.equals(field)) {
boolean isPermanentlyClosed = place.getBoolean(field);
if (isPermanentlyClosed) {
return resources.getString(R.string.place_permanently_closed);
}
} else if (Place.APP_LINKS.equals(field)) {
if (hasFacebookAppLink(place)) {
return resources.getString(R.string.place_app_link);
}
} else if (Place.PARKING.equals(field)) {
List<String> parking = getParking(context, place);
if (!parking.isEmpty()) {
return TextUtils.join(", ", parking);
}
} else if (Place.RESTAURANT_SERVICES.equals(field)) {
List<String> services = getRestaurantServices(context, place);
if (!services.isEmpty()) {
return TextUtils.join(", ", services);
}
} else if (Place.PAYMENT_OPTIONS.equals(field)) {
List<String> paymentOptions = getPaymentOptions(context, place);
if (!paymentOptions.isEmpty()) {
return TextUtils.join(", ", paymentOptions);
}
}
return null;
}
public static String getAddress(Place place) {
if (place.has(Place.SINGLE_LINE_ADDRESS)) {
return place.get(Place.SINGLE_LINE_ADDRESS);
} else if (place.has(Place.LOCATION)) {
JSONObject location = place.getJson(Place.LOCATION);
List<String> address = new ArrayList<>(5);
String street = location.optString("street");
if (!TextUtils.isEmpty(street)) {
address.add(street);
}
String city = location.optString("city");
if (!TextUtils.isEmpty(city)) {
address.add(city);
}
String state = location.optString("state");
if (!TextUtils.isEmpty(state)) {
address.add(state);
}
String country = location.optString("city");
if (!TextUtils.isEmpty(country)) {
address.add(country);
}
return TextUtils.join(", ", address);
}
return null;
}
public static List<String> getCategories(Place place) {
JSONObject jsonData = place.getJson();
List<String> categories = new ArrayList<>();
JSONArray jsonCategories = jsonData.optJSONArray(Place.CATEGORY_LIST);
if (jsonCategories != null) {
int length = jsonCategories.length();
for (int i=0; i<length; i++) {
JSONObject jsonCategory = jsonCategories.optJSONObject(i);
if (jsonCategory != null) {
String category = jsonCategory.optString("name");
categories.add(category);
}
}
}
return categories;
}
public static String getOpeningHours(Context context, Place place) {
OpeningHours hours = place.getOpeningHours();
if (hours != null) {
StringBuilder openingHours = new StringBuilder();
for (int day = OpeningHours.MONDAY; day < OpeningHours.SUNDAY; day++) {
String hourIntervalText = getOpeningHourText(context.getResources(), hours, day);
if (hourIntervalText != null) {
if (openingHours.length() > 0) {
openingHours.append("\n");
}
openingHours.append(hourIntervalText);
}
}
if (openingHours.length() > 0) {
return openingHours.toString();
}
}
return null;
}
private static String getOpeningHourText(Resources resources, OpeningHours hours, int day) {
List<String> hourInterval = hours.getHoursInterval(day);
if (hourInterval != null) {
StringBuilder builder = new StringBuilder();
if (hourInterval.size() >= 2) {
builder.append(hourInterval.get(0));
builder.append(' ');
builder.append(hourInterval.get(1));
}
if (hourInterval.size() == 4) {
builder.append(", ");
builder.append(hourInterval.get(2));
builder.append(' ');
builder.append(hourInterval.get(3));
}
if (hourInterval.size() > 0) {
builder.append(" - ");
builder.append(resources.getString(DAY_OF_WEEK_STRINGID[day]));
return builder.toString();
}
}
return null;
}
public static List<String> getPaymentOptions(Context context, Place place) {
return extractValidValues(
context,
place.getJson(Place.PAYMENT_OPTIONS),
R.array.payment_options_keys,
R.array.payment_options_labels);
}
public static List<String> getParking(Context context, Place place) {
return extractValidValues(
context,
place.getJson(Place.PARKING),
R.array.parking_keys,
R.array.parking_labels);
}
public static List<String> getRestaurantSpecialties(Context context, Place place) {
return extractValidValues(
context,
place.getJson(Place.RESTAURANT_SPECIALTIES),
R.array.restaurant_specialties_keys,
R.array.restaurant_specialties_labels);
}
public static List<String> getRestaurantServices(Context context, Place place) {
return extractValidValues(
context,
place.getJson(Place.RESTAURANT_SERVICES),
R.array.restaurant_services_keys,
R.array.restaurant_services_labels);
}
private static List<String> extractValidValues(
Context context,
JSONObject jsonObject,
int keysId,
int labelsId) {
List<String> labels = new ArrayList<>();
if (jsonObject != null) {
String[] keys = context.getResources().getStringArray(keysId);
String[] labelArray = context.getResources().getStringArray(labelsId);
for (int i=0; i<keys.length; i++) {
int value = jsonObject.optInt(keys[i]);
if (value == 1) {
labels.add(labelArray[i]);
}
}
}
return labels;
}
private static boolean hasFacebookAppLink(Place place) {
List<AppLink> appLinks = place.getAppLinks();
for (AppLink appLink : appLinks) {
if ("Facebook".equals(appLink.getAppName())) {
return true;
}
}
return false;
}
}