package cn.darkal.networkdiagnosis.Fragment; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Filter; import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.core.har.HarLog; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import cn.darkal.networkdiagnosis.Activity.HarDetailActivity; import cn.darkal.networkdiagnosis.Activity.MainActivity; import cn.darkal.networkdiagnosis.R; import cn.darkal.networkdiagnosis.SysApplication; import cn.darkal.networkdiagnosis.View.RecycleViewDivider; public class PreviewFragment extends BaseFragment { @BindView(R.id.rv_preview) RecyclerView recyclerView; HarLog harLog; List<HarEntry> harEntryList = new ArrayList<>(); PreviewAdapter previewAdapter; Boolean isHiddenHID = false; static PreviewFragment previewFragment; public static PreviewFragment getInstance() { if (previewFragment == null) { previewFragment = new PreviewFragment(); } return previewFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_preview, container, false); ButterKnife.bind(this, view); if(SysApplication.isInitProxy) { harLog = ((SysApplication) getActivity().getApplication()).proxy.getHar().getLog(); harEntryList.addAll(harLog.getEntries()); } recyclerView.addItemDecoration(new RecycleViewDivider(getActivity(), RecycleViewDivider.VERTICAL_LIST)); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(previewAdapter = new PreviewAdapter()); if(((MainActivity) getActivity()).searchView!=null){ ((MainActivity) getActivity()).searchView.setVisibility(View.VISIBLE); } return view; } private class PreviewAdapter extends RecyclerView.Adapter<PreviewAdapter.MyViewHolder> implements Filterable { @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new MyViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.item_preview, parent, false)); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { HarEntry harEntry = harEntryList.get(position); holder.rootView.setOnClickListener(new ClickListner(harEntry)); holder.tv.setText(harEntry.getRequest().getUrl()); if(harEntry.getResponse().getStatus()>400){ holder.iconView.setImageDrawable(getResources().getDrawable(R.drawable.ic_error_black_24dp)); }else if(harEntry.getResponse().getStatus()>300){ holder.iconView.setImageDrawable(getResources().getDrawable(R.drawable.ic_directions_black_24dp)); }else if(harEntry.getResponse().getContent().getMimeType().contains("image")) { holder.iconView.setImageDrawable(getResources().getDrawable(R.drawable.ic_photo_black_24dp)); }else{ holder.iconView.setImageDrawable(getResources().getDrawable(R.drawable.ic_description_black_24dp)); } holder.detailTextView.setText("Status:" + harEntry.getResponse().getStatus() + " Size:" + harEntry.getResponse().getBodySize() + "Bytes Time:" + harEntry.getTime() + "ms"); } @Override public int getItemCount() { return harEntryList.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; TextView detailTextView; View rootView; ImageView iconView; public MyViewHolder(View view) { super(view); tv = (TextView) view.findViewById(R.id.tv_url); detailTextView = (TextView) view.findViewById(R.id.tv_detail); rootView = view; iconView = (ImageView) view.findViewById(R.id.iv_icon); } } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { harLog = ((MainActivity) getActivity()).getFiltedHar().getLog(); //初始化过滤结果对象 FilterResults results = new FilterResults(); //假如搜索为空的时候,将复制的数据添加到原始数据,用于继续过滤操作 if (results.values == null) { harEntryList.clear(); harEntryList.addAll(harLog.getEntries()); } //关键字为空的时候,搜索结果为复制的结果 if (constraint == null || constraint.length() == 0) { results.values = harLog.getEntries(); results.count = harLog.getEntries().size(); } else { String prefixString = constraint.toString(); final int count = harEntryList.size(); //用于存放暂时的过滤结果 final ArrayList<HarEntry> newValues = new ArrayList<>(); for (int i = 0; i < count; i++) { final HarEntry value = harEntryList.get(i); String url = value.getRequest().getUrl(); // 假如含有关键字的时候,添加 if (url.contains(prefixString)) { newValues.add(value); } else { //过来空字符开头 String[] words = prefixString.split(" "); for (String word : words) { if (url.contains(word)) { newValues.add(value); break; } } } } results.values = newValues; results.count = newValues.size(); } return results;//过滤结果 } @Override protected void publishResults(CharSequence constraint, FilterResults results) { harEntryList.clear();//清除原始数据 if(results.values instanceof List){ harEntryList.addAll((List<HarEntry>) results.values);//将过滤结果添加到这个对象 } if (results.count > 0) { previewAdapter.notifyDataSetChanged();//有关键字的时候刷新数据 } else { //关键字不为零但是过滤结果为空刷新数据 if (constraint.length() != 0) { previewAdapter.notifyDataSetChanged(); return; } //加载复制的数据,即为最初的数据 harEntryList.addAll(harLog.getEntries()); previewAdapter.notifyDataSetChanged(); } } }; } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // ((MainActivity) getActivity()).navigationView.setCheckedItem(R.id.nav_preview); notifyHarChange(); } } public void notifyHarChange(){ if (previewAdapter != null) { harLog = ((MainActivity) getActivity()).getFiltedHar().getLog(); harEntryList.clear(); harEntryList.addAll(harLog.getEntries()); previewAdapter.notifyDataSetChanged(); } } public class ClickListner implements View.OnClickListener { HarEntry harEntry; public ClickListner(HarEntry harEntry){ this.harEntry = harEntry; } @Override public void onClick(View view) { if(harLog.getEntries().indexOf(harEntry)>=0) { isHiddenHID = true; Intent intent = new Intent(getContext(), HarDetailActivity.class); intent.putExtra("pos", ((SysApplication) getActivity().getApplication()).proxy. getHar().getLog().getEntries().indexOf(harEntry)); getActivity().startActivity(intent); } } } @Override public boolean onBackPressed() { return false; } public void filterItem(CharSequence s){ if(previewAdapter!=null) { previewAdapter.getFilter().filter(s); } } @Override public void onResume() { super.onResume(); // 这里为了解决返回后焦点在搜索栏的bug if(recyclerView!=null) { recyclerView.requestFocus(); if(((MainActivity)getActivity()).searchView!=null) { filterItem(((MainActivity) getActivity()).searchView.getQuery()); } } } }