// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/android.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type MarkStableStatusType int32

const (
	// Unspecified
	MarkStableStatusType_MARK_STABLE_STATUS_UNSPECIFIED MarkStableStatusType = 0
	// Success
	MarkStableStatusType_MARK_STABLE_STATUS_SUCCESS MarkStableStatusType = 1
	// Pinned (at android_atom)
	MarkStableStatusType_MARK_STABLE_STATUS_PINNED MarkStableStatusType = 2
	// Early exit
	MarkStableStatusType_MARK_STABLE_STATUS_EARLY_EXIT MarkStableStatusType = 3
)

var MarkStableStatusType_name = map[int32]string{
	0: "MARK_STABLE_STATUS_UNSPECIFIED",
	1: "MARK_STABLE_STATUS_SUCCESS",
	2: "MARK_STABLE_STATUS_PINNED",
	3: "MARK_STABLE_STATUS_EARLY_EXIT",
}

var MarkStableStatusType_value = map[string]int32{
	"MARK_STABLE_STATUS_UNSPECIFIED": 0,
	"MARK_STABLE_STATUS_SUCCESS":     1,
	"MARK_STABLE_STATUS_PINNED":      2,
	"MARK_STABLE_STATUS_EARLY_EXIT":  3,
}

func (x MarkStableStatusType) String() string {
	return proto.EnumName(MarkStableStatusType_name, int32(x))
}

func (MarkStableStatusType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_f74c095a284c1bd1, []int{0}
}

type MarkStableRequest struct {
	// Required if not default.
	// The chroot where.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Required.
	// The manifest branch being used.
	TrackingBranch string `protobuf:"bytes,2,opt,name=tracking_branch,json=trackingBranch,proto3" json:"tracking_branch,omitempty"`
	// Required.
	// Portage package name for Android container.
	PackageName string `protobuf:"bytes,3,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
	// Required.
	// Android branch to import from.
	AndroidBuildBranch string `protobuf:"bytes,4,opt,name=android_build_branch,json=androidBuildBranch,proto3" json:"android_build_branch,omitempty"`
	// Force set the android build id that will be used.
	AndroidVersion string `protobuf:"bytes,5,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"`
	// Android GTS branch to copy artifacts from.
	// Deprecated.
	AndroidGtsBuildBranch string `protobuf:"bytes,6,opt,name=android_gts_build_branch,json=androidGtsBuildBranch,proto3" json:"android_gts_build_branch,omitempty"` // Deprecated: Do not use.
	// The set of relevant build targets. Used to clean old version and for a
	// emerge-able sanity check for the new version.
	// Recommended.
	BuildTargets         []*chromiumos.BuildTarget `protobuf:"bytes,7,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *MarkStableRequest) Reset()         { *m = MarkStableRequest{} }
func (m *MarkStableRequest) String() string { return proto.CompactTextString(m) }
func (*MarkStableRequest) ProtoMessage()    {}
func (*MarkStableRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f74c095a284c1bd1, []int{0}
}

func (m *MarkStableRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MarkStableRequest.Unmarshal(m, b)
}
func (m *MarkStableRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MarkStableRequest.Marshal(b, m, deterministic)
}
func (m *MarkStableRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MarkStableRequest.Merge(m, src)
}
func (m *MarkStableRequest) XXX_Size() int {
	return xxx_messageInfo_MarkStableRequest.Size(m)
}
func (m *MarkStableRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_MarkStableRequest.DiscardUnknown(m)
}

var xxx_messageInfo_MarkStableRequest proto.InternalMessageInfo

func (m *MarkStableRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *MarkStableRequest) GetTrackingBranch() string {
	if m != nil {
		return m.TrackingBranch
	}
	return ""
}

func (m *MarkStableRequest) GetPackageName() string {
	if m != nil {
		return m.PackageName
	}
	return ""
}

func (m *MarkStableRequest) GetAndroidBuildBranch() string {
	if m != nil {
		return m.AndroidBuildBranch
	}
	return ""
}

func (m *MarkStableRequest) GetAndroidVersion() string {
	if m != nil {
		return m.AndroidVersion
	}
	return ""
}

// Deprecated: Do not use.
func (m *MarkStableRequest) GetAndroidGtsBuildBranch() string {
	if m != nil {
		return m.AndroidGtsBuildBranch
	}
	return ""
}

func (m *MarkStableRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

type MarkStableResponse struct {
	// Possible errors.
	Status MarkStableStatusType `protobuf:"varint,1,opt,name=status,proto3,enum=chromite.api.MarkStableStatusType" json:"status,omitempty"`
	// The new package atom.
	AndroidAtom          *chromiumos.PackageInfo `protobuf:"bytes,2,opt,name=android_atom,json=androidAtom,proto3" json:"android_atom,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *MarkStableResponse) Reset()         { *m = MarkStableResponse{} }
func (m *MarkStableResponse) String() string { return proto.CompactTextString(m) }
func (*MarkStableResponse) ProtoMessage()    {}
func (*MarkStableResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f74c095a284c1bd1, []int{1}
}

func (m *MarkStableResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MarkStableResponse.Unmarshal(m, b)
}
func (m *MarkStableResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MarkStableResponse.Marshal(b, m, deterministic)
}
func (m *MarkStableResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MarkStableResponse.Merge(m, src)
}
func (m *MarkStableResponse) XXX_Size() int {
	return xxx_messageInfo_MarkStableResponse.Size(m)
}
func (m *MarkStableResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_MarkStableResponse.DiscardUnknown(m)
}

var xxx_messageInfo_MarkStableResponse proto.InternalMessageInfo

func (m *MarkStableResponse) GetStatus() MarkStableStatusType {
	if m != nil {
		return m.Status
	}
	return MarkStableStatusType_MARK_STABLE_STATUS_UNSPECIFIED
}

func (m *MarkStableResponse) GetAndroidAtom() *chromiumos.PackageInfo {
	if m != nil {
		return m.AndroidAtom
	}
	return nil
}

type UnpinVersionRequest struct {
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *UnpinVersionRequest) Reset()         { *m = UnpinVersionRequest{} }
func (m *UnpinVersionRequest) String() string { return proto.CompactTextString(m) }
func (*UnpinVersionRequest) ProtoMessage()    {}
func (*UnpinVersionRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f74c095a284c1bd1, []int{2}
}

func (m *UnpinVersionRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UnpinVersionRequest.Unmarshal(m, b)
}
func (m *UnpinVersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UnpinVersionRequest.Marshal(b, m, deterministic)
}
func (m *UnpinVersionRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UnpinVersionRequest.Merge(m, src)
}
func (m *UnpinVersionRequest) XXX_Size() int {
	return xxx_messageInfo_UnpinVersionRequest.Size(m)
}
func (m *UnpinVersionRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_UnpinVersionRequest.DiscardUnknown(m)
}

var xxx_messageInfo_UnpinVersionRequest proto.InternalMessageInfo

func (m *UnpinVersionRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

type UnpinVersionResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UnpinVersionResponse) Reset()         { *m = UnpinVersionResponse{} }
func (m *UnpinVersionResponse) String() string { return proto.CompactTextString(m) }
func (*UnpinVersionResponse) ProtoMessage()    {}
func (*UnpinVersionResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f74c095a284c1bd1, []int{3}
}

func (m *UnpinVersionResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UnpinVersionResponse.Unmarshal(m, b)
}
func (m *UnpinVersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UnpinVersionResponse.Marshal(b, m, deterministic)
}
func (m *UnpinVersionResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UnpinVersionResponse.Merge(m, src)
}
func (m *UnpinVersionResponse) XXX_Size() int {
	return xxx_messageInfo_UnpinVersionResponse.Size(m)
}
func (m *UnpinVersionResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_UnpinVersionResponse.DiscardUnknown(m)
}

var xxx_messageInfo_UnpinVersionResponse proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("chromite.api.MarkStableStatusType", MarkStableStatusType_name, MarkStableStatusType_value)
	proto.RegisterType((*MarkStableRequest)(nil), "chromite.api.MarkStableRequest")
	proto.RegisterType((*MarkStableResponse)(nil), "chromite.api.MarkStableResponse")
	proto.RegisterType((*UnpinVersionRequest)(nil), "chromite.api.UnpinVersionRequest")
	proto.RegisterType((*UnpinVersionResponse)(nil), "chromite.api.UnpinVersionResponse")
}

func init() { proto.RegisterFile("chromite/api/android.proto", fileDescriptor_f74c095a284c1bd1) }

var fileDescriptor_f74c095a284c1bd1 = []byte{
	// 567 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4f, 0x6e, 0xd3, 0x40,
	0x14, 0xc6, 0xb1, 0x0b, 0xa9, 0x78, 0x09, 0x8d, 0x19, 0x02, 0x35, 0x16, 0x2d, 0x89, 0x37, 0x8d,
	0xba, 0xb0, 0x51, 0x90, 0x10, 0x2a, 0x6c, 0x9c, 0xd4, 0xa0, 0x88, 0x36, 0x8a, 0xec, 0x84, 0x7f,
	0x12, 0xb2, 0x26, 0xce, 0xd4, 0xb5, 0x52, 0x7b, 0x8c, 0x3d, 0xa9, 0xc4, 0x1d, 0x38, 0x02, 0xa7,
	0xe9, 0x2d, 0x58, 0x72, 0x80, 0xde, 0x01, 0x65, 0x66, 0x42, 0x1c, 0x94, 0xb2, 0x60, 0x15, 0xe5,
	0x7d, 0xbf, 0xef, 0xcd, 0xbc, 0xef, 0x69, 0x0c, 0x46, 0x78, 0x9e, 0xd3, 0x24, 0x66, 0xc4, 0xc6,
	0x59, 0x6c, 0xe3, 0x74, 0x9a, 0xd3, 0x78, 0x6a, 0x65, 0x39, 0x65, 0x14, 0xd5, 0x96, 0x9a, 0x85,
	0xb3, 0xd8, 0x78, 0xb2, 0x46, 0x4e, 0xe6, 0xf1, 0xc5, 0x34, 0xc0, 0x59, 0x2c, 0x58, 0x63, 0x57,
	0xa8, 0xf3, 0x84, 0x16, 0x76, 0x48, 0x93, 0x84, 0xa6, 0x42, 0x30, 0x7f, 0xa9, 0x70, 0xff, 0x14,
	0xe7, 0x33, 0x9f, 0xe1, 0xc9, 0x05, 0xf1, 0xc8, 0xd7, 0x39, 0x29, 0x18, 0x3a, 0x84, 0xca, 0xc2,
	0x40, 0x99, 0xae, 0x34, 0x95, 0x76, 0xb5, 0x83, 0xac, 0x95, 0xdf, 0xea, 0x71, 0xc5, 0x93, 0x04,
	0x3a, 0x80, 0x3a, 0xcb, 0x71, 0x38, 0x8b, 0xd3, 0x28, 0x98, 0xe4, 0x38, 0x0d, 0xcf, 0x75, 0xb5,
	0xa9, 0xb4, 0xef, 0x7a, 0x3b, 0xcb, 0x72, 0x97, 0x57, 0x51, 0x0b, 0x6a, 0x19, 0x0e, 0x67, 0x38,
	0x22, 0x41, 0x8a, 0x13, 0xa2, 0x6f, 0x71, 0xaa, 0x2a, 0x6b, 0x03, 0x9c, 0x10, 0xf4, 0x0c, 0x1a,
	0x72, 0xc6, 0x40, 0x4c, 0x20, 0x1b, 0xde, 0xe6, 0x28, 0x92, 0x5a, 0x77, 0x21, 0xc9, 0xa6, 0x07,
	0x50, 0x5f, 0x3a, 0x2e, 0x49, 0x5e, 0xc4, 0x34, 0xd5, 0xef, 0x88, 0xd3, 0x65, 0xf9, 0xbd, 0xa8,
	0xa2, 0x57, 0xa0, 0x2f, 0xc1, 0x88, 0x15, 0xeb, 0xed, 0x2b, 0x0b, 0x47, 0x57, 0xd5, 0x15, 0xef,
	0xa1, 0x64, 0xde, 0xb2, 0xa2, 0x7c, 0xca, 0x6b, 0xb8, 0x27, 0x0c, 0x0c, 0xe7, 0x11, 0x61, 0x85,
	0xbe, 0xdd, 0xdc, 0x6a, 0x57, 0x3b, 0xbb, 0xe5, 0x58, 0x38, 0x3f, 0xe2, 0xba, 0x57, 0x9b, 0xac,
	0xfe, 0x14, 0xe6, 0x77, 0x05, 0x50, 0x39, 0xe3, 0x22, 0xa3, 0x69, 0x41, 0xd0, 0x11, 0x54, 0x0a,
	0x86, 0xd9, 0xbc, 0xe0, 0x21, 0xef, 0x74, 0x4c, 0xab, 0xbc, 0x50, 0x6b, 0xe5, 0xf0, 0x39, 0x35,
	0xfa, 0x96, 0x11, 0x4f, 0x3a, 0xd0, 0x11, 0xd4, 0x96, 0xd3, 0x60, 0x46, 0x13, 0x9e, 0xf8, 0x5f,
	0xf7, 0x19, 0x8a, 0x5c, 0xfb, 0xe9, 0x19, 0xf5, 0xaa, 0x12, 0x76, 0x18, 0x4d, 0x4c, 0x07, 0x1e,
	0x8c, 0xd3, 0x2c, 0x4e, 0x65, 0x32, 0xff, 0xb1, 0x73, 0xf3, 0x11, 0x34, 0xd6, 0x5b, 0x88, 0x91,
	0x0e, 0x7f, 0x28, 0xd0, 0xd8, 0x74, 0x6f, 0x64, 0xc2, 0xfe, 0xa9, 0xe3, 0xbd, 0x0b, 0xfc, 0x91,
	0xd3, 0x3d, 0x71, 0x17, 0x3f, 0xa3, 0xb1, 0x1f, 0x8c, 0x07, 0xfe, 0xd0, 0xed, 0xf5, 0xdf, 0xf4,
	0xdd, 0x63, 0xed, 0x16, 0xda, 0x07, 0x63, 0x03, 0xe3, 0x8f, 0x7b, 0x3d, 0xd7, 0xf7, 0x35, 0x05,
	0xed, 0xc1, 0xe3, 0x0d, 0xfa, 0xb0, 0x3f, 0x18, 0xb8, 0xc7, 0x9a, 0x8a, 0x5a, 0xb0, 0xb7, 0x41,
	0x76, 0x1d, 0xef, 0xe4, 0x53, 0xe0, 0x7e, 0xec, 0x8f, 0xb4, 0xad, 0xce, 0x4f, 0x05, 0x76, 0x1c,
	0x91, 0x84, 0x4f, 0xf2, 0xcb, 0x38, 0x24, 0xe8, 0x03, 0xc0, 0xea, 0xc2, 0xe8, 0xe9, 0x4d, 0x2b,
	0x90, 0x21, 0x19, 0xcd, 0x9b, 0x01, 0x11, 0x81, 0x59, 0xb9, 0xba, 0x36, 0x54, 0x4d, 0x45, 0x5f,
	0xa0, 0x56, 0x8e, 0x08, 0xb5, 0xd6, 0x9d, 0x1b, 0x36, 0x60, 0x98, 0xff, 0x42, 0xd6, 0xda, 0x2b,
	0x46, 0xfd, 0xea, 0xda, 0xa8, 0xc2, 0xb6, 0xdc, 0xab, 0xa6, 0x74, 0x5f, 0x7e, 0x7e, 0x11, 0xd1,
	0x3f, 0x2b, 0xb3, 0x68, 0x1e, 0xd9, 0xa5, 0x37, 0x1f, 0xa7, 0x67, 0x39, 0xb6, 0xf9, 0x93, 0xb7,
	0x23, 0x6a, 0x97, 0xbf, 0x15, 0x93, 0x0a, 0x2f, 0x3f, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x80,
	0x11, 0x5a, 0xf1, 0x6c, 0x04, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// AndroidServiceClient is the client API for AndroidService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type AndroidServiceClient interface {
	// The MarkStable method uprevs Android, verifies the newly revved package
	// can be emerged, and returns the new package info.
	MarkStable(ctx context.Context, in *MarkStableRequest, opts ...grpc.CallOption) (*MarkStableResponse, error)
	// Unpin the Android package version.
	UnpinVersion(ctx context.Context, in *UnpinVersionRequest, opts ...grpc.CallOption) (*UnpinVersionResponse, error)
}

type androidServiceClient struct {
	cc *grpc.ClientConn
}

func NewAndroidServiceClient(cc *grpc.ClientConn) AndroidServiceClient {
	return &androidServiceClient{cc}
}

func (c *androidServiceClient) MarkStable(ctx context.Context, in *MarkStableRequest, opts ...grpc.CallOption) (*MarkStableResponse, error) {
	out := new(MarkStableResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.AndroidService/MarkStable", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *androidServiceClient) UnpinVersion(ctx context.Context, in *UnpinVersionRequest, opts ...grpc.CallOption) (*UnpinVersionResponse, error) {
	out := new(UnpinVersionResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.AndroidService/UnpinVersion", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// AndroidServiceServer is the server API for AndroidService service.
type AndroidServiceServer interface {
	// The MarkStable method uprevs Android, verifies the newly revved package
	// can be emerged, and returns the new package info.
	MarkStable(context.Context, *MarkStableRequest) (*MarkStableResponse, error)
	// Unpin the Android package version.
	UnpinVersion(context.Context, *UnpinVersionRequest) (*UnpinVersionResponse, error)
}

// UnimplementedAndroidServiceServer can be embedded to have forward compatible implementations.
type UnimplementedAndroidServiceServer struct {
}

func (*UnimplementedAndroidServiceServer) MarkStable(ctx context.Context, req *MarkStableRequest) (*MarkStableResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method MarkStable not implemented")
}
func (*UnimplementedAndroidServiceServer) UnpinVersion(ctx context.Context, req *UnpinVersionRequest) (*UnpinVersionResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UnpinVersion not implemented")
}

func RegisterAndroidServiceServer(s *grpc.Server, srv AndroidServiceServer) {
	s.RegisterService(&_AndroidService_serviceDesc, srv)
}

func _AndroidService_MarkStable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(MarkStableRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(AndroidServiceServer).MarkStable(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.AndroidService/MarkStable",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(AndroidServiceServer).MarkStable(ctx, req.(*MarkStableRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _AndroidService_UnpinVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UnpinVersionRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(AndroidServiceServer).UnpinVersion(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.AndroidService/UnpinVersion",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(AndroidServiceServer).UnpinVersion(ctx, req.(*UnpinVersionRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _AndroidService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.AndroidService",
	HandlerType: (*AndroidServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "MarkStable",
			Handler:    _AndroidService_MarkStable_Handler,
		},
		{
			MethodName: "UnpinVersion",
			Handler:    _AndroidService_UnpinVersion_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/android.proto",
}
