/*
 * Copyright (C) 2017 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 android.service.appwidget;

option java_multiple_files = true;
option java_outer_classname = "AppWidgetServiceProto";

// represents the object holding the dump info of the app widget service
message AppWidgetServiceDumpProto {
  repeated WidgetProto widgets = 1; // the array of bound widgets
}

// represents a bound widget
message WidgetProto {
  optional bool isCrossProfile = 1; // true if host and provider belong to diff users
  optional bool isHostStopped = 2; // true if host has not called startListening yet
  optional string hostPackage = 3;
  optional string providerPackage = 4;
  optional string providerClass = 5;
  optional int32 minWidth = 6;
  optional int32 minHeight = 7;
  optional int32 maxWidth = 8;
  optional int32 maxHeight = 9;
}
