package com.sousoum.jcvdexample; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.google.android.gms.awareness.fence.DetectedActivityFence; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.CircleOptions; import com.google.android.gms.maps.model.LatLng; import com.sousoum.jcvd.StorableActivityFence; import com.sousoum.jcvd.StorableFence; import com.sousoum.jcvd.StorableFenceManager; import com.sousoum.jcvd.StorableLocationFence; import java.util.ArrayList; /** * Created by d.bertrand on 13/07/2016. */ public class FenceRecyclerAdapter extends RecyclerView.Adapter<FenceRecyclerAdapter.ViewHolder> { private static final String TAG = "MGRecyclerAdapter"; private final ArrayList<StorableFence> mFences; private final StorableFenceManager mFenceManager; private Context mContext; public FenceRecyclerAdapter(Context context, StorableFenceManager fenceManager) { mContext = context; mFences = new ArrayList<>(); mFenceManager = fenceManager; updateMetroGeofenceList(); } public StorableFence getItem(int position) { StorableFence item = null; if (position >= 0 && position < mFences.size()) { item = mFences.get(position); } return item; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(mContext).inflate(R.layout.fence_card, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ViewHolder holder, int position) { StorableFence metroGeofence = getItem(position); holder.setFence(metroGeofence); } @Override public long getItemId(int position) { return position; } @Override public int getItemCount() { return mFences.size(); } public void updateMetroGeofenceList() { mFences.clear(); ArrayList<StorableFence> storableGeofences = mFenceManager.getAllFences(); mFences.addAll(storableGeofences); notifyDataSetChanged(); } public class ViewHolder extends RecyclerView.ViewHolder { private StorableFence mFence; private final TextView mTextView; private final MapView mMapView; public ViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.text); mMapView = (MapView)itemView.findViewById(R.id.map); itemView.setOnClickListener(mClickListener); } public void setFence(StorableFence fence) { mFence = fence; boolean hasLocationFence = false; String text = fence.getId() + "\n"; if (!fence.getAndFences().isEmpty()) { for (StorableFence andFence : fence.getAndFences()) { if (!text.isEmpty()) { text += " && "; } text += getFenceStr(andFence); if (andFence.getType().equals(StorableFence.Type.LOCATION)) { hasLocationFence = true; } } } else { text += getFenceStr(fence); if (fence.getType().equals(StorableFence.Type.LOCATION)) { hasLocationFence = true; } } mTextView.setText(text); if (hasLocationFence) { mMapView.setVisibility(View.VISIBLE); mMapView.onCreate(null); mMapView.onResume(); mMapView.getMapAsync(mMapReadyCallback); mMapView.setClickable(false); } else { mMapView.setVisibility(View.GONE); } } public String getFenceStr(StorableFence fence) { String str = ""; switch (fence.getType()) { case ACTIVITY: for (@StorableActivityFence.ActivityType int act : ((StorableActivityFence) fence).getActivityTypes()) { if (!str.isEmpty()) { str += ", "; } switch (act) { case DetectedActivityFence.IN_VEHICLE: str += "IN_VEHICLE"; break; case DetectedActivityFence.ON_BICYCLE: str += "ON_BICYCLE"; break; case DetectedActivityFence.ON_FOOT: str += "ON_FOOT"; break; case DetectedActivityFence.RUNNING: str += "RUNNING"; break; case DetectedActivityFence.STILL: str += "STILL"; break; case DetectedActivityFence.WALKING: str += "WALKING"; break; case DetectedActivityFence.UNKNOWN: default: str += "UNKNOWN"; break; } } break; case LOCATION: StorableLocationFence locFence = (StorableLocationFence) fence; str += "(" + locFence.getLatitude() + ", " + locFence.getLongitude() + ") "; break; default: break; } return str; } private final OnMapReadyCallback mMapReadyCallback = new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { googleMap.setMyLocationEnabled(true); googleMap.getUiSettings().setMyLocationButtonEnabled(false); StorableLocationFence locFence = null; if (!mFence.getAndFences().isEmpty()) { for (StorableFence andFence : mFence.getAndFences()) { if (andFence.getType().equals(StorableFence.Type.LOCATION)) { locFence = (StorableLocationFence) andFence; } } } else { if (mFence.getType().equals(StorableFence.Type.LOCATION)) { locFence = (StorableLocationFence) mFence; } } if (locFence != null) { LatLng latLng = new LatLng(locFence.getLatitude(), locFence.getLongitude()); CircleOptions circleOptions = new CircleOptions() .center(latLng) .radius(locFence.getRadius()); // In meters googleMap.addCircle(circleOptions); CameraPosition cameraPosition = new CameraPosition.Builder() .target(latLng) .zoom(14) .build(); googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); } } }; /*private final View.OnClickListener mClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "Item has been clicked : " + mMetroGeofence.getStorableGeofence().getId()); if (mExpandableView.getVisibility() == View.GONE) { mExpandableView.setVisibility(View.VISIBLE); mExpandableView.onCreate(null); mExpandableView.onResume(); mExpandableView.getMapAsync(mMapReadyCallback); } else { mExpandableView.setVisibility(View.GONE); mExpandableView.onPause(); } }*/ private final View.OnClickListener mClickListener = new View.OnClickListener() { @Override public void onClick(View v) { //TODO; get the state of the fence //mFenceManager.getFenceState(mFence); } }; } }