/*
 * 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.nano";
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 [deprecated = true];
  optional string iconPackage = 16;
  optional string iconResource = 17;
  optional bytes icon = 18;

  // Added in backup version 4
  optional TargetType targetType = 19 [default = TARGET_NONE];
  optional int32 rank = 20;
}

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;

  // Added in backup version 3
  // Assume that a widget is resizable upto 2x2 if no data is available
  optional int32 minSpanX = 6 [default = 2];
  optional int32 minSpanY = 7 [default = 2];
}
