| Index: chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionAnswer.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionAnswer.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionAnswer.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..efd5cfb8cb3d99ffc224738a6529a53d3f619422
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SuggestionAnswer.java
|
| @@ -0,0 +1,192 @@
|
| +// 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.chrome.browser.omnibox;
|
| +
|
| +import android.util.Log;
|
| +
|
| +import org.json.JSONArray;
|
| +import org.json.JSONException;
|
| +import org.json.JSONObject;
|
| +
|
| +import java.util.ArrayList;
|
| +import java.util.List;
|
| +
|
| +/**
|
| + * Structured representation of the JSON payload of a suggestion with an answer. An answer has
|
| + * exactly two image lines, so called because they are a combination of text and an optional
|
| + * image. Each image line has 0 or more text fields, each of which is required to contain a string
|
| + * and an integer type. The text fields are contained in a list and two optional named properties,
|
| + * referred to as "additional text" and "status text". The image, if present, contains a single
|
| + * string, which may be a URL or base64-encoded image data.
|
| + *
|
| + * When represented in the UI, these elements should be styled and layed out according to the
|
| + * specification at http://goto.google.com/ais_api.
|
| + */
|
| +public class SuggestionAnswer {
|
| + private static final String TAG = "SuggestionAnswer";
|
| +
|
| + private ImageLine mFirstLine;
|
| + private ImageLine mSecondLine;
|
| +
|
| + private static final String ANSWERS_JSON_LINE = "l";
|
| + private static final String ANSWERS_JSON_IMAGE_LINE = "il";
|
| + private static final String ANSWERS_JSON_TEXT = "t";
|
| + private static final String ANSWERS_JSON_ADDITIONAL_TEXT = "at";
|
| + private static final String ANSWERS_JSON_STATUS_TEXT = "st";
|
| + private static final String ANSWERS_JSON_TEXT_TYPE = "tt";
|
| + private static final String ANSWERS_JSON_IMAGE = "i";
|
| + private static final String ANSWERS_JSON_IMAGE_DATA = "d";
|
| +
|
| + private SuggestionAnswer() {
|
| + }
|
| +
|
| + /**
|
| + * Parses the JSON representation of an answer and constructs a SuggestionAnswer from the
|
| + * contents.
|
| + *
|
| + * @param answerContents The JSON representation of an answer.
|
| + * @return A SuggestionAnswer with the answer contents or null if the contents are malformed or
|
| + * missing required elements.
|
| + */
|
| + public static SuggestionAnswer parseAnswerContents(String answerContents) {
|
| + SuggestionAnswer answer = new SuggestionAnswer();
|
| +
|
| + try {
|
| + JSONObject jsonAnswer = new JSONObject(answerContents);
|
| + JSONArray jsonLines = jsonAnswer.getJSONArray(ANSWERS_JSON_LINE);
|
| +
|
| + if (jsonLines.length() != 2) {
|
| + Log.e(TAG, "Answer JSON doesn't contain exactly two lines: " + jsonAnswer);
|
| + return null;
|
| + }
|
| +
|
| + answer.mFirstLine = new SuggestionAnswer.ImageLine(
|
| + jsonLines.getJSONObject(0).getJSONObject(ANSWERS_JSON_IMAGE_LINE));
|
| + answer.mSecondLine = new SuggestionAnswer.ImageLine(
|
| + jsonLines.getJSONObject(1).getJSONObject(ANSWERS_JSON_IMAGE_LINE));
|
| + } catch (JSONException e) {
|
| + Log.e(TAG, "Problem parsing answer JSON: " + e.getMessage());
|
| + return null;
|
| + }
|
| +
|
| + return answer;
|
| + }
|
| +
|
| + /**
|
| + * Returns the first of the two required image lines.
|
| + */
|
| + public ImageLine getFirstLine() {
|
| + return mFirstLine;
|
| + }
|
| +
|
| + /**
|
| + * Returns the second of the two required image lines.
|
| + */
|
| + public ImageLine getSecondLine() {
|
| + return mSecondLine;
|
| + }
|
| +
|
| + /**
|
| + * Represents a single line of an answer, containing any number of typed text fields and an
|
| + * optional image.
|
| + */
|
| + public static class ImageLine {
|
| + private final List<TextField> mTextFields;
|
| + private final TextField mAdditionalText;
|
| + private final TextField mStatusText;
|
| + private final String mImage;
|
| +
|
| + ImageLine(JSONObject jsonLine) throws JSONException {
|
| + mTextFields = new ArrayList<TextField>();
|
| +
|
| + JSONArray textValues = jsonLine.getJSONArray(ANSWERS_JSON_TEXT);
|
| + for (int i = 0; i < textValues.length(); i++) {
|
| + mTextFields.add(new TextField(textValues.getJSONObject(i)));
|
| + }
|
| +
|
| + mAdditionalText = jsonLine.has(ANSWERS_JSON_ADDITIONAL_TEXT) ?
|
| + new TextField(jsonLine.getJSONObject(ANSWERS_JSON_ADDITIONAL_TEXT)) :
|
| + null;
|
| +
|
| + mStatusText = jsonLine.has(ANSWERS_JSON_STATUS_TEXT) ?
|
| + new TextField(jsonLine.getJSONObject(ANSWERS_JSON_STATUS_TEXT)) :
|
| + null;
|
| +
|
| + mImage = jsonLine.has(ANSWERS_JSON_IMAGE) ?
|
| + jsonLine.getJSONObject(ANSWERS_JSON_IMAGE).getString(ANSWERS_JSON_IMAGE_DATA) :
|
| + null;
|
| + }
|
| +
|
| + /**
|
| + * Return an unnamed list of text fields. These represent the main content of the line.
|
| + */
|
| + public List<TextField> getTextFields() {
|
| + return mTextFields;
|
| + }
|
| +
|
| + /**
|
| + * Returns true if the line contains an "additional text" field.
|
| + */
|
| + public boolean hasAdditionalText() {
|
| + return mAdditionalText != null;
|
| + }
|
| +
|
| + /**
|
| + * Return the "additional text" field.
|
| + */
|
| + public TextField getAdditionalText() {
|
| + return mAdditionalText;
|
| + }
|
| +
|
| + /**
|
| + * Returns true if the line contains an "status text" field.
|
| + */
|
| + public boolean hasStatusText() {
|
| + return mStatusText != null;
|
| + }
|
| +
|
| + /**
|
| + * Return the "status text" field.
|
| + */
|
| + public TextField getStatusText() {
|
| + return mStatusText;
|
| + }
|
| +
|
| + /**
|
| + * Returns true if the line contains an image.
|
| + */
|
| + public boolean hasImage() {
|
| + return mImage != null;
|
| + }
|
| +
|
| + /**
|
| + * Return the optional image (URL or base64-encoded image data).
|
| + */
|
| + public String getImage() {
|
| + return mImage;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Represents one text field of an answer, containing a integer type and a string.
|
| + */
|
| + public static class TextField {
|
| + private final int mType;
|
| + private final String mText;
|
| +
|
| + TextField(JSONObject jsonTextField) throws JSONException {
|
| + mType = jsonTextField.getInt(ANSWERS_JSON_TEXT_TYPE);
|
| + mText = jsonTextField.getString(ANSWERS_JSON_TEXT);
|
| + }
|
| +
|
| + public int getType() {
|
| + return mType;
|
| + }
|
| +
|
| + public String getText() {
|
| + return mText;
|
| + }
|
| + }
|
| +}
|
|
|