/*
* Copyright(c) 2017 lizhaotailang
*
* 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 io.github.marktony.espresso.mvp.packagedetails;
import android.app.ActivityOptions;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.AppCompatTextView;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import io.github.marktony.espresso.R;
import io.github.marktony.espresso.component.Timeline;
import io.github.marktony.espresso.data.Package;
import io.github.marktony.espresso.data.PackageStatus;
import io.github.marktony.espresso.mvp.companydetails.CompanyDetailActivity;
import io.realm.RealmList;
/**
* Created by lizhaotailang on 2017/2/12.
*/
public class PackageDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@NonNull
private final Context context;
@NonNull
private final LayoutInflater inflater;
@NonNull
private final Package aPackage;
private final List<PackageStatus> list;
public static final int TYPE_HEADER = 0x00;
public static final int TYPE_NORMAL = 0x01;
public static final int TYPE_START = 0x02;
public static final int TYPE_FINISH = 0x03;
public static final int TYPE_SINGLE = 0x04;
public PackageDetailsAdapter(@NonNull Context context, @NonNull Package p) {
this.context = context;
inflater = LayoutInflater.from(context);
this.aPackage = p;
// Convert the RealmList to a normal List.
// Pass a RealmList as parameter directly where List is required
// is NOT a good idea.
// The code below will make some terrible bugs.
// view.showPackageDetails(list);
// One the them is that the first load works perfectly.
// But when the screen call onPause and back to user again,
// the list (RecyclerView) is lost and all the data is removed from DB.
this.list = new ArrayList<>();
for (PackageStatus status : p.getData()) {
list.add(status);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
return new HeaderViewHolder(inflater.inflate(R.layout.item_details_header, parent, false));
}
return new PackageStatusViewHolder(inflater.inflate(R.layout.item_package_status, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER) {
HeaderViewHolder vh = (HeaderViewHolder) holder;
vh.textViewCompany.setText(aPackage.getCompanyChineseName());
vh.textViewName.setText(aPackage.getName());
vh.textViewNumber.setText(aPackage.getNumber());
} else {
PackageStatus item = list.get(position - 1);
PackageStatusViewHolder viewHolder = (PackageStatusViewHolder) holder;
if (getItemViewType(position) == TYPE_SINGLE) {
viewHolder.timeLine.setStartLine(null);
viewHolder.timeLine.setFinishLine(null);
} else if (getItemViewType(position) == TYPE_START) {
viewHolder.timeLine.setStartLine(null);
} else if (getItemViewType(position) == TYPE_FINISH) {
viewHolder.timeLine.setFinishLine(null);
}
viewHolder.textViewTime.setText(item.getTime());
viewHolder.textViewLocation.setText(item.getContext());
String phone = item.getPhone();
if (phone != null) {
viewHolder.textViewPhone.setText(phone);
}
viewHolder.contactCard.setVisibility(phone != null ? View.VISIBLE : View.GONE);
}
}
@Override
public int getItemCount() {
// Including a header.
return aPackage.getData().size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return TYPE_HEADER;
} else if (position == 1 && position == list.size()) {
// The list may contains only one item.
return TYPE_SINGLE;
} else if (position == 1) {
return TYPE_START;
} else if (position == list.size()) {
return TYPE_FINISH;
}
return TYPE_NORMAL;
}
/**
* DO NOT cast a RealmList to List or you will got some unexpected bugs.
* @param list The RealmList.
*/
public void updateData(@NonNull RealmList<PackageStatus> list) {
this.list.clear();
// See {@link PackageDetailsAdapter#PackageDetailsAdapter}
for (PackageStatus p : list) {
this.list.add(p);
}
notifyDataSetChanged();
}
/**
* The package status view holder of recyclerView.
*/
public class PackageStatusViewHolder extends RecyclerView.ViewHolder {
private AppCompatTextView textViewLocation;
private AppCompatTextView textViewTime;
private Timeline timeLine;
private CardView contactCard;
private AppCompatTextView textViewPhone;
public PackageStatusViewHolder(View itemView) {
super(itemView);
textViewLocation = (AppCompatTextView) itemView.findViewById(R.id.textViewStatus);
textViewTime = (AppCompatTextView) itemView.findViewById(R.id.textViewTime);
timeLine = (Timeline) itemView.findViewById(R.id.timeLine);
contactCard = (CardView) itemView.findViewById(R.id.contactCard);
textViewPhone = (AppCompatTextView) itemView.findViewById(R.id.textViewPhone);
// Just handle the click event in adapter
// No need to set an {@link OnRecyclerViewItemClickListener}
contactCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String uri = textViewPhone.getText().toString();
if (uri.length() > 0) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + uri));
context.startActivity(intent);
}
}
});
}
}
/**
* A header view holder of recyclerView.
*/
public class HeaderViewHolder extends RecyclerView.ViewHolder {
AppCompatTextView textViewCompany;
AppCompatTextView textViewNumber;
AppCompatTextView textViewName;
public HeaderViewHolder(View itemView) {
super(itemView);
textViewCompany = (AppCompatTextView) itemView.findViewById(R.id.textViewCompany);
textViewNumber = (AppCompatTextView) itemView.findViewById(R.id.textViewPackageNumber);
textViewName = (AppCompatTextView) itemView.findViewById(R.id.textViewName);
textViewCompany.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (aPackage.getCompany() != null) {
Intent intent = new Intent(context, CompanyDetailActivity.class);
intent.putExtra(CompanyDetailActivity.COMPANY_ID, aPackage.getCompany());
context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((PackageDetailsActivity)context).toBundle());
}
}
});
}
}
}