content: /*
   * Copyright 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.
   */
  
  package com.example.android.persistence.ui;
  
  import androidx.annotation.NonNull;
  import androidx.databinding.DataBindingUtil;
  import androidx.annotation.Nullable;
  import androidx.recyclerview.widget.DiffUtil;
  import androidx.recyclerview.widget.RecyclerView;
  
  import android.text.TextUtils;
  import android.view.LayoutInflater;
  import android.view.ViewGroup;
  
  import com.example.android.persistence.databinding.ProductItemBinding;
  import com.example.android.persistence.model.Product;
  import com.example.android.persistence.R;
  
  import java.util.List;
  
  public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {
  
      List<? extends Product> mProductList;
  
      @Nullable
      private final ProductClickCallback mProductClickCallback;
  
      public ProductAdapter(@Nullable ProductClickCallback clickCallback) {
          mProductClickCallback = clickCallback;
          setHasStableIds(true);
      }
  
      public void setProductList(final List<? extends Product> productList) {
          if (mProductList == null) {
              mProductList = productList;
              notifyItemRangeInserted(0, productList.size());
          } else {
              DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
                  @Override
                  public int getOldListSize() {
                      return mProductList.size();
                  }
  
                  @Override
                  public int getNewListSize() {
                      return productList.size();
                  }
  
                  @Override
                  public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
                      return mProductList.get(oldItemPosition).getId() ==
                              productList.get(newItemPosition).getId();
                  }
  
                  @Override
                  public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
                      Product newProduct = productList.get(newItemPosition);
                      Product oldProduct = mProductList.get(oldItemPosition);
                      return newProduct.getId() == oldProduct.getId()
                              && TextUtils.equals(newProduct.getDescription(), oldProduct.getDescription())
                              && TextUtils.equals(newProduct.getName(), oldProduct.getName())
                              && newProduct.getPrice() == oldProduct.getPrice();
                  }
              });
              mProductList = productList;
              result.dispatchUpdatesTo(this);
          }
      }
  
      @Override
      @NonNull
      public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
          ProductItemBinding binding = DataBindingUtil
                  .inflate(LayoutInflater.from(parent.getContext()), R.layout.product_item,
                          parent, false);
          binding.setCallback(mProductClickCallback);
          return new ProductViewHolder(binding);
      }
  
      @Override
      public void onBindViewHolder(@NonNull ProductViewHolder holder, int position) {
          holder.binding.setProduct(mProductList.get(position));
          holder.binding.executePendingBindings();
      }
  
      @Override
      public int getItemCount() {
          return mProductList == null ? 0 : mProductList.size();
      }
  
      @Override
      public long getItemId(int position) {
          return mProductList.get(position).getId();
      }
  
      static class ProductViewHolder extends RecyclerView.ViewHolder {
  
          final ProductItemBinding binding;
  
          public ProductViewHolder(ProductItemBinding binding) {
              super(binding.getRoot());
              this.binding = binding;
          }
      }
  }
  