/**
* 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.Intent;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.Log;
import com.facebook.places.model.CurrentPlaceRequestParams;
import com.facebook.places.model.PlaceFields;
import com.google.android.gms.maps.model.LatLng;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Place implements PlaceFields, Parcelable {
private static final String TAG = Place.class.getSimpleName();
private JSONObject jsonData;
public Place(JSONObject jsonData) {
this.jsonData = jsonData;
}
public JSONObject getJson() {
return jsonData;
}
public String get(String field) {
return jsonData.optString(field);
}
public JSONObject getJson(String field) {
return jsonData.optJSONObject(field);
}
public JSONArray getJsonArray(String field) {
return jsonData.optJSONArray(field);
}
public int getInt(String field) {
return jsonData.optInt(field);
}
public boolean getBoolean(String field) {
return jsonData.optBoolean(field);
}
public boolean has(String field) {
return jsonData.has(field);
}
public LatLng getPosition() {
JSONObject location = jsonData.optJSONObject(LOCATION);
if (location != null) {
if (location.has("latitude") && location.has("longitude")) {
double latitude = location.optDouble("latitude");
double longitude = location.optDouble("longitude");
return new LatLng(latitude, longitude);
}
}
return null;
}
public CurrentPlaceRequestParams.ConfidenceLevel getConfidenceLevel() {
if (jsonData.has(CONFIDENCE_LEVEL)) {
String confidenceLevel = jsonData.optString(CONFIDENCE_LEVEL);
if ("high".equalsIgnoreCase(confidenceLevel)) {
return CurrentPlaceRequestParams.ConfidenceLevel.HIGH;
} else if ("medium".equalsIgnoreCase(confidenceLevel)) {
return CurrentPlaceRequestParams.ConfidenceLevel.MEDIUM;
} else if ("low".equalsIgnoreCase(confidenceLevel)) {
return CurrentPlaceRequestParams.ConfidenceLevel.LOW;
}
}
return null;
}
public String getCoverPhotoUrl() {
JSONObject coverPhotoJson = jsonData.optJSONObject("cover");
if (coverPhotoJson != null) {
return coverPhotoJson.optString("source");
}
return null;
}
public Intent getAppLinkIntent(String appName) {
List<AppLink> appLinks = getAppLinks();
if (appLinks != null) {
for (AppLink appLink : appLinks) {
if (appName.equals(appLink.getAppName())) {
return appLink.getIntent();
}
}
}
return null;
}
public List<AppLink> getAppLinks() {
List<AppLink> appLinks = new ArrayList<>();
JSONObject appLinkJson = jsonData.optJSONObject(APP_LINKS);
if (appLinkJson != null) {
JSONArray appArray = appLinkJson.optJSONArray("android");
if (appArray != null) {
int length = appArray.length();
for (int i = 0; i < length; i++) {
JSONObject linkJson = appArray.optJSONObject(i);
if (linkJson != null) {
String appName = linkJson.optString("app_name");
Intent intent = new Intent(Intent.ACTION_VIEW);
String packageName = linkJson.optString("package");
String className = linkJson.optString("class");
if (!TextUtils.isEmpty(packageName) && !TextUtils.isEmpty(className)) {
intent.setClassName(packageName, className);
}
String url = linkJson.optString("url");
if (url != null) {
intent.setData(Uri.parse(url));
}
appLinks.add(new AppLink(appName, intent));
}
}
}
}
return appLinks;
}
public OpeningHours getOpeningHours() {
return OpeningHours.parse(this);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(jsonData.toString());
}
public static final Parcelable.Creator<Place> CREATOR = new Parcelable.Creator<Place>() {
public Place createFromParcel(Parcel in) {
try {
String json = in.readString();
return new Place(new JSONObject(json));
} catch (Exception e) {
Log.e(TAG, "Failed to parse place", e);
}
return null;
}
public Place[] newArray(int size) {
return new Place[size];
}
};
}