blob: 795347f81acc59d72d696e36891e40cc8f0890ca [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chromoting;
import android.content.Context;
import android.text.TextUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.chromium.base.Log;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/** Class to represent a Host returned by {@link HostListManager}. */
public class HostInfo {
private static final String TAG = "Chromoting";
public final String name;
public final String id;
public final String jabberId;
public final String publicKey;
public final boolean isOnline;
public final String hostOfflineReason;
public final Date updatedTime;
public final String hostVersion;
public final String hostOs;
public final String hostOsVersion;
private final ArrayList<String> mTokenUrlPatterns;
// Format of time values coming from the Chromoting REST API.
// This is a specific form of RFC3339 (with no timezone info).
// Example value to be parsed: 2014-11-21T01:02:33.814Z
private static final String RFC_3339_FORMAT = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'";
// Value to use if time string received from the network is malformed.
// Such malformed string should in theory never happen, but we want
// to have a safe fallback in case it does happen.
private static final Date FALLBACK_DATE_IN_THE_PAST = new Date(0);
public HostInfo(String name, String id, String jabberId, String publicKey,
ArrayList<String> tokenUrlPatterns, boolean isOnline, String hostOfflineReason,
String updatedTime, String hostVersion, String hostOs, String hostOsVersion) {
this.name = name;
this.id = id;
this.jabberId = jabberId;
this.publicKey = publicKey;
this.mTokenUrlPatterns = tokenUrlPatterns;
this.isOnline = isOnline;
this.hostOfflineReason = hostOfflineReason;
this.hostVersion = hostVersion;
this.hostOs = hostOs;
this.hostOsVersion = hostOsVersion;
ParsePosition parsePosition = new ParsePosition(0);
SimpleDateFormat format = new SimpleDateFormat(RFC_3339_FORMAT, Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Date updatedTimeCandidate = format.parse(updatedTime, parsePosition);
if (updatedTimeCandidate == null) {
Log.e(TAG, "Unparseable host.updatedTime JSON: errorIndex = %d, input = %s",
parsePosition.getErrorIndex(), updatedTime);
updatedTimeCandidate = FALLBACK_DATE_IN_THE_PAST;
}
this.updatedTime = updatedTimeCandidate;
}
private int getHostOfflineReasonResourceId(String reason) {
switch (reason) {
case "initialization_failed":
return R.string.offline_reason_initialization_failed;
case "invalid_host_configuration":
return R.string.offline_reason_invalid_host_configuration;
case "invalid_host_id":
return R.string.offline_reason_invalid_host_id;
case "invalid_oauth_credentials":
return R.string.offline_reason_invalid_oauth_credentials;
case "invalid_host_domain":
return R.string.offline_reason_invalid_host_domain;
case "login_screen_not_supported":
return R.string.offline_reason_login_screen_not_supported;
case "policy_read_error":
return R.string.offline_reason_policy_read_error;
case "policy_change_requires_restart":
return R.string.offline_reason_policy_change_requires_restart;
case "success_exit":
return R.string.offline_reason_success_exit;
case "username_mismatch":
return R.string.offline_reason_username_mismatch;
case "x_server_retries_exceeded":
return R.string.offline_reason_x_server_retries_exceeded;
case "session_retries_exceeded":
return R.string.offline_reason_session_retries_exceeded;
case "host_retries_exceeded":
return R.string.offline_reason_host_retries_exceeded;
default:
return R.string.offline_reason_unknown;
}
}
public String getHostOfflineReasonText(Context context) {
if (TextUtils.isEmpty(hostOfflineReason)) {
return context.getString(R.string.host_offline_tooltip);
}
return context.getString(
getHostOfflineReasonResourceId(hostOfflineReason.toLowerCase(Locale.ENGLISH)));
}
public ArrayList<String> getTokenUrlPatterns() {
return new ArrayList<String>(mTokenUrlPatterns);
}
public static HostInfo create(JSONObject json) throws JSONException {
assert json != null;
ArrayList<String> tokenUrlPatterns = new ArrayList<String>();
JSONArray jsonPatterns = json.optJSONArray("tokenUrlPatterns");
if (jsonPatterns != null) {
for (int i = 0; i < jsonPatterns.length(); i++) {
String pattern = jsonPatterns.getString(i);
if (pattern != null && !pattern.isEmpty()) {
tokenUrlPatterns.add(pattern);
}
}
}
return new HostInfo(json.getString("hostName"), json.getString("hostId"),
json.optString("jabberId"), json.optString("publicKey"), tokenUrlPatterns,
json.optString("status").equals("ONLINE"), json.optString("hostOfflineReason"),
json.optString("updatedTime"), json.optString("hostVersion"),
json.optString("hostOs"), json.optString("hostOsVersion"));
}
}