syntax = "proto2";

option java_package = "com.android.dialer.phonelookup";
option java_multiple_files = true;


package com.android.dialer.phonelookup;

// Contains information about a phone number, possibly from many sources.
//
// This message is organized into sub-message fields where each one corresponds
// to an implementation of PhoneLookup. For example, field
// "cp2_info_in_default_directory" corresponds to class
// Cp2DefaultDirectoryPhoneLookup, and class Cp2DefaultDirectoryPhoneLookup
// alone is responsible for populating it.
// Next ID: 11
message PhoneLookupInfo {
  // Information about a PhoneNumber retrieved from CP2.
  message Cp2Info {
    // Information about a single contact.
    // Next ID: 9
    message Cp2ContactInfo {
      // For a contact in the default directory:
      //   android.provider.ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY
      // For a contact in other directories:
      //   android.provider.ContactsContract.PhoneLookup.DISPLAY_NAME_PRIMARY
      optional string name = 1;

      // For a contact in the default directory:
      //   android.provider.ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI
      // For a contact in other directories:
      //   android.provider.ContactsContract.PhoneLookup.PHOTO_THUMBNAIL_URI
      optional string photo_thumbnail_uri = 2;

      // For a contact in the default directory:
      //   android.provider.ContactsContract.CommonDataKinds.Phone.PHOTO_URI
      // For a contact in other directories:
      //   android.provider.ContactsContract.PhoneLookup.PHOTO_URI
      optional string photo_uri = 3;

      // For a contact in the default directory:
      //   android.provider.ContactsContract.CommonDataKinds.Phone.PHOTO_ID
      // For a contact in other directories:
      //   android.provider.ContactsContract.PhoneLookup.PHOTO_ID
      optional fixed64 photo_id = 4;

      // For a contact in the default directory:
      //   android.provider.ContactsContract.CommonDataKinds.Phone.LABEL
      // For a contact in other directories:
      //   android.provider.ContactsContract.PhoneLookup.LABEL
      //
      // The value can be "Home", "Mobile", ect.
      optional string label = 5;

      // For a contact in the default directory:
      //   android.provider.ContactsContract.CommonDataKinds.Phone.CONTACT_ID
      // For a contact in other directories:
      //   android.provider.ContactsContract.PhoneLookup.CONTACT_ID
      optional fixed64 contact_id = 6;

      // For a contact in the default directory:
      //   constructed based on
      //   android.provider.ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY
      // For a contact in other directories:
      //   constructed based on
      //   android.provider.ContactsContract.PhoneLookup.LOOKUP_KEY
      optional string lookup_uri = 7;

      // For a contact in the default directory:
      //    value set based on
      //    android.provider.ContactsContract.CommonDataKinds.Phone.CARRIER_PRESENCE
      // For a contact in other directories: always false.
      //    This is because we lookup contacts in other directories via
      //    android.provider.ContactsContract.PhoneLookup, to which carrier
      //    presence info is not directly accessible.
      optional bool can_support_carrier_video_call = 8;
    }
    // Repeated because one phone number can be associated with multiple CP2
    // contacts.
    //
    // Empty if there is no CP2 contact information for the number.
    repeated Cp2ContactInfo cp2_contact_info = 1;

    // The information for this number is incomplete. This can happen when the
    // call log is requested to be updated but there are many invalid numbers
    // and the update cannot be performed efficiently. In this case, the call
    // log needs to query for the CP2 information at render time.
    optional bool is_incomplete = 2;
  }

  // Information about a contact in the default directory, retrieved via CP2.
  // Cp2DefaultDirectoryPhoneLookup is responsible for populating this field.
  optional Cp2Info default_cp2_info = 1;

  // Information about a contact in other directories, retrieved via CP2.
  // Cp2ExtendedDirectoryPhoneLookup is responsible for populating this field.
  optional Cp2Info extended_cp2_info = 6;

  // Message for spam info.
  // SpamPhoneLookup is responsible for populating this message.
  message SpamInfo {
    optional bool is_spam = 1;
  }
  optional SpamInfo spam_info = 2;

  // Message for PeopleApi, including G+ contacts and nearby places
  message PeopleApiInfo {
    // Best display name determined by people API if available, first display
    // name otherwise.
    optional string display_name = 1;

    // The type of the number, for example "phone" or "home".
    optional string number_type = 2;

    // The number_type label in human readable string, for example "Phone".
    // The UI should display known number_type with string resources if possible
    // but if number_type is unrecognized formatted_number_type. For example
    // if the user set an custom type label.
    optional string formatted_number_type = 3;

    // URL to the contact's full size photo.
    optional string image_url = 4;

    // The primary key of the contact in people API.
    optional string person_id = 5;

    enum InfoType {
      UNKNOWN = 0;
      CONTACT = 1;          // the result is a saved contact in people API
      NEARBY_BUSINESS = 2;  // the result is found through nearby places
    }
    // The type of the lookup result, for example, a saved contact or a nearby
    // business.
    optional InfoType info_type = 6;

    // A URI that contains encoded JSON about the number so contacts can
    // populate the quick contact activity with name and numbers. This does not
    // point to any real contact entry anywhere.
    optional string lookup_uri = 7;
  }
  optional PeopleApiInfo people_api_info = 3;

  // Whether a number is blocked or not. Used by both the system block list and
  // dialer fallback
  enum BlockedState {
    UNKNOWN = 0;
    BLOCKED = 1;
    NOT_BLOCKED = 2;
  }

  // Message for the android system BlockedNumber lookup. Available starting in
  // N.
  message SystemBlockedNumberInfo {
    optional BlockedState blocked_state = 1;
  }
  optional SystemBlockedNumberInfo system_blocked_number_info = 4;

  // Information obtained via CNAP
  // (https://en.wikipedia.org/wiki/Calling_Name_Presentation)
  // Next ID: 2
  message CnapInfo {
    optional string name = 1;
  }
  optional CnapInfo cnap_info = 7;

  // Information obtained via Cequint
  // Next ID: 4
  message CequintInfo {
    optional string name = 1;

    // Description of the geolocation (e.g., "Mountain View, CA")
    optional string geolocation = 2;

    optional string photo_uri = 3;
  }
  optional CequintInfo cequint_info = 8;

  // Message indicating whether a number is an emergency number.
  // Next ID: 2
  message EmergencyInfo {
    optional bool is_emergency_number = 1;
  }
  optional EmergencyInfo emergency_info = 9;

  // Information cached in the old calllog
  message MigratedInfo {
    // The display name
    optional string name = 1;
    // Display label, i.e. "Home", "Mobile"
    optional string label = 2;

    optional string photo_uri = 3;

    optional bool is_business = 4;
    // ContactSource.Type
    optional int32 source_type = 5;
  }
  optional MigratedInfo migrated_info = 10;
}