/*
 * Copyright (C) 2015 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.
 */

package com.android.contacts.common.model;

import android.content.ContentProviderOperation.Builder;

/**
 * This class is created for the purpose of compatibility and make the type of
 * ContentProviderOperation available on pre-M SDKs. Since ContentProviderOperation is usually
 * created by Builder and we don’t have access to the type via Builder, so we need to create a
 * wrapper class for Builder first and include type. Then we could use the builder and the type in
 * this class to create a wrapper of ContentProviderOperation.
 */
public class BuilderWrapper {

  private Builder mBuilder;
  private int mType;

  public BuilderWrapper(Builder builder, int type) {
    mBuilder = builder;
    mType = type;
  }

  public int getType() {
    return mType;
  }

  public void setType(int mType) {
    this.mType = mType;
  }

  public Builder getBuilder() {
    return mBuilder;
  }

  public void setBuilder(Builder mBuilder) {
    this.mBuilder = mBuilder;
  }
}
