/*
* 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;
import android.arch.lifecycle.LifecycleFragment;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.android.persistence.databinding.ProductFragmentBinding;
import com.example.android.persistence.db.entity.CommentEntity;
import com.example.android.persistence.db.entity.ProductEntity;
import com.example.android.persistence.model.Comment;
import com.example.android.persistence.ui.CommentAdapter;
import com.example.android.persistence.ui.CommentClickCallback;
import com.example.android.persistence.viewmodel.ProductViewModel;
import java.util.List;
public class ProductFragment extends LifecycleFragment {
private static final String KEY_PRODUCT_ID = "product_id";
private ProductFragmentBinding mBinding;
private CommentAdapter mCommentAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// Inflate this data binding layout
mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false);
// Create and set the adapter for the RecyclerView.
mCommentAdapter = new CommentAdapter(mCommentClickCallback);
mBinding.commentList.setAdapter(mCommentAdapter);
return mBinding.getRoot();
}
private final CommentClickCallback mCommentClickCallback = new CommentClickCallback() {
@Override
public void onClick(Comment comment) {
// no-op
}
};
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ProductViewModel.Factory factory = new ProductViewModel.Factory(
getActivity().getApplication(), getArguments().getInt(KEY_PRODUCT_ID));
final ProductViewModel model = ViewModelProviders.of(this, factory)
.get(ProductViewModel.class);
mBinding.setProductViewModel(model);
subscribeToModel(model);
}
private void subscribeToModel(final ProductViewModel model) {
// Observe product data
model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
@Override
public void onChanged(@Nullable ProductEntity productEntity) {
model.setProduct(productEntity);
}
});
// Observe comments
model.getComments().observe(this, new Observer<List<CommentEntity>>() {
@Override
public void onChanged(@Nullable List<CommentEntity> commentEntities) {
if (commentEntities != null) {
mBinding.setIsLoading(false);
mCommentAdapter.setCommentList(commentEntities);
} else {
mBinding.setIsLoading(true);
}
}
});
}
/** Creates product fragment for specific product ID */
public static ProductFragment forProduct(int productId) {
ProductFragment fragment = new ProductFragment();
Bundle args = new Bundle();
args.putInt(KEY_PRODUCT_ID, productId);
fragment.setArguments(args);
return fragment;
}
}