package com.diycircuits.gpsfake; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.app.FragmentManager; import android.app.Fragment; import android.util.Log; import android.content.Context; import android.widget.Button; import android.widget.Toast; import android.view.View; import android.view.View.OnClickListener; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.Projection; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.VisibleRegion; import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener; public class MainActivity extends Activity implements OnCameraChangeListener, OnClickListener { public static final String TAG = "GPSFake"; private MarkerOptions mMarker = null; private GoogleMap mMap = null; private LatLng mInit = null; private Settings settings = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); settings = new Settings(getApplicationContext()); FragmentManager fm = getFragmentManager(); Fragment frag = fm.findFragmentById(R.id.map); if (frag instanceof MapFragment) { MapFragment mapf = (MapFragment) frag; mMap = (GoogleMap) mapf.getMap(); mMap.setOnCameraChangeListener(this); mMarker = new MarkerOptions(); mInit = new LatLng(settings.getLat(), settings.getLng()); mMarker.position(mInit); mMarker.draggable(true); CameraUpdate cam = CameraUpdateFactory.newLatLng(mInit); mMap.moveCamera(cam); mMap.addMarker(mMarker); } Button set = (Button) findViewById(R.id.set_location); set.setOnClickListener(this); Button start = (Button) findViewById(R.id.start); start.setOnClickListener(this); Button sel = (Button) findViewById(R.id.select_apps); sel.setOnClickListener(this); start.setText(settings.isStarted() ? getString(R.string.stop) : getString(R.string.start)); } @Override protected void onResume() { super.onResume(); } public void onClick(View v) { boolean started = settings.isStarted(); if (v.getId() == R.id.set_location) { settings.update(mInit.latitude, mInit.longitude, started); } else if (v.getId() == R.id.start) { Button start = (Button) findViewById(R.id.start); started = !started; start.setText(started ? getString(R.string.stop) : getString(R.string.start)); settings.update(mInit.latitude, mInit.longitude, started); } else if (v.getId() == R.id.select_apps) { } if (started) { Context context = getApplicationContext(); CharSequence text = getString(R.string.location_msg) + " " + mInit.latitude + " " + mInit.longitude; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); } else { Context context = getApplicationContext(); CharSequence text = getString(R.string.location_msg_stopped); int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public void onCameraChange(CameraPosition position) { LatLng pos = mMarker.getPosition(); final Projection proj = mMap.getProjection(); final VisibleRegion vr = proj.getVisibleRegion(); final LatLng farLeft = vr.farLeft; final LatLng farRight = vr.farRight; final LatLng nearLeft = vr.nearLeft; final LatLng nearRight = vr.nearRight; double screenLat = Math.abs(farLeft.latitude - nearRight.latitude) / 2.0; double screenLng = Math.abs(farLeft.longitude - nearRight.longitude) / 2.0; double latDiff = Math.abs(mInit.latitude - position.target.latitude); double lngDiff = Math.abs(mInit.longitude - position.target.longitude); if (latDiff > screenLat || lngDiff > screenLng) { double cLat = mMap.getCameraPosition().target.latitude; double cLng = mMap.getCameraPosition().target.longitude; mInit = new LatLng(cLat, cLng); mMarker.position(mInit); mMap.clear(); mMap.addMarker(mMarker); } } }