/*
* Copyright (C) 2014 Tubor Team
*
* 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.sgu.findyourfriend.screen;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.BitmapFactory;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Gravity;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.devsmart.android.ui.HorizontalListView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.sgu.findyourfriend.R;
import com.sgu.findyourfriend.adapter.FriendSwipeAdapter;
import com.sgu.findyourfriend.mgr.Config;
import com.sgu.findyourfriend.mgr.Config.AppState;
import com.sgu.findyourfriend.mgr.FriendManager;
import com.sgu.findyourfriend.mgr.MyLocationChangeListener;
import com.sgu.findyourfriend.mgr.MyProfileManager;
import com.sgu.findyourfriend.mgr.SettingManager;
import com.sgu.findyourfriend.model.Friend;
import com.sgu.findyourfriend.net.PostData;
import com.sgu.findyourfriend.screen.MapWrapperLayout.OnDragListener;
import com.sgu.findyourfriend.utils.GpsPosition;
import com.sgu.findyourfriend.utils.Utility;
public class MapFragment extends BaseContainerFragment implements
MyLocationChangeListener {
// contants define
private static final int CALL = 0;
private static final int MESSAGE = 1;
private static final int HISTORIES = 2;
private static final int UPDATE = 3;
private static final int ROUTE = 4;
private static final int REQUEST = 5;
private static final int ACCEPT = 6;
private static final int UNFRIEND = 7;
private static final int REMOVE_HISTORIES = 8;
private static final int STOP_SHARE = 9;
private static final int NOT_POSITION = 10;
private static final int TASK_NUM = 11;
// point to itself
private MapFragment mThis = this;
private static float startDegree = 0f;
private static float radius = 130f;
private static boolean isRegister;
private Context context;
// view replace
private static View view;
private RelativeLayout inc; // include layout for horizontal friend list
// map for app
private GoogleMap mMap;
private HashMap<Integer, Marker> markerManager;
// marker Stranger and invited
private HashMap<Integer, Marker> markerSIn;
private FragmentActivity myContext;
// view in map fragment
private HorizontalListView avatarListView;
private FriendSwipeAdapter swipeAdapter;
private ArrayList<Friend> friendList;
// friend's id current
private int fIDCurrent = -1;
// GPS Controller
private GpsPosition gpsPosition;
// // control button
private ImageButton[] imgButtons = new ImageButton[TASK_NUM];
private TextView textViewAddress;
private ImageButton imgTouchViewDetail;
private TextView textViewName;
private ImageButton btnAdd;
private ImageButton btnShow;
private ImageButton btnZoomIn;
private ImageButton btnZoomOut;
private float zoomLevel; // min 2.0 max 21.0
private boolean toggleBtnValue = true;
private ProgressBar pbOnMap;
private boolean isMapStarted = false;
// state marker hide/show
private boolean isShowMarker;
// masks check control
private int[] maskEn = new int[TASK_NUM];
private MapController mapController;
// vibrator
private Vibrator vibrator;
private AlphaAnimation alphaIn;
private AlphaAnimation alphaOut;
private boolean isControllerShowed = true;
// update time
// private long intervalUpdateFriend;
public static final String TAG = "MAP FRAGMENT";
public MapFragment() {
// init
isMapStarted = false;
isShowMarker = true;
isRegister = false;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.fragment_map, container, false);
} catch (InflateException e) {
Log.i(TAG, e.getMessage());
}
afterViewCreate(view);
// show tips
if (SettingManager.getInstance().isFristStartApp())
startActivity(new Intent(getActivity(), InstructioActivity.class));
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i(TAG, "onActivityCreated");
}
@Override
public void onResume() {
super.onResume();
// update setup map
getmMap().setMapType(SettingManager.getInstance().getMapType());
// check recording
gpsPosition.setUploadMyPosition(SettingManager.getInstance()
.isUploadMyPosition());
// set time and accuracy update
gpsPosition.setCheckInterval(SettingManager.getInstance()
.getIntervalUpdatePosition());
gpsPosition.setMinDistance(SettingManager.getInstance()
.getAccuracyUpdatePosition());
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity.getApplicationContext();
myContext = (FragmentActivity) activity;
if (!isRegister) {
activity.registerReceiver(mHandleMessageReceiver, new IntentFilter(
com.sgu.findyourfriend.mgr.Config.UPDATE_UI));
activity.registerReceiver(mHandleMessageReceiver, new IntentFilter(
com.sgu.findyourfriend.mgr.Config.MAIN_ACTION));
isRegister = true;
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (isRegister)
getActivity().unregisterReceiver(mHandleMessageReceiver);
}
// ----------------- init variable and setup methods ----------- //
@SuppressLint("UseSparseArrays")
private void afterViewCreate(View view) {
// setup alpha animation
alphaIn = new AlphaAnimation(0F, 1F);
alphaIn.setDuration(500);
alphaIn.setFillAfter(true);
alphaOut = new AlphaAnimation(1F, 0F);
alphaOut.setDuration(500);
alphaOut.setFillAfter(true);
// get button show
btnShow = (ImageButton) view.findViewById(R.id.btnShow);
btnZoomIn = (ImageButton) view.findViewById(R.id.btnZoomIn);
btnZoomOut = (ImageButton) view.findViewById(R.id.btnZoomOut);
// get progress bar
setPbOnMap((ProgressBar) view.findViewById(R.id.pbOnMap));
getPbOnMap().setVisibility(View.GONE);
// get Gps position
gpsPosition = new GpsPosition(context, this);
// initialize
markerManager = new HashMap<Integer, Marker>();
markerSIn = new HashMap<Integer, Marker>();
// setup control layout and avatar list view
setupHalfCirle();
// setup friend list
setupFriendList();
// setup map
setupMap();
// init + setup mapController
mapController = new MapController(mThis);
setupControlView();
// setup send location to server
// if (Utility.isConnectingToInternet(context))
gpsPosition.startRecording();
// load friends position after 1 mins
loadFriendsPosition();
// update friend list
updateFriendsInfo();
// load stranger and invited
loadStrangerAndInvited();
// vibrator setup
vibrator = (Vibrator) context
.getSystemService(Context.VIBRATOR_SERVICE);
// hide control console
hideControl();
}
public void tickVibrator() {
vibrator.vibrate(100);
}
// ---------------- setup map ----------------------- //
private void setupMap() {
FragmentManager myFM = myContext.getSupportFragmentManager();
CustomMapFragment mySpFrg = (CustomMapFragment) myFM
.findFragmentById(R.id.mapFragment);
setmMap(mySpFrg.getMap());
getmMap().setMyLocationEnabled(false);
// load setup map from setting activity
// mMap.setMapType(SettingManager.getInstance().getMapType());
getmMap().getUiSettings().setZoomControlsEnabled(false);
zoomLevel = 10.0f;
getmMap().animateCamera(CameraUpdateFactory.zoomTo(zoomLevel));
// hide control my center
// mMap.getUiSettings().setMyLocationButtonEnabled(false);
// setup info window event
getmMap().setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(final Marker marker) {
for (final int k : markerSIn.keySet()) {
// stranger is clicked
if (markerSIn.get(k).equals(marker)) {
if (FriendManager.getInstance().hmStrangers
.containsKey(k)) {
// make friend
final Handler mUpdateHandler = new Handler();
Runnable mUpdateRunnable = new Runnable() {
public void run() {
mapController.inviteTask(k);
// remove stranger
FriendManager.getInstance().hmStrangers
.remove(k);
// remove marker
Marker m = markerSIn.remove(k);
m.remove();
(new AsyncTask<Void, Void, Friend>() {
@Override
protected Friend doInBackground(
Void... params) {
return PostData.friendGetFriend(
getActivity(), k);
}
@Override
protected void onPostExecute(Friend fr) {
FriendManager.getInstance()
.addFriendInvited(fr);
createInvitedMakerOnMap(k, fr);
}
}).execute();
// updateFriendsInfo();
}
};
mUpdateHandler.postDelayed(mUpdateRunnable, 50);
}
break;
}
}
}
});
getmMap().setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
Log.i(TAG, "marker on click!");
// check marker manager
for (int k : markerManager.keySet()) {
if (marker.equals(markerManager.get(k))) {
if (fIDCurrent != k) {
changleSelectMarker(fIDCurrent, false);
fIDCurrent = k;
}
changleSelectMarker(fIDCurrent, true);
// setup control
swipeAdapter.hightLightItem(swipeAdapter
.getPositionByFriendID(k));
changeVisibilityView();
showControl();
return false;
}
}
Log.i("DEBUG", FriendManager.getInstance().hmInvited.size()
+ "");
// check marker sin
for (int k : markerSIn.keySet()) {
if (marker.equals(markerSIn.get(k))) {
if (FriendManager.getInstance().hmInvited
.containsKey(k)) {
marker.setTitle(Utility.getAddress(context,
FriendManager.getInstance().hmInvited
.get(k).getLastLocation()));
} else if (FriendManager.getInstance().hmStrangers
.containsKey(k)) {
marker.setTitle("Kết bạn với tôi?");
}
break;
}
}
return false;
}
});
// setup onclick on map
getmMap().setOnMapClickListener(new OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
Log.i("POS", point.latitude + " # " + point.longitude);
// swipeAdapter.unHightLightItem();
swipeAdapter.hightLightItem(-1);
hideControl();
changleSelectMarker(fIDCurrent, false);
}
});
mySpFrg.setOnDragListener(new OnDragListener() {
@Override
public void onDrag(MotionEvent motionEvent) {
// Log.d("ON_DRAG", "OK");
if (motionEvent.getAction() == MotionEvent.ACTION_MOVE)
hideControl();
}
});
}
// ---------------- setup friend list ------------------ //
private void setupFriendList() {
btnAdd = (ImageButton) view.findViewById(R.id.imgAdd);
btnAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// add friend
hideControl();
showOptionsContacts();
}
});
avatarListView = (HorizontalListView) view
.findViewById(R.id.avatarHListView);
friendList = new ArrayList<Friend>();
friendList.addAll(FriendManager.getInstance().getFriendsAndMine());
swipeAdapter = new FriendSwipeAdapter(context,
R.layout.item_friend_accepted, friendList);
avatarListView.setAdapter(swipeAdapter);
avatarListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i(TAG, "click at " + position);
// unmarke
if (fIDCurrent >= 0) {
changleSelectMarker(fIDCurrent, false);
}
// change id selected
fIDCurrent = swipeAdapter.getItem(position).getUserInfo()
.getId();
showMarker();
// mark
changleSelectMarker(fIDCurrent, true);
// dis/en visible on control view
changeVisibilityView();
swipeAdapter.hightLightItem(position);
showControl();
if (swipeAdapter.getItem(position).getAcceptState() == Friend.SHARE_RELATIONSHIP
&& null != swipeAdapter.getItem(position)
.getLastLocation())
Utility.zoomToPosition(swipeAdapter.getItem(position)
.getLastLocation(), mMap);
else {
// Utility.showMessageOnCenter(context,
// "Vị trí hiện tại không có sẵn");
}
}
});
}
// ----------------- setup control at bottom screen ----------- //
private void setupControlView() {
btnShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
toggleBtnValue = !toggleBtnValue;
if (toggleBtnValue) {
showMarker();
btnShow.setImageDrawable(getResources().getDrawable(
R.drawable.ic_hide));
} else {
hideMarker();
btnShow.setImageDrawable(getResources().getDrawable(
R.drawable.ic_show));
}
}
});
btnShow.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
mapController.clearnMarkerHistory();
return true;
}
});
btnZoomIn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
hideControl();
zoomLevel += 2.0f;
if (zoomLevel > 21.0f)
zoomLevel = 21.0f;
mMap.animateCamera(CameraUpdateFactory.zoomTo(zoomLevel));
}
});
btnZoomOut.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
hideControl();
zoomLevel -= 2.0f;
if (zoomLevel < 2.0f)
zoomLevel = 2.0f;
mMap.animateCamera(CameraUpdateFactory.zoomTo(zoomLevel));
}
});
}
private void setupHalfCirle() {
inc = (RelativeLayout) view.findViewById(R.id.task_inc);
textViewAddress = (TextView) view.findViewById(R.id.txtAddress);
textViewAddress.setVisibility(View.GONE);
textViewName = (TextView) view.findViewById(R.id.txtName);
imgTouchViewDetail = (ImageButton) view
.findViewById(R.id.touchViewDetail);
imgButtons = new ImageButton[inc.getChildCount() - 1];
for (int i = 0; i < TASK_NUM; ++i) {
imgButtons[i] = (ImageButton) inc.getChildAt(i);
imgButtons[i].setVisibility(View.GONE);
}
}
// ---------- hide/show marker on map ----------------- //
public void hideMarker() {
Log.i(TAG, "----------------------------------------hide marker");
for (int k : markerManager.keySet()) {
markerManager.get(k).setVisible(false);
}
toggleBtnValue = false;
btnShow.setImageDrawable(getResources().getDrawable(R.drawable.ic_show));
isShowMarker = false;
}
public void showMarker() {
if (isShowMarker)
return;
for (int k : markerManager.keySet()) {
markerManager.get(k).setVisible(true);
}
toggleBtnValue = true;
btnShow.setImageDrawable(getResources().getDrawable(R.drawable.ic_hide));
isShowMarker = true;
}
private void hideMarker(Friend f1, Friend f2) {
for (int k : markerManager.keySet()) {
markerManager.get(k).setVisible(false);
}
markerManager.get(f1.getUserInfo().getId()).setVisible(true);
markerManager.get(f2.getUserInfo().getId()).setVisible(true);
isShowMarker = false;
}
// ------------------ hide/show view on control console ---------- //
private void changeVisibilityView() {
Log.i(TAG, "changle visibility at " + fIDCurrent);
if (fIDCurrent <= 0)
return;
View rView = getView();
if (null == rView)
return;
boolean isToastPosition = false; // is show address
// accept = 6, unfriend = 7, remove = 8, stop share = 9, task nopos = 10
for (int i = 0; i < TASK_NUM; ++i)
maskEn[i] = 1;
if (fIDCurrent == MyProfileManager.getInstance().getMyID()) {
maskEn[CALL] = 0;
maskEn[MESSAGE] = 0;
maskEn[ROUTE] = 0;
maskEn[REQUEST] = 0;
maskEn[ACCEPT] = 0;
maskEn[UNFRIEND] = 0;
maskEn[NOT_POSITION] = 0;
if (null != MyProfileManager.getInstance().getMyPosition()) {
maskEn[NOT_POSITION] = 0;
isToastPosition = true;
}
} else {
Friend f = FriendManager.getInstance().hmMemberFriends
.get(fIDCurrent);
if (f.getAcceptState() == Friend.SHARE_RELATIONSHIP) {
maskEn[REQUEST] = 0;
maskEn[ACCEPT] = 0;
maskEn[REMOVE_HISTORIES] = 0;
if (null != f.getLastLocation()) {
maskEn[NOT_POSITION] = 0;
isToastPosition = true;
}
} else if (f.getAcceptState() == Friend.REQUEST_SHARE) {
// wait accept
maskEn[HISTORIES] = 0;
maskEn[ROUTE] = 0;
maskEn[REQUEST] = 0;
maskEn[ACCEPT] = 0;
maskEn[REMOVE_HISTORIES] = 0;
maskEn[STOP_SHARE] = 0;
} else if (f.getAcceptState() == Friend.REQUESTED_SHARE) {
// accept text
maskEn[HISTORIES] = 0;
maskEn[ROUTE] = 0;
maskEn[REQUEST] = 0;
maskEn[REMOVE_HISTORIES] = 0;
maskEn[STOP_SHARE] = 0;
} else {
// friend
maskEn[HISTORIES] = 0;
maskEn[ROUTE] = 0;
maskEn[ACCEPT] = 0;
maskEn[REMOVE_HISTORIES] = 0;
maskEn[STOP_SHARE] = 0;
}
}
int numOfButton = 0; // inc.getChildCount();
if (maskEn[CALL] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_call));
imgButtons[numOfButton].setOnClickListener(new OnCallClick());
numOfButton++;
}
if (maskEn[MESSAGE] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_message));
imgButtons[numOfButton].setOnClickListener(new OnMessageClick());
numOfButton++;
} else {
}
if (maskEn[HISTORIES] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_history));
imgButtons[numOfButton].setOnClickListener(new OnHistoryClick());
numOfButton++;
}
if (maskEn[UPDATE] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_update));
imgButtons[numOfButton].setOnClickListener(new OnUpdateClick());
numOfButton++;
}
if (maskEn[ROUTE] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_route));
imgButtons[numOfButton].setOnClickListener(new OnRouteClick());
numOfButton++;
}
if (maskEn[REQUEST] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_request));
imgButtons[numOfButton].setOnClickListener(new OnRequestClick());
numOfButton++;
}
// accept request
if (maskEn[ACCEPT] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_accept));
imgButtons[numOfButton].setOnClickListener(new OnAcceptClick());
numOfButton++;
}
// unfriend
if (maskEn[UNFRIEND] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_unfriend));
imgButtons[numOfButton].setOnClickListener(new OnUnFriendClick());
numOfButton++;
}
// remove histories
if (maskEn[REMOVE_HISTORIES] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_remove_histories));
imgButtons[numOfButton]
.setOnClickListener(new OnRemoveHistoryClick());
numOfButton++;
}
// stop share
if (maskEn[STOP_SHARE] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_stop_share));
imgButtons[numOfButton].setOnClickListener(new OnStopShareClick());
numOfButton++;
}
// not position
if (maskEn[NOT_POSITION] == 1) {
imgButtons[numOfButton].setImageDrawable(getResources()
.getDrawable(R.drawable.ic_notposition));
imgButtons[numOfButton].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Utility.showMessage(context, "vị trí không có sẵn");
}
});
// not add
}
for (int i = 0; i < inc.getChildCount() - 1; ++i) {
if (i < numOfButton)
imgButtons[i].setVisibility(View.VISIBLE);
else
imgButtons[i].setVisibility(View.GONE);
}
float dimenTaksButton = getActivity().getResources().getDimension(
R.dimen.size_task_button);
int cor1[] = new int[2];
inc.getLocationOnScreen(cor1);
Log.i(TAG, "top" + cor1[0] + " # " + cor1[1]);
float xCenter = (inc.getWidth() - dimenTaksButton) / 2f + cor1[0];
float yCenter = (inc.getHeight() - dimenTaksButton) / 2f - 50f;
Log.i(TAG, xCenter + " # " + yCenter);
float alpha = 360f / (numOfButton);
for (int i = 0; i < numOfButton; ++i) {
imgButtons[i] = (ImageButton) inc.getChildAt(i);
imgButtons[i].setX((int) (xCenter + (radius * Math.cos(Math
.toRadians(alpha * i + startDegree)))));
imgButtons[i].setY((int) (yCenter - (radius * Math.sin(Math
.toRadians(alpha * i + startDegree)))));
// Log.i(TAG, imgButtons[i].toString() + " # " +
// imgButtons[i].getX()
// + " @ " + imgButtons[i].getY());
}
// set position for button not position
if (maskEn[NOT_POSITION] == 1) {
imgButtons[numOfButton] = (ImageButton) inc.getChildAt(numOfButton);
imgButtons[numOfButton].setX(xCenter);
imgButtons[numOfButton].setY(yCenter);
imgButtons[numOfButton].setVisibility(View.VISIBLE);
}
textViewAddress.setVisibility(View.VISIBLE);
// show Toast
if (isToastPosition) {
textViewAddress.setText("đang tính...");
(new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... arg0) {
return Utility.getAddress(
context,
FriendManager.getInstance().hmMemberFriends.get(
fIDCurrent).getLastLocation());
}
@Override
protected void onPostExecute(String address) {
if (null == address)
textViewAddress.setText("Vị trí không có sẵn");
else
textViewAddress.setText(address);
}
}).execute();
imgTouchViewDetail.setVisibility(View.VISIBLE);
imgTouchViewDetail.setOnClickListener(new OnToastClick());
} else {
imgTouchViewDetail.setVisibility(View.GONE);
textViewAddress.setText("Vị trí không có sẵn");
}
textViewName.setText(FriendManager.getInstance().hmMemberFriends
.get(fIDCurrent).getUserInfo().getName());
}
// --------------------- changle color marker --------------------- //
private void changleSelectMarker(int idFriendCur, boolean isSelected) {
Marker m = markerManager.get(idFriendCur);
Friend f = FriendManager.getInstance().hmMemberFriends.get(idFriendCur);
if (m != null) {
if (isSelected)
m.setIcon(Utility.combileLocationIcon(getActivity(), f, true));
else
m.setIcon(Utility.combileLocationIcon(getActivity(), f, false));
}
}
// -------------- show/hide control console ---------------- //
private void showControl() {
inc.setVisibility(View.VISIBLE);
inc.startAnimation(alphaIn);
isControllerShowed = true;
}
private void hideControl() {
if (isControllerShowed) {
inc.startAnimation(alphaOut);
isControllerShowed = false;
inc.postDelayed(new Runnable() {
@Override
public void run() {
inc.setVisibility(View.GONE);
for (int i = 0; i < TASK_NUM; ++i) {
imgButtons[i].setX(-100);
imgButtons[i].setY(-100);
}
}
}, 500);
}
}
private void loadStrangerAndInvited() {
// refresh on map
for (int fid : markerSIn.keySet()) {
markerSIn.get(fid).remove();
}
markerSIn.clear();
HashMap<Integer, Marker> tmpSIN = new HashMap<Integer, Marker>();
// load on map
for (int id : FriendManager.getInstance().hmStrangers.keySet()) {
if (tmpSIN.keySet().contains(id)) {
tmpSIN.get(id)
.setPosition(
new LatLng(
FriendManager.getInstance().hmStrangers
.get(id).latitude,
FriendManager.getInstance().hmStrangers
.get(id).longitude));
} else {
createStrangerMakerOnMap(id,
FriendManager.getInstance().hmStrangers.get(id));
}
}
// load on map
for (int id : FriendManager.getInstance().hmInvited.keySet()) {
if (tmpSIN.keySet().contains(id)) {
tmpSIN.get(id).setPosition(
FriendManager.getInstance().hmInvited.get(id)
.getLastLocation());
} else {
createInvitedMakerOnMap(id,
FriendManager.getInstance().hmInvited.get(id));
}
}
markerSIn.putAll(tmpSIN);
}
// -------------------- should load with timer --------------- //
private void loadFriendsPosition() {
getmMap().clear();
for (Friend f : friendList) {
if (null != f.getUserInfo())
if (f.getAcceptState() == Friend.SHARE_RELATIONSHIP
&& null != f.getLastLocation())
createMakerOnMap(f);
}
}
private void updateFriendPosition(int friendId) {
if (markerManager.containsKey(friendId)) {
LatLng latlng = FriendManager.getInstance().hmMemberFriends.get(
friendId).getLastLocation();
markerManager.get(friendId).setPosition(latlng);
}
}
private void updateAllPosition() {
for (int k : FriendManager.getInstance().hmMemberFriends.keySet()) {
updateFriendPosition(k);
}
}
// -------------------------- update position ------------------------ //
private void updateFriendsSimple() {
(new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
FriendManager.getInstance().preLoadUpdate();
return null;
}
@Override
protected void onPostExecute(Void result) {
// FriendManager.getInstance().setupAfterLoading();
FriendManager.getInstance().endLoadUpdate();
Log.i(TAG, "end update friend");
// update position
updateAllPosition();
// update UI
Intent intentUpdate = new Intent(
com.sgu.findyourfriend.mgr.Config.UPDATE_UI);
intentUpdate.putExtra(
com.sgu.findyourfriend.mgr.Config.UPDATE_TYPE,
Utility.FRIEND);
intentUpdate.putExtra(
com.sgu.findyourfriend.mgr.Config.UPDATE_ACTION,
Utility.RESPONSE_NO);
context.sendBroadcast(intentUpdate);
}
}).execute();
}
private void updateFriendsInfo() {
final Handler mUpdateHandler = new Handler();
Runnable mUpdateRunnable = new Runnable() {
public void run() {
updateFriendsSimple();
mUpdateHandler.postDelayed(this,
SettingManager.INERVAL_UPDATE_FRIEND);
}
};
mUpdateHandler.postDelayed(mUpdateRunnable, 3000);
}
private void updatePositionOf(Friend f) {
Marker m = markerManager.get(f.getUserInfo().getId());
if (m != null) {
m.setPosition(f.getLastLocation());
m.setTitle(Utility.getAddress(context, f.getLastLocation()));
}
}
// ----------------------- create map's marker ----------------- //
private void createInvitedMakerOnMap(int id, Friend f) {
Log.i(TAG, "create on map");
if (null == f.getLastLocation())
return;
MarkerOptions options = new MarkerOptions();
options.position(f.getLastLocation());
options.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(), R.drawable.ic_invited_50)));
Marker m = getmMap().addMarker(options);
markerSIn.put(f.getUserInfo().getId(), m);
}
private void createStrangerMakerOnMap(int id, LatLng latlng) {
Log.i(TAG, "create stranger on map");
try {
if (markerSIn.containsKey(id))
return;
MarkerOptions options = new MarkerOptions();
options.position(latlng);
options.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(), R.drawable.ic_stranger_50)));
Marker m = getmMap().addMarker(options);
markerSIn.put(id, m);
} catch (Exception e) {
e.printStackTrace();
}
}
private void createMakerOnMap(Friend f) {
Log.i(TAG, "create on map");
MarkerOptions options = new MarkerOptions();
options.position(f.getLastLocation());
options.snippet(Utility.convertMicTimeToString(System
.currentTimeMillis() - f.getUserInfo().getLastLogin().getTime())
+ " trước - sai lệch " + f.getAccurency() + "m.");
options.icon(Utility.combileLocationIcon(getActivity(), f, false));
Marker m = getmMap().addMarker(options);
markerManager.put(f.getUserInfo().getId(), m);
}
@Override
public void onMyLocationChanged(Location location) {
if (null == location)
return;
Log.i(TAG,
"update! " + location.getLatitude() + " # "
+ location.getLongitude());
LatLng latlng = new LatLng(location.getLatitude(),
location.getLongitude());
MyProfileManager.getInstance().setMyPosition(latlng);
Friend f = MyProfileManager.getInstance().getMineInstance();
updatePositionOf(f);
if (!isMapStarted) {
Utility.zoomToPosition(location, mMap);
isMapStarted = true;
}
}
public void updatePositionTask(int fID) {
mapController.updatePositionTask(fID);
}
public GoogleMap getmMap() {
return mMap;
}
public void setmMap(GoogleMap mMap) {
this.mMap = mMap;
}
public ProgressBar getPbOnMap() {
return pbOnMap;
}
public void setPbOnMap(ProgressBar pbOnMap) {
this.pbOnMap = pbOnMap;
}
public void showOptionsContacts() {
final Dialog dialog = new Dialog(myContext);
Window W = dialog.getWindow();
W.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
W.setLayout(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
W.requestFeature(Window.FEATURE_NO_TITLE);
W.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
dialog.setContentView(R.layout.options_invite_layout);
((Button) dialog.findViewById(R.id.btnInvite))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
InviteFromContactsDialog contactsdialog = new InviteFromContactsDialog(
myContext);
contactsdialog.show();
dialog.dismiss();
}
});
((Button) dialog.findViewById(R.id.btnSearch))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (Config.currentState == AppState.OFFLINE) {
dialog.dismiss();
Utility.showDialog(Utility.WARNING, new Dialog(
getActivity()), "Chế độ offline",
"Chức năng không có sẵn trong chế độ offline.");
return;
}
SearchFromServerDialog searchdialog = new SearchFromServerDialog(
myContext);
searchdialog.show();
dialog.dismiss();
}
});
dialog.show();
}
// handle message
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent intent) {
String action = intent.getAction();
if (action.equals(com.sgu.findyourfriend.mgr.Config.MAIN_ACTION)) {
if (intent
.hasExtra(com.sgu.findyourfriend.mgr.Config.ZOOM_POSITION_ACTION)) {
// unmarke
if (fIDCurrent >= 0)
changleSelectMarker(fIDCurrent, false);
// hideControl();
// swipeAdapter.unHightLightItem();
fIDCurrent = intent
.getIntExtra(
com.sgu.findyourfriend.mgr.Config.ZOOM_POSITION_ACTION,
-1);
if (fIDCurrent >= 0) {
Friend f = FriendManager.getInstance().hmMemberFriends
.get(fIDCurrent);
if (f.getAcceptState() == Friend.SHARE_RELATIONSHIP) {
showMarker();
// mark
changleSelectMarker(fIDCurrent, true);
// dis/en visible on control view
changeVisibilityView();
swipeAdapter.highLightItemWithId(fIDCurrent);
showControl();
Utility.zoomToPosition(f.getLastLocation(), mMap);
} else {
Utility.showMessageOnCenter(context,
"Vị trí không có sẵn");
}
}
} else if (intent
.hasExtra(com.sgu.findyourfriend.mgr.Config.ROUTE_ACTION)) {
hideControl();
fIDCurrent = intent.getIntExtra(
com.sgu.findyourfriend.mgr.Config.ROUTE_ACTION, -1);
mapController.routeTask(fIDCurrent);
} else if (intent
.hasExtra(com.sgu.findyourfriend.mgr.Config.HISTORY_ACTION)) {
hideControl();
fIDCurrent = intent.getIntExtra(
com.sgu.findyourfriend.mgr.Config.HISTORY_ACTION,
-1);
mapController.drawHistoryTask(fIDCurrent);
}
} else if (action
.equals(com.sgu.findyourfriend.mgr.Config.UPDATE_UI)) {
if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_TYPE))
.equals(Utility.SHARE)) {
if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_ACTION))
.equals(Utility.RESPONSE_YES)) {
Log.i(TAG, "friend response yes");
// add new friend to map
for (int id : FriendManager.getInstance().hmMemberFriends
.keySet()) {
Friend fr = FriendManager.getInstance().hmMemberFriends
.get(id);
if (null != fr.getLastLocation()
&& fr.getAcceptState() == Friend.SHARE_RELATIONSHIP
&& !markerManager.containsKey(id)) {
Log.i(TAG, "ok vvvvvvvvvvvvvvvvvvv");
createMakerOnMap(fr);
}
}
}
friendList.clear();
friendList.addAll(FriendManager.getInstance()
.getFriendsAndMine());
swipeAdapter.notifyDataSetChanged();
((MainActivity) myContext).notifyDataChange();
changeVisibilityView();
} else if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_TYPE))
.equals(Utility.FRIEND)) {
if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_ACTION))
.equals(Utility.REQUEST)) {
// update friend
} else if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_ACTION))
.equals(Utility.RESPONSE_YES)) {
loadStrangerAndInvited();
int fid = intent.getIntExtra(Config.FRIEND_ID, 0);
if (fid > 0) {
showDialogAddSuppoter(fid);
} else {
Log.i(TAG, "friend not found");
}
Log.i(TAG, "friend response yes");
} else if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_ACTION))
.equals(Utility.RESPONSE_NO)) {
// response no
} else if (intent.getStringExtra(
(com.sgu.findyourfriend.mgr.Config.UPDATE_ACTION))
.equals(Utility.REMOVE)) {
int id = intent.getIntExtra(Utility.FRIEND_ID, -1);
if (id > 0 && markerManager.containsKey(id)) {
(markerManager.remove(id)).remove();
}
// add strangers
loadStrangerAndInvited();
fIDCurrent = -1;
Log.i("UPDATE AFTER", "REMOVE");
}
Log.i("friend------UPDATE AFTER", "OK");
friendList.clear();
friendList.addAll(FriendManager.getInstance()
.getFriendsAndMine());
Log.i("fri", friendList.size() + "");
swipeAdapter.notifyDataSetChanged();
swipeAdapter.notifyDataSetChanged();
((MainActivity) myContext).notifyDataChange();
if (isControllerShowed && fIDCurrent >= 0)
changeVisibilityView();
}
}
}
};
private void showDialogAddSuppoter(final int fid) {
final Dialog dialog = new Dialog(getActivity());
String name = FriendManager.getInstance().getNameFriend(fid);
Utility.showDialog(
Utility.CONFIRM,
dialog,
"Thêm bạn", name + " đã chấp nhận yêu cầu kết bạn." +
" Bạn có muốn thêm " + name + " vào danh sách trợ giúp khi cần thiết?",
"Có", new OnClickListener() {
@Override
public void onClick(View v) {
// add supporter
Set<String> emerIDs = SettingManager.getInstance()
.getDefaultWarning();
emerIDs.add(fid + "");
SettingManager.getInstance().setDefaultWarning(
new HashSet<String>(emerIDs));
Utility.showMessage(context,
"Đã thêm vào danh sách hỗ trợ");
dialog.dismiss();
}
}, "Không", new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
// ---------- private class
class OnCallClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[CALL] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
mapController.callTask(fIDCurrent);
}
}
}
class OnMessageClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[MESSAGE] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
mapController.sendMessageTask(fIDCurrent);
}
}
}
class OnHistoryClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[HISTORIES] == 1
&& null != FriendManager.getInstance().hmMemberFriends.get(
fIDCurrent).getLastLocation() && isControllerShowed) {
tickVibrator();
hideControl();
hideMarker();
mapController.drawHistoryTask(fIDCurrent);
} else {
Utility.showMessageOnCenter(context,
"Vị trí hiện tại không có sẵn");
}
}
}
class OnUpdateClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[UPDATE] == 1 && isControllerShowed) {
if (FriendManager.getInstance().hmMemberFriends.get(fIDCurrent)
.getAcceptState() == Friend.SHARE_RELATIONSHIP) {
tickVibrator();
hideControl();
showMarker();
mapController.updatePositionTask(fIDCurrent);
} else
Utility.showMessage(context, "Vị trí chưa được chia sẻ.");
}
}
}
class OnRouteClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[ROUTE] == 1
&& null != FriendManager.getInstance().hmMemberFriends.get(
fIDCurrent).getLastLocation() && isControllerShowed) {
tickVibrator();
hideControl();
hideMarker(MyProfileManager.getInstance().getMineInstance(),
FriendManager.getInstance().hmMemberFriends
.get(fIDCurrent));
mapController.routeTask(fIDCurrent);
} else {
// Utility.showMessageOnCenter(context,
// "Vị trí hiện tại không có sẵn");
}
}
}
class OnRequestClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[REQUEST] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
showMarker();
Friend f = FriendManager.getInstance().hmMemberFriends
.get(fIDCurrent);
mapController.requestTask(fIDCurrent);
}
}
}
class OnAcceptClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[ACCEPT] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
showMarker();
mapController.acceptTask(fIDCurrent);
}
}
}
class OnUnFriendClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[UNFRIEND] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
showMarker();
showAlertUnFriend();
}
}
}
class OnRemoveHistoryClick implements OnClickListener {
@Override
public void onClick(View arg0) {
if (maskEn[REMOVE_HISTORIES] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
showMarker();
showAlertRemoveHistory();
}
}
}
class OnStopShareClick implements OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (maskEn[STOP_SHARE] == 1 && isControllerShowed) {
tickVibrator();
hideControl();
showMarker();
if (fIDCurrent == MyProfileManager.getInstance().getMyID())
showAlertAllStopShare();
else
mapController.stopShareTask(fIDCurrent);
}
}
}
class OnToastClick implements OnClickListener {
@Override
public void onClick(View v) {
// hideMarker();
PositionDetailFragment fragment = new PositionDetailFragment(mThis);
Bundle bundle = new Bundle();
bundle.putInt("friendId", fIDCurrent);
bundle.putString("address", textViewAddress.getText().toString());
bundle.putDouble("myLat", MyProfileManager.getInstance()
.getMyPosition().latitude);
bundle.putDouble("myLng", MyProfileManager.getInstance()
.getMyPosition().longitude);
fragment.setArguments(bundle);
hideControl();
((BaseContainerFragment) getParentFragment()).replaceFragment(
fragment, true);
}
}
public void showAlertUnFriend() {
final Dialog dialog = new Dialog(getActivity());
Utility.showDialog(Utility.WARNING, dialog, "Xóa bạn",
"Bạn có chắc muốn xóa?", "Đồng ý", new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
// unfriend on server
mapController.unFriendTask(fIDCurrent);
}
}, "Thôi", new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
private void showAlertRemoveHistory() {
final Dialog dialog = new Dialog(getActivity());
Utility.showDialog(Utility.WARNING, dialog, "Xóa lịch sử",
"Bạn có chắc muốn xóa tất cả lịch sử di chuyển?", "Có",
new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
// unfriend on server
mapController.removeHistoriesTask(fIDCurrent);
}
}, "Thôi", new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
public void showAlertAllStopShare() {
final Dialog dialog = new Dialog(getActivity());
Utility.showDialog(Utility.WARNING, dialog, "Xóa bạn",
"Bạn có chắc muốn dừng chia sẻ với tất cả bạn bè ?", "Có",
new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
// unfriend on server
mapController.stopShareAllTask(fIDCurrent);
}
}, "Thôi", new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
}