diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 46c0a8b..d443007 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -17,26 +17,8 @@ @@ -251,7 +246,7 @@ @@ -1889,7 +1884,7 @@ @@ -2160,11 +2155,6 @@ @@ -2245,12 +2240,8 @@ - - - - @@ -2294,6 +2285,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2428,9 +2477,17 @@ + + + + + + @@ -2438,7 +2495,7 @@ - + @@ -3080,7 +3137,28 @@ @@ -3126,30 +3204,30 @@ - + - + - + - + - - + + + - + - @@ -3161,8 +3239,8 @@ - + @@ -3192,11 +3270,14 @@ - - @@ -3208,446 +3289,477 @@ - + - - + + - + - + - + - - + + + - - - - + - - - + + - + - - + + - - - - + - - + + + + + - + - - + + + - + - - + + - - - - + - - + + + + + + + + + - + - - + + + + + + + - - + - - + + - - - - + + - - - - - - + + - + - - + + + - - + + - - + + + - - + + - - + + - - - - - + + + - - + + - - - + + + + + + + + - - + + - - - + + - - - - + - - - + + - - - - + - - - + + - - - + + + + + + + - - - + + - + - - + + - - - + + + + + + + - - + + + + + - - + - - + + + + + - + - - + + + + + + - + - + + + + + - + - - + + - + + + + + - + - - + + + + + - + - - - + + - + - - + + - + - - - + + - + - - + + - + - - + + - + - - + + - + - - - + + - + - - - - - + + - + - - - + + - + - - + + + + + + + + + - - + + + + - + - - - + + + + + + - + - - + + - + + + + - + - - + + + + + - + + + + - - + + - + - - + + - + - - - - - + + + - + - - + + - - - - - + + + + + + + + + + + - + - - - - - + + - + - - - - - - - - - + + + + + + - + - - - - - - - + + + diff --git a/app/src/main/java/ovh/exception/watchdogzz/activities/AddPoiFragment.java b/app/src/main/java/ovh/exception/watchdogzz/activities/AddPoiFragment.java new file mode 100644 index 0000000..8c259fe --- /dev/null +++ b/app/src/main/java/ovh/exception/watchdogzz/activities/AddPoiFragment.java @@ -0,0 +1,78 @@ +package ovh.exception.watchdogzz.activities; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; + +import ovh.exception.watchdogzz.R; + +public class AddPoiFragment extends DialogFragment { + + public interface PoiDialogListener { + void onDialogPositiveClick(DialogFragment dialog); + void onDialogNegativeClick(DialogFragment dialog); + } + + // Use this instance of the interface to deliver action events + PoiDialogListener mListener; + + private EditText mName = null; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + Activity activity; + + if (context instanceof Activity){ + activity = (Activity) context; + // Verify that the host activity implements the callback interface + try { + // Instantiate the NoticeDialogListener so we can send events to the host + mListener = (PoiDialogListener) activity; + } catch (ClassCastException e) { + // The activity doesn't implement the interface, throw exception + throw new ClassCastException(activity.toString() + + " must implement PoiDialogListener"); + } + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + // Get the layout inflater + LayoutInflater inflater = getActivity().getLayoutInflater(); + + // Inflate and set the layout for the dialog + // Pass null as the parent view because its going in the dialog layout + View rootView = inflater.inflate(R.layout.poi_dialog, null); + mName = (EditText) rootView.findViewById(R.id.username); + + builder.setView(rootView) + // Add action buttons + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + mListener.onDialogPositiveClick(AddPoiFragment.this); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + mListener.onDialogNegativeClick(AddPoiFragment.this); + } + }); + return builder.create(); + } + + public String getName() { + return mName != null ? mName.getText().toString() : ""; + } +} \ No newline at end of file diff --git a/app/src/main/java/ovh/exception/watchdogzz/activities/MainActivity.java b/app/src/main/java/ovh/exception/watchdogzz/activities/MainActivity.java index 24c71eb..074a58a 100644 --- a/app/src/main/java/ovh/exception/watchdogzz/activities/MainActivity.java +++ b/app/src/main/java/ovh/exception/watchdogzz/activities/MainActivity.java @@ -1,19 +1,21 @@ package ovh.exception.watchdogzz.activities; +import android.app.DialogFragment; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; -import android.util.Log; -import android.view.View; import android.support.design.widget.NavigationView; +import android.support.design.widget.Snackbar; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -26,6 +28,7 @@ import ovh.exception.watchdogzz.R; import ovh.exception.watchdogzz.data.GPSPosition; import ovh.exception.watchdogzz.data.JUser; +import ovh.exception.watchdogzz.data.PoiManager; import ovh.exception.watchdogzz.data.User; import ovh.exception.watchdogzz.data.UserManager; import ovh.exception.watchdogzz.network.IWSConsumer; @@ -35,13 +38,35 @@ import ovh.exception.watchdogzz.view.WDRenderer; import ovh.exception.watchdogzz.view.WDSurfaceView; -public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, IWSConsumer { +public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, IWSConsumer, AddPoiFragment.PoiDialogListener { private WDSurfaceView glView; private UserManager users; + private PoiManager pois; private PostitionManager postitionManager; private NetworkManager networkManager; - public boolean isSuccess = false, isFinished = false; + private FloatingActionButton mAddPOI, mValidatePOI; + private GPSPosition mNewPoiPosition; + + private final static int INTERVAL = 1000 * 5; // 5 secondes + private Handler mHandler = new Handler(); + + private Runnable mHandlerTask = new Runnable() { + @Override + public void run() { + new WebServiceTask(MainActivity.this, null, users.getMe()).execute(getString(R.string.server) + "/where"); + new WebServiceTask(MainActivity.this, MainActivity.this).execute(getString(R.string.server) + "/where"); + mHandler.postDelayed(mHandlerTask, INTERVAL); + } + }; + + private void startRequestingTask() { + mHandlerTask.run(); + } + + private void stopRequestingTask() { + mHandler.removeCallbacks(mHandlerTask); + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -52,7 +77,7 @@ protected void onCreate(Bundle savedInstanceState) { glView.setRenderer(renderer); // Use a custom renderer Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - +/* FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override @@ -63,6 +88,33 @@ public void onClick(View view) { new WebServiceTask(MainActivity.this, MainActivity.this).execute(getString(R.string.server) + "/where"); } }); +*/ + mAddPOI = (FloatingActionButton) findViewById(R.id.add_poi); + mAddPOI.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, R.string.add_poi_help, Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + glView.setCibleVisible(true); + mAddPOI.hide(); + mValidatePOI.show(); + } + }); + + mValidatePOI = (FloatingActionButton) findViewById(R.id.validate_poi); + mValidatePOI.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + AddPoiFragment dialog = new AddPoiFragment(); + dialog.show(getFragmentManager(), "PoiDialogFragment"); + mNewPoiPosition = new GPSPosition(0f,0f,0.5f); + glView.setCibleVisible(false); + mValidatePOI.hide(); + mAddPOI.show(); + MainActivity.this.glView.requestRender(); + } + }); + mValidatePOI.hide(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); @@ -70,13 +122,14 @@ public void onClick(View view) { this.postitionManager = new PostitionManager(this); this.networkManager = NetworkManager.getInstance(this.getApplicationContext()); setUsers(new UserManager()); + this.pois = new PoiManager(); User futurMe = getIntent().getParcelableExtra("user"); getUsers().addObserver(renderer.getMap()); this.users.setMe(futurMe); /** TODO supppress stub **/ this.users.addUser(new User("tito", "Bob", "bob@mail.com", "", "http://www.superaktif.net/wp-content/upLoads/2011/07/Han.Solo_.jpg", false, new GPSPosition(3.111185f, 45.759231f, 0.0f))); - this.users.addUser(new User("tata", "Alice", "alice@mail.com", "", "http://www.superaktif.net/wp-content/upLoads/2011/07/Han.Solo_.jpg", false, new GPSPosition(3.111185f, 45.759271f, 0.5f))); + this.users.addUser(new User("tata", "Alice", "alice@mail.com", "", "http://static.anakinworld.com/uploads/entries/original/personnage-leia-organa-solo.jpg", false, new GPSPosition(3.111185f, 45.759271f, 0.5f))); /******************************************************/ // login sur le serveur @@ -165,6 +218,10 @@ public boolean onNavigationItemSelected(MenuItem item) { masterViewIntent.putExtra("users", users.getUsers()); masterViewIntent.putExtra("user", users.getMe()); startActivity(masterViewIntent); + } else if (id == R.id.poi_list) { + Intent masterViewIntent = new Intent(MainActivity.this, UserListActivity.class); + masterViewIntent.putExtra("pois", pois.getUsers()); + startActivity(masterViewIntent); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); @@ -172,11 +229,16 @@ public boolean onNavigationItemSelected(MenuItem item) { return true; } + private GPSPosition getGPSPosition(GPSPosition loc) { + return glView.getGPSPosition(loc); + } + @Override protected void onPause() { super.onPause(); glView.onPause(); this.postitionManager.stop(); + this.stopRequestingTask(); } @Override @@ -184,6 +246,7 @@ protected void onResume() { super.onResume(); glView.onResume(); this.postitionManager.start(); + this.startRequestingTask(); } @Override @@ -249,4 +312,18 @@ public void consume(JSONObject json) { } else Log.w("COUCOU", "JSON is null"); } + + @Override + public void onDialogPositiveClick(DialogFragment dialog) { + Snackbar.make(findViewById(R.id.content_main), R.string.poi_added, Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + this.pois.createNewPoi(((AddPoiFragment)dialog).getName()); + pois.finalizeNewPoi(getGPSPosition(mNewPoiPosition)); + } + + @Override + public void onDialogNegativeClick(DialogFragment dialog) { + Snackbar.make(findViewById(R.id.content_main), R.string.abandon, Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } } diff --git a/app/src/main/java/ovh/exception/watchdogzz/activities/UserListActivity.java b/app/src/main/java/ovh/exception/watchdogzz/activities/UserListActivity.java index b0df9e1..2e2984b 100644 --- a/app/src/main/java/ovh/exception/watchdogzz/activities/UserListActivity.java +++ b/app/src/main/java/ovh/exception/watchdogzz/activities/UserListActivity.java @@ -43,19 +43,24 @@ public class UserListActivity extends AppCompatActivity { */ private boolean mTwoPane; private List mUsers; + private boolean isPois = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_list); - mUsers = getIntent().getParcelableArrayListExtra("users"); + mUsers = getIntent().getParcelableArrayListExtra("pois"); + if(mUsers==null) + mUsers = getIntent().getParcelableArrayListExtra("users"); + else + isPois = true; if(mUsers==null) mUsers = new ArrayList<>(); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - toolbar.setTitle(getTitle()); + toolbar.setTitle(isPois?getString(R.string.poi_title):getTitle()); // Show the Up button in the action bar. ActionBar actionBar = getSupportActionBar(); diff --git a/app/src/main/java/ovh/exception/watchdogzz/data/GPSPosition.java b/app/src/main/java/ovh/exception/watchdogzz/data/GPSPosition.java index 9f34f94..0546de6 100644 --- a/app/src/main/java/ovh/exception/watchdogzz/data/GPSPosition.java +++ b/app/src/main/java/ovh/exception/watchdogzz/data/GPSPosition.java @@ -21,6 +21,12 @@ public float[] getForMap(float[] origin, float scale) { return res; } + public void screenToGps(float[] origin, float scale) { + latitude = (getLatitude() / scale + origin[1]); + longitude = (getLongitude() / scale + origin[0]); + altitude = (getAltitude() / scale + origin[2]); + } + @Override public String toString() { return getLatitude() + " " + getLongitude() + " " + getAltitude(); diff --git a/app/src/main/java/ovh/exception/watchdogzz/data/PoiManager.java b/app/src/main/java/ovh/exception/watchdogzz/data/PoiManager.java new file mode 100644 index 0000000..286298e --- /dev/null +++ b/app/src/main/java/ovh/exception/watchdogzz/data/PoiManager.java @@ -0,0 +1,27 @@ +package ovh.exception.watchdogzz.data; + +import android.util.Log; + +/** + * Manage points of interest + */ +public class PoiManager extends UserManager { + + private boolean isCreatingNewPoi = false; + private User mNewUser = null; + + public void createNewPoi(String name) { + mNewUser = new User(name,name,"","","https://i.stack.imgur.com/6cDGi.png",false,null); + this.isCreatingNewPoi = true; + } + + public void finalizeNewPoi(GPSPosition position) { + if(this.isCreatingNewPoi) { + this.mNewUser.setPosition(position); + Log.i("POIS", position.toString()); + this.addUser(this.mNewUser); + this.isCreatingNewPoi = false; + } + } + +} diff --git a/app/src/main/java/ovh/exception/watchdogzz/model/WDMap.java b/app/src/main/java/ovh/exception/watchdogzz/model/WDMap.java index 87bef2b..879965b 100644 --- a/app/src/main/java/ovh/exception/watchdogzz/model/WDMap.java +++ b/app/src/main/java/ovh/exception/watchdogzz/model/WDMap.java @@ -15,6 +15,7 @@ * Class for representing the map of an establishment */ public class WDMap extends Observable implements WDDrawable, Observer { + private final float scale = 3169.8f; private WDObjet map; private HashMap markers; private Context context; @@ -48,13 +49,14 @@ public void draw(GL10 gl) { gl.glRotatef(57.55046185f,0.0f,0.0f,1.0f); gl.glScalef(0.002f,0.002f,0.002f); gl.glTranslatef(-1682f,-1016f,0); // position dans le mesh du point d'origine + gl.glColor4f(0,0,0,1.0f); map.draw(gl); gl.glPopMatrix(); // dessin des marqueurs for (WDArtefact x : markers.values()) { gl.glPushMatrix(); - float[] tmp = x.getPosition().getForMap(origin,3169.8f); + float[] tmp = x.getPosition().getForMap(getOrigin(), getScale()); gl.glTranslatef(tmp[0],tmp[1], 0.5f); Log.d("ME", x.getPosition().toString() + " " + x.getLabel()); @@ -93,4 +95,16 @@ public void update(Observable observable, Object data) { this.setChanged(); this.notifyObservers(); } + + public float[] getOrigin() { + return origin; + } + + public void setOrigin(float[] origin) { + this.origin = origin; + } + + public float getScale() { + return scale; + } } diff --git a/app/src/main/java/ovh/exception/watchdogzz/view/WDRenderer.java b/app/src/main/java/ovh/exception/watchdogzz/view/WDRenderer.java index da045fb..ae7ebe1 100644 --- a/app/src/main/java/ovh/exception/watchdogzz/view/WDRenderer.java +++ b/app/src/main/java/ovh/exception/watchdogzz/view/WDRenderer.java @@ -3,6 +3,7 @@ import android.content.Context; import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLU; +import android.util.Log; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -11,18 +12,20 @@ import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; +import ovh.exception.watchdogzz.data.GPSPosition; +import ovh.exception.watchdogzz.model.WDArtefact; import ovh.exception.watchdogzz.model.WDMap; /** - * Created by begarco on 19/11/2016. + * Renderer for displayni a watchdogzz map */ - public class WDRenderer implements Renderer { private Context context; // contexte de l'application private WDCamera camera; // camera private WDMap map; // modele de la carte + private WDArtefact cible; private final float[] mat_ambient = { 0.2f, 0.3f, 0.8f, 1.0f }; @@ -34,16 +37,19 @@ public class WDRenderer implements Renderer { private final float[] mat_specular = { 0.2f * 0.4f, 0.2f * 0.6f, 0.2f * 0.8f, 1.0f }; private FloatBuffer mat_specular_buf; - public volatile float mLightX = 0f; - public volatile float mLightY = 0f; - public volatile float mLightZ = 3f; + private volatile float mLightX = 0f; + private volatile float mLightY = 0f; + private volatile float mLightZ = 3f; + private boolean isCibleVisible = false; // Constructeur avec contexte public WDRenderer(Context context) { this.context = context; this.setMap(new WDMap(context)); this.camera = new WDCamera(0, 0, -8.0f); + this.cible = new WDArtefact(context, "cible", "cible"); + cible.setPosition(new GPSPosition(0f,0f,0.5f)); } /** @@ -145,6 +151,12 @@ public void onDrawFrame(GL10 gl) { gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, mat_posiBuf); gl.glPushMatrix(); + if(isCibleVisible()) { + gl.glPushMatrix(); + gl.glTranslatef(0, 0, -3f); + this.cible.draw(gl); + gl.glPopMatrix(); + } this.camera.watch(gl); gl.glPushMatrix(); this.getMap().draw(gl); // Draw model @@ -171,4 +183,22 @@ public WDMap getMap() { public void setMap(WDMap map) { this.map = map; } + + public GPSPosition getGPSPosition(GPSPosition loc) { + GPSPosition res = loc; + + res.setLatitude(-camera.x()); + res.setLongitude(-camera.y()); + res.screenToGps(map.getOrigin(),map.getScale()); + + return res; + } + + public boolean isCibleVisible() { + return isCibleVisible; + } + + public void setCibleVisible(boolean cibleVisible) { + isCibleVisible = cibleVisible; + } } diff --git a/app/src/main/java/ovh/exception/watchdogzz/view/WDSurfaceView.java b/app/src/main/java/ovh/exception/watchdogzz/view/WDSurfaceView.java index 491933f..a487cb2 100644 --- a/app/src/main/java/ovh/exception/watchdogzz/view/WDSurfaceView.java +++ b/app/src/main/java/ovh/exception/watchdogzz/view/WDSurfaceView.java @@ -8,6 +8,8 @@ import java.util.Observable; import java.util.Observer; +import ovh.exception.watchdogzz.data.GPSPosition; + /** * View to introduce OpenGL */ @@ -22,12 +24,20 @@ public class WDSurfaceView extends GLSurfaceView implements Observer { private float mSpaceBetweenFingers; // espace entre les doigts private float mScale; // echelle de zoom + public GPSPosition getGPSPosition(GPSPosition loc) { + return mRenderer.getGPSPosition(loc); + } + private enum FingerAction { NONE, IS_MOVING, IS_ZOOMING } + public void setCibleVisible(boolean val) { + this.mRenderer.setCibleVisible(val); + } + public WDSurfaceView(Context context) { this(context, null); } diff --git a/app/src/main/res/layout/app_map_main.xml b/app/src/main/res/layout/app_map_main.xml index 35700eb..7c3f620 100644 --- a/app/src/main/res/layout/app_map_main.xml +++ b/app/src/main/res/layout/app_map_main.xml @@ -17,13 +17,20 @@ - + + diff --git a/app/src/main/res/layout/poi_dialog.xml b/app/src/main/res/layout/poi_dialog.xml new file mode 100644 index 0000000..cbd3c20 --- /dev/null +++ b/app/src/main/res/layout/poi_dialog.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index e962e36..c22b099 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -10,6 +10,10 @@ android:id="@+id/users_list" android:icon="@drawable/logo" android:title="@string/users_list" /> + Salut, voici ma position fournie par WatchDogZZ : - Utilisateurs + Liste détaillée Détails Mode RV https://watchdogzz.ddns.net @@ -29,4 +29,12 @@ Partager la position Envoyer un message Les utilisateurs + "Points d'intérêt" + "Appuyez sur la carte pour ajouter un point d'intérêt." + Nom + Ok + Annuler + Abandon + Point ajouté. + "Points d'intérêt" \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 6ed9888..d30342b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,4 +3,5 @@ #3F51B5 #303F9F #40f9ff + #049704 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6d351bb..d3607f7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,7 +29,7 @@ Send your position to your friends. Hi, here is my position provided by WatchDogZZ: - Users + Detailed list User Detail https://watchdogzz.ddns.net RV mode @@ -40,5 +40,13 @@ Send message Coming soon… Users\' list + Points of interest + Tap on the map to place a point of interest. + Name + Ok + Cancel + Abandon + Point added. + Points of interests