/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto2";

package launcher_backup;

option java_package = "com.android.launcher3.backup";
option java_outer_classname = "BackupProtos";

message Key {
  enum Type {
    FAVORITE = 1;
    SCREEN = 2;
    ICON = 3;
    WIDGET = 4;
  }
  required Type type = 1;
  optional string name = 2;  // keep this short
  optional int64 id = 3;
  optional int64 checksum = 4;
}

message CheckedMessage {
  required bytes payload = 1;
  required int64 checksum = 2;
}

message DeviceProfieData {
  required float desktop_rows = 1;
  required float desktop_cols = 2;
  required float hotseat_count = 3;
  required int32 allapps_rank = 4;
}

message Journal {
  required int32 app_version = 1;

  // Time when the backup was created
  required int64 t = 2;

  // Total bytes written during the last backup
  // OBSOLETE: A state may contain entries which are already present in the backup
  // and were not written in the last backup
  optional int64 bytes = 3;

  // Total entries written during the last backup
  // OBSOLETE: A state may contain entries which are already present in the backup
  // and were not written in the last backup
  optional int32 rows = 4;

  // Valid keys for this state
  repeated Key key = 5;

  // Backup format version.
  optional int32 backup_version = 6 [default = 1];

  optional DeviceProfieData profile = 7;
}

message Favorite {
  // Type of the app, this target represents
  enum TargetType {
    TARGET_NONE = 0;
    TARGET_PHONE = 1;
    TARGET_MESSENGER = 2;
    TARGET_EMAIL = 3;
    TARGET_BROWSER = 4;
    TARGET_GALLERY = 5;
    TARGET_CAMERA = 6;
  }

  required int64 id = 1;
  required int32 itemType = 2;
  optional string title = 3;
  optional int32 container = 4;
  optional int32 screen = 5;
  optional int32 cellX = 6;
  optional int32 cellY = 7;
  optional int32 spanX = 8;
  optional int32 spanY = 9;
  optional int32 displayMode = 10;
  optional int32 appWidgetId = 11;
  optional string appWidgetProvider = 12;
  optional string intent = 13;
  optional string uri = 14;
  optional int32 iconType = 15;
  optional string iconPackage = 16;
  optional string iconResource = 17;
  optional bytes icon = 18;
  optional TargetType targetType = 19 [default = TARGET_NONE];
 }

message Screen {
  required int64 id = 1;
  optional int32 rank = 2;
 }

message Resource {
  required int32 dpi = 1;
  required bytes data = 2;
 }

message Widget {
  required string provider = 1;
  optional string label = 2;
  optional bool configure = 3;
  optional Resource icon = 4;
  optional Resource preview = 5;
 }
