François Gautrais 8 年之前
父節點
當前提交
efed3899b5
共有 36 個文件被更改,包括 789 次插入454 次删除
  1. 2 2
      app/build.gradle
  2. 16 9
      app/src/main/AndroidManifest.xml
  3. 1 0
      app/src/main/java/app/ara/activities/ARActivity.java
  4. 55 0
      app/src/main/java/app/ara/activities/CreditsActivity.java
  5. 7 0
      app/src/main/java/app/ara/activities/IViewerActivity.java
  6. 130 0
      app/src/main/java/app/ara/activities/ImageViewerActivity.java
  7. 39 0
      app/src/main/java/app/ara/activities/InfoActivity.java
  8. 25 12
      app/src/main/java/app/ara/activities/MediaViewerAcitvity.java
  9. 9 5
      app/src/main/java/app/ara/activities/MenuActivity.java
  10. 166 0
      app/src/main/java/app/ara/activities/ModelViewerActivity.java
  11. 24 22
      app/src/main/java/app/ara/activities/PermissionActivity.java
  12. 5 6
      app/src/main/java/app/ara/activities/SEMenuActivity.java
  13. 0 281
      app/src/main/java/app/ara/activities/ViewerActivity.java
  14. 19 39
      app/src/main/java/app/ara/ui/MediaView.java
  15. 26 7
      app/src/main/java/app/ara/utils/AndroidResources.java
  16. 7 1
      app/src/main/java/app/ara/utils/ResourceManager.java
  17. 7 2
      app/src/main/java/app/ara/utils/app/brest/game/Area.java
  18. 13 1
      app/src/main/java/app/ara/utils/app/brest/game/Game.java
  19. 1 1
      app/src/main/java/app/ara/utils/app/brest/game/Resource.java
  20. 13 16
      app/src/main/java/app/ara/utils/files/FileManager.java
  21. 1 1
      app/src/main/java/app/ara/utils/files/JSONAssetsManager.java
  22. 6 0
      app/src/main/java/app/ara/utils/geometry/GPSPoint.java
  23. 14 7
      app/src/main/java/min3d/parser/AParser.java
  24. 6 4
      app/src/main/java/min3d/parser/MD2Parser.java
  25. 6 4
      app/src/main/java/min3d/parser/Max3DSParser.java
  26. 7 5
      app/src/main/java/min3d/parser/ObjParser.java
  27. 9 8
      app/src/main/java/min3d/parser/Parser.java
  28. 23 0
      app/src/main/res/layout/activity_credits.xml
  29. 50 0
      app/src/main/res/layout/activity_info.xml
  30. 2 2
      app/src/main/res/layout/activity_media.xml
  31. 50 0
      app/src/main/res/layout/activity_model_viewer.xml
  32. 10 0
      app/src/main/res/layout/activity_new_menu.xml
  33. 2 3
      app/src/main/res/layout/activity_resource_list.xml
  34. 6 16
      app/src/main/res/layout/activity_viewer.xml
  35. 2 0
      app/src/main/res/values/strings.xml
  36. 30 0
      build.gradle

+ 2 - 2
app/build.gradle

@@ -5,11 +5,11 @@ android {
     buildToolsVersion "24.0.1"
 
     defaultConfig {
-        applicationId "app.brest.testmin3d"
+        applicationId "app.ara"
         minSdkVersion 14
         targetSdkVersion 24
         versionCode 1
-        versionName "1.0"
+        versionName "alpha 1.0"
     }
     buildTypes {
         release {

+ 16 - 9
app/src/main/AndroidManifest.xml

@@ -22,25 +22,24 @@
         android:theme="@style/AppTheme">
         <activity android:name=".ARActivity" />
         <activity
-            android:name=".ViewerActivity"
-            android:configChanges="orientation|keyboardHidden|screenSize"
-            android:label="@string/title_activity_viewer" />
+            android:name=".ImageViewerActivity"
+            android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
         <activity
             android:name=".ResourceListActivity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:label="@string/title_activity_resource_list"
-            android:screenOrientation="portrait"/>
+            android:screenOrientation="portrait" />
         <activity
             android:name=".SettingsActivity"
             android:configChanges="orientation|keyboardHidden"
             android:label="@string/title_activity_settings"
-            android:screenOrientation="portrait"></activity>
+            android:screenOrientation="portrait" />
         <activity android:name=".TransferActivity" />
         <activity android:name=".EndActivity" />
         <activity
             android:name=".MARMenuActivity"
             android:configChanges="orientation|keyboardHidden"
-            android:screenOrientation="portrait"></activity>
+            android:screenOrientation="portrait" />
         <activity
             android:name=".SEMenuActivity"
             android:configChanges="orientation|keyboardHidden"
@@ -59,8 +58,16 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".MediaAcitvity"
-            android:theme="@style/AppTheme.NoActionBar.Fullscreen"></activity>
+        <activity
+            android:name=".MediaViewerAcitvity"
+            android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
+        <activity
+            android:name=".ModelViewerActivity"
+            android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
+        <activity
+            android:name=".InfoActivity"
+            android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
+        <activity android:name=".CreditsActivity"
+                  android:theme="@style/AppTheme.NoActionBar.Fullscreen" ></activity>
     </application>
-
 </manifest>

+ 1 - 0
app/src/main/java/app/ara/activities/ARActivity.java

@@ -379,6 +379,7 @@ public class ARActivity extends RendererActivity
         int w = mRlRoot.getWidth();
         int h = mRlRoot.getHeight();
 
+        mGame.printStage();
 
     }
 

+ 55 - 0
app/src/main/java/app/ara/activities/CreditsActivity.java

@@ -0,0 +1,55 @@
+package app.ara.activities;
+
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.text.Html;
+import android.widget.TextView;
+
+import app.ara.utils.FontChangeCrawler;
+
+public class CreditsActivity extends AppCompatActivity {
+
+    private TextView mText;
+    private static final String CREDITS="<h1> Credits </h1>\n" +
+            "Ce jeux a été réalisé par les CE2 et CM1 de l'école Les Colombes de Saint Erblon durant les temps méridiens (encadré par François Gautrais).\n" +
+            "\n" +
+            "<h2> Scénario </h2>\n" +
+            "- Romain<br>\n" +
+            "- Tiffen<br>\n" +
+            "- Léa <br>\n" +
+            "- Thaïs<br>\n" +
+            "- Jules <br>\n" +
+            "\n" +
+            "<h2> Réalisation des indices </h2>\n" +
+            "- Romain<br>\n" +
+            "- Tiffen<br>\n" +
+            "- Léa<br>\n" +
+            "- Thaïs<br>\n" +
+            "- François Gautrais<br>\n" +
+            "\n" +
+            "<h2> Actteurs-ices </h2>\n" +
+            "- Romain : Le chasseur de monstre<br>\n" +
+            "- Léa : Qui se balladait place de la fontaine<br>\n" +
+            "- Élise : Qui se balladait aux étangs<br>\n" +
+            "- Jules : À la bibliothèque<br>\n" +
+            "- Sophia : Au parc de l'Ise<br>\n" +
+            "\n" +
+            "<h2> Programmation / Interface / Montage </h2>\n" +
+            "- François Gautrais<br>\n" +
+            "\n";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_credits);
+        mText = (TextView) findViewById(R.id.tv_credits);
+        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) {
+            mText.setText(Html.fromHtml(CREDITS));
+        }else
+        {
+            mText.setText(Html.fromHtml(CREDITS, Html.FROM_HTML_MODE_COMPACT));
+        }
+
+        FontChangeCrawler.setFont(this);
+    }
+}

+ 7 - 0
app/src/main/java/app/ara/activities/IViewerActivity.java

@@ -0,0 +1,7 @@
+package app.ara.activities;
+
+/**
+ * Created by ptitcois on 04/07/17.
+ */
+public interface IViewerActivity {
+}

+ 130 - 0
app/src/main/java/app/ara/activities/ImageViewerActivity.java

@@ -0,0 +1,130 @@
+package app.ara.activities;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.support.v4.view.MotionEventCompat;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import app.ara.utils.AndroidResources;
+import app.ara.utils.FontChangeCrawler;
+import app.ara.utils.app.brest.game.Resource;
+import app.ara.utils.files.FileManager;
+import app.ara.utils.geometry.Point;
+import min3d.core.Object3d;
+import min3d.core.RendererActivity;
+import min3d.vos.CameraVo;
+import min3d.vos.Light;
+import uk.co.senab.photoview.PhotoViewAttacher;
+
+/**
+ * An example full-screen activity that shows and hides the system UI (i.e.
+ * status bar and navigation/system bar) with user interaction.
+ */
+public class ImageViewerActivity extends AppCompatActivity implements IViewerActivity{
+
+
+    private Resource mResource;
+    private ImageView mImageView;
+    private Button mButton;
+    private PhotoViewAttacher mAttacher;
+
+
+    public static final int CONTENT_NULL=0;
+    public static final int CONTENT_MAP=1;
+    public static final int CONTENT_INFO=2;
+    public static final int CONTENT_IMAGE=3;
+    public static final int CONTENT_3D=4;
+    protected int mContent=CONTENT_NULL;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_viewer);
+        mImageView = (ImageView) findViewById(R.id.imageView);
+        mButton = (Button) findViewById(R.id.info);
+        if(getIntent().hasExtra("resource"))
+        {
+            mResource = (Resource) getIntent().getSerializableExtra("resource");
+            if(mResource!=null) setTitle(mResource.getTitle());
+        }
+
+        final TextView title = (TextView) findViewById(R.id.title);
+        title.setVisibility(View.VISIBLE);
+
+        if(mResource != null && !getIntent().hasExtra("information") && !getIntent().hasExtra("map"))
+        {
+            Log.e("__________", "Info loaded");
+            title.setText(mResource.getTitle());
+            if(mResource.isImage())
+            {
+                mContent=CONTENT_IMAGE;
+                Bitmap bmp=null;
+                try {
+                    bmp = FileManager.openImage(this, mResource.getName());
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+                mImageView.setImageBitmap(bmp);
+                mAttacher = new PhotoViewAttacher(mImageView);
+                mAttacher.setMaximumScale(20);
+
+            }
+
+        } else if(getIntent().hasExtra("map") )
+        {
+            Log.e("__________", "Map loaded");
+            mContent=CONTENT_MAP;
+            Bitmap bmp=null;
+            try {
+                bmp = FileManager.openImage(this, "map");
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            title.setVisibility(View.GONE);
+            mImageView.setImageBitmap(bmp);
+            mAttacher = new PhotoViewAttacher(mImageView);
+            mAttacher.setMaximumScale(20);
+            mButton.setVisibility(View.GONE);
+        }else
+        {
+            Log.e("__________", "Erreur");
+            title.setText("Erreur");
+        }
+        FontChangeCrawler.setFont(this);
+
+    }
+
+    public void onClickInfo(View v)
+    {
+        Intent intent = AndroidResources.getInfoIntent(this, mResource);
+        startActivity(intent);
+    }
+
+
+    public void onClick(View v)
+    {
+        if(mContent==CONTENT_IMAGE) {
+
+            final TextView title = (TextView) findViewById(R.id.title);
+            if (title.getVisibility() == View.VISIBLE) {
+                title.setVisibility(View.GONE);
+                mButton.setVisibility(View.GONE);
+            } else {
+
+                title.setVisibility(View.VISIBLE);
+                mButton.setVisibility(View.VISIBLE);
+            }
+        }
+    }
+
+}

+ 39 - 0
app/src/main/java/app/ara/activities/InfoActivity.java

@@ -0,0 +1,39 @@
+package app.ara.activities;
+
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import app.ara.utils.FontChangeCrawler;
+import app.ara.utils.app.brest.game.Resource;
+
+public class InfoActivity extends AppCompatActivity  implements IViewerActivity{
+
+    private Resource mResource;
+    private TextView mTitle;
+    private TextView mText;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_info);
+
+        mTitle = (TextView) findViewById(R.id.title);
+        mText = (TextView) findViewById(R.id.tv_comment);
+
+        if(getIntent().hasExtra("resource"))
+        {
+            mResource = (Resource) getIntent().getSerializableExtra("resource");
+            if(mResource!=null) setTitle(mResource.getTitle());
+            mTitle.setText(mResource.getTitle());
+            mText.setText(mResource.getComment());
+        }else
+        {
+            mTitle.setText("Error: Res not found");
+        }
+        FontChangeCrawler.setFont(this);
+
+    }
+}

+ 25 - 12
app/src/main/java/app/ara/activities/MediaAcitvity.java → app/src/main/java/app/ara/activities/MediaViewerAcitvity.java

@@ -20,11 +20,13 @@ import java.util.Timer;
 
 import app.ara.ui.MediaView;
 import app.ara.utils.AndroidResources;
+import app.ara.utils.FontChangeCrawler;
 import app.ara.utils.app.brest.game.Resource;
 
-public class MediaAcitvity extends AppCompatActivity implements MediaPlayer.OnSeekCompleteListener,
+public class MediaViewerAcitvity extends AppCompatActivity implements MediaPlayer.OnSeekCompleteListener,
                                                                 MediaView.OnStartListener,
-                                                                SeekBar.OnSeekBarChangeListener {
+                                                                SeekBar.OnSeekBarChangeListener,
+                                                                IViewerActivity{
     private Resource mResource;
     private Button mInfo;
     private TextView mTitle;
@@ -84,6 +86,8 @@ public class MediaAcitvity extends AppCompatActivity implements MediaPlayer.OnSe
 
             mMediaView.play(path);
         }
+        FontChangeCrawler.setFont(this);
+
 
     }
 
@@ -117,8 +121,7 @@ public class MediaAcitvity extends AppCompatActivity implements MediaPlayer.OnSe
 
     public void onInfos(View v)
     {
-        Intent intent = AndroidResources.getViewerIntent(this, mResource);
-        intent.putExtra("information", true);
+        Intent intent = AndroidResources.getInfoIntent(this, mResource);
         startActivity(intent);
     }
 
@@ -149,6 +152,7 @@ public class MediaAcitvity extends AppCompatActivity implements MediaPlayer.OnSe
 
     }
 
+
     @Override
     public void onStopTrackingTouch(SeekBar seekBar) {
         if(mUserSeeks)
@@ -199,25 +203,34 @@ public class MediaAcitvity extends AppCompatActivity implements MediaPlayer.OnSe
         }
     }
 
+    protected void onResume()
+    {
+        super.onResume();
+    }
+
     protected  void onPause()
     {
-        mAutoSeek.stop();
         mMediaView.stop();
+        mAutoSeek.stop();
         super.onPause();
-    }
 
-    protected  void onResume()
-    {
-        if(mMediaView!=null)
-            mMediaView.start();
-        super.onResume();
     }
 
     public void finish()
     {
-        mAutoSeek.stop();
+
         mMediaView.stop();
+        mAutoSeek.stop();
+        mMediaView.clearPlayer();
         super.finish();
     }
 
+    public void onDestroy()
+    {
+        mMediaView.stop();
+        mAutoSeek.stop();
+        mMediaView.clearPlayer();
+        super.onDestroy();
+    }
+
 }

+ 9 - 5
app/src/main/java/app/ara/activities/MenuActivity.java

@@ -6,7 +6,6 @@ import android.content.res.Resources;
 import android.graphics.Point;
 import android.os.Handler;
 import android.os.Bundle;
-import android.util.Log;
 import android.view.Display;
 import android.view.View;
 import android.view.ViewGroup;
@@ -22,7 +21,7 @@ import app.ara.utils.app.brest.game.Game;
 import app.ara.utils.app.brest.game.Resource;
 import app.ara.utils.app.brest.game.Stage;
 
-public abstract class  MenuActivity extends Activity implements View.OnClickListener{
+public abstract class  MenuActivity extends Activity implements View.OnClickListener, IViewerActivity{
 
     protected int mWidth;
     protected int mHeight;
@@ -138,8 +137,7 @@ public abstract class  MenuActivity extends Activity implements View.OnClickList
 
     public void onCarteClick(View v)
     {
-        Intent intent = new Intent(this, ViewerActivity.class);
-        intent.putExtra("map", mGame.getName()+"_map");
+        Intent intent = AndroidResources.getMapIntent(this, mGame);
         startActivity(intent);
     }
 
@@ -159,6 +157,12 @@ public abstract class  MenuActivity extends Activity implements View.OnClickList
         startActivity(intent);
     }
 
+    public void onCredits(View v)
+    {
+        Intent intent = new Intent(this, CreditsActivity.class);
+        startActivity(intent);
+    }
+
 
     public void onInfoClick(View v) {
         Stage s = mGame.getCurrentStageObj();
@@ -170,7 +174,7 @@ public abstract class  MenuActivity extends Activity implements View.OnClickList
 
     public void onSendClick(View v)
     {
-        //TODO : Transmssion des donnes
+
         Stage s = mGame.getCurrentStageObj();
         boolean finished = mGame.nextStage();
 

+ 166 - 0
app/src/main/java/app/ara/activities/ModelViewerActivity.java

@@ -0,0 +1,166 @@
+package app.ara.activities;
+
+import android.content.Intent;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import app.ara.utils.AndroidResources;
+import app.ara.utils.FontChangeCrawler;
+import app.ara.utils.app.brest.game.Resource;
+import app.ara.utils.geometry.Point;
+import min3d.core.Object3d;
+import min3d.core.RendererActivity;
+import min3d.vos.CameraVo;
+import min3d.vos.Light;
+import min3d.vos.LightType;
+
+public class ModelViewerActivity extends RendererActivity  implements View.OnTouchListener, IViewerActivity {
+
+    private Resource mResource;
+    private Button mInfo;
+    private TextView mTitle;
+    private FrameLayout mFrameLayout;
+
+    protected float mPreviousX;
+    protected float mPreviousY;
+    protected float mPreviousDist=0;
+    protected CameraVo mCamera = new CameraVo();
+    protected boolean mIsZooming = false;
+    protected boolean mIsMoving = false;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_model_viewer);
+
+        mInfo = (Button) findViewById(R.id.info);
+        mFrameLayout = (FrameLayout) findViewById(R.id.frame_viewer);
+        mTitle = (TextView) findViewById(R.id.title);
+
+        if(getIntent().hasExtra("resource"))
+        {
+            mResource = (Resource) getIntent().getSerializableExtra("resource");
+            if(mResource!=null) setTitle(mResource.getTitle());
+            mFrameLayout.addView(_glSurfaceView);
+            mTitle.setText(mResource.getTitle());
+        }else
+        {
+            mTitle.setText("Error: Res not found");
+        }
+        FontChangeCrawler.setFont(this);
+
+
+    }
+
+    public void onClickInfo(View v)
+    {
+        Intent intent = AndroidResources.getInfoIntent(this, mResource);
+        startActivity(intent);
+    }
+
+    public void initScene()
+    {
+
+        scene.backgroundColor().setAll(0x00000000);
+
+        Light myLight = new Light();
+        myLight.position.setZ(0);
+        myLight.position.setY(0);
+        myLight.type(LightType.POSITIONAL);
+
+        scene.lights().add(myLight);
+        Object3d oo = mResource.get3DModel(this);
+        oo.position().z=mResource.getPosition().z;
+        oo.position().y=mResource.getPosition().y;
+        oo.position().x=mResource.getPosition().x;
+        oo.position().z-=20;
+        mCamera.frustum.zFar(0.1f);
+        mCamera.frustum.zFar(1000);
+        scene.addChild(mResource.get3DModel(this));
+    }
+
+    @Override
+    public void updateScene() {
+
+    }
+
+    @Override
+    public boolean onTouch(View view, MotionEvent motionEvent) {
+        float x = motionEvent.getX();
+        float y = motionEvent.getY();
+        final int action = motionEvent.getAction()%256;
+        int index = MotionEventCompat.getActionIndex(motionEvent);
+
+        if (motionEvent.getPointerCount() > 1) {
+            switch (action) {
+                case MotionEvent.ACTION_MOVE:
+                {
+                    if(!mIsZooming) break;
+                    Point a = new Point(motionEvent.getX(0), motionEvent.getY(0));
+                    Point b = new Point(motionEvent.getX(1), motionEvent.getY(1));
+                    double d = a.getDistanceWith(b);
+                    double delta = d - mPreviousDist;
+                    mCamera.position.z+=delta/2;
+                    mPreviousDist = (float)a.getDistanceWith(b);
+                    scene.camera(mCamera);
+                    break;
+                }
+                case MotionEvent.ACTION_POINTER_DOWN:
+                case MotionEvent.ACTION_DOWN: {
+                    Point a = new Point(motionEvent.getX(0), motionEvent.getY(0));
+                    Point b = new Point(motionEvent.getX(1), motionEvent.getY(1));
+                    mPreviousDist = (float)a.getDistanceWith(b);
+                    mIsZooming=true;
+                    break;
+                }
+                case MotionEvent.ACTION_UP:
+                case MotionEvent.ACTION_POINTER_UP:
+                case MotionEvent.ACTION_CANCEL:
+                    mIsZooming=false;
+                    mIsMoving=false;
+                    break;
+            }
+
+
+        }
+        else {
+            mIsZooming=false;
+            switch (motionEvent.getAction()) {
+                case MotionEvent.ACTION_MOVE:
+                {
+                    if(!mIsMoving) break;
+                    float dx = x - mPreviousX;
+                    float dy = y - mPreviousY;
+                    Object3d oo = mResource.get3DModel(this);
+
+                    oo.rotation().y += dx / 3;
+                    oo.rotation().x += dy / 3;
+                    _glSurfaceView.requestRender();
+
+
+                    break;
+                }
+                case MotionEvent.ACTION_DOWN:
+                    mIsMoving=true;
+                    break;
+                case MotionEvent.ACTION_UP:
+                case MotionEvent.ACTION_CANCEL:
+                    mIsMoving=false;
+                    mIsZooming=false;
+                    break;
+            }
+            mPreviousX = x;
+            mPreviousY = y;
+        }
+
+
+        return true;
+
+    }
+}

+ 24 - 22
app/src/main/java/app/ara/activities/PermissionActivity.java

@@ -1,6 +1,7 @@
 package app.ara.activities;
 
 import android.Manifest;
+import android.app.Activity;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.support.v4.app.ActivityCompat;
@@ -8,14 +9,19 @@ import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.text.Html;
+import android.util.Log;
 import android.view.View;
 import android.widget.TextView;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import app.ara.utils.files.FileManager;
 
 public class PermissionActivity extends AppCompatActivity {
     private int m_nPerm=3;
     static final int PERM_FINE_LOCATION=1337;
+    static final int ALL_PERMISSIONS=1337;
     static final int PERM_CAMERA=1338;
     static final int PERM_COARSE_LOCATION=1339;
     protected TextView mText;
@@ -34,7 +40,8 @@ public class PermissionActivity extends AppCompatActivity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_permission);
-        //FontChangeCrawler.setFont(this);
+        ArrayList<String> al = new ArrayList<String>();
+
 
         FileManager.init(this);
         mText = (TextView) findViewById(R.id.disclamer);
@@ -46,24 +53,23 @@ public class PermissionActivity extends AppCompatActivity {
         }
 
 
-
         if (ContextCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_FINE_LOCATION)
                 != PackageManager.PERMISSION_GRANTED) {
-            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},   PERM_FINE_LOCATION);
+            al.add(Manifest.permission.ACCESS_FINE_LOCATION);
         } else m_nPerm--;
 
-
         if (ContextCompat.checkSelfPermission(this,   Manifest.permission.CAMERA)
                 != PackageManager.PERMISSION_GRANTED) {
-            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERM_CAMERA);
+            al.add(Manifest.permission.CAMERA);
         } else m_nPerm--;
 
 
         if (ContextCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_COARSE_LOCATION)
                 != PackageManager.PERMISSION_GRANTED) {
-            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERM_COARSE_LOCATION);
+            al.add(Manifest.permission.ACCESS_COARSE_LOCATION);
         } else m_nPerm--;
 
+        ActivityCompat.requestPermissions(this,al.toArray(new String[m_nPerm]), ALL_PERMISSIONS);
 
 
     }
@@ -72,22 +78,18 @@ public class PermissionActivity extends AppCompatActivity {
 
     public void onRequestPermissionsResult(int requestCode,
                                            String permissions[], int[] grantResults) {
-        switch (requestCode) {
-            case PERM_FINE_LOCATION:
-                if (grantResults.length > 0  && grantResults[0] == PackageManager.PERMISSION_GRANTED)
-                    m_nPerm--;
-                else finish();
-                break;
-            case PERM_CAMERA:
-                if (grantResults.length > 0  && grantResults[0] == PackageManager.PERMISSION_GRANTED)
-                    m_nPerm--;
-                else finish();
-                break;
-            case PERM_COARSE_LOCATION:
-                if (grantResults.length > 0  && grantResults[0] == PackageManager.PERMISSION_GRANTED)
-                    m_nPerm--;
-                else finish();
-                break;
+        for(int i=0; i<permissions.length; i++) {
+            switch (requestCode) {
+                case ALL_PERMISSIONS:
+                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
+                        m_nPerm--;
+                    else
+                    {
+                        finish();
+                        System.exit(0);
+                    }
+                    break;
+            }
         }
 
 

+ 5 - 6
app/src/main/java/app/ara/activities/SEMenuActivity.java

@@ -16,10 +16,9 @@ public class SEMenuActivity extends MenuActivity {
     protected  void refreshMenuStyle()
     {
         int size =  15;
-        int offset=mWidth/5;
+        int offset=mWidth/8;
         mRootLayout.setBackgroundResource(R.drawable.background);
-        int h4 = mHeight/3+mHeight/100;
-        int w4 = mWidth/5;
+        int h4 = mHeight/3-mHeight/26;
         int w = (int)(mHeight/ 4);
         int h = dpToPx((int)(mBBriefing.getTextSize()*1.5));
         int H = (int)(h*1.24);
@@ -63,7 +62,7 @@ public class SEMenuActivity extends MenuActivity {
         //moveView(mIbScanner, mWidth / 2 - mHeight / 8, mHOffset + mHeight / 2 - mHeight / 8, mHeight / 4, mHeight / 4);
         mTVmenu = new TextView(this);
         mTVmenu.setText("Menu");
-        moveView(mTVmenu, mWidth/7, mHeight/5);
+        moveView(mTVmenu, mWidth/7, mHeight/7);
         mRootLayout.addView(mTVmenu);
         mTVmenu.setTextSize(20);
 
@@ -84,8 +83,8 @@ public class SEMenuActivity extends MenuActivity {
         float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 70, r.getDisplayMetrics());
         //moveView(mBMenu, 0, 0, mWidth, (int) px);
 
-        if(!mGame.hasResource("intro"))
-            mGame.pickResource("intro");
+        if(!mGame.hasResource("start"))
+            mGame.pickResource("start");
 
     }
 }

+ 0 - 281
app/src/main/java/app/ara/activities/ViewerActivity.java

@@ -1,281 +0,0 @@
-package app.ara.activities;
-
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.support.v4.view.MotionEventCompat;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.VideoView;
-
-import app.ara.ui.MediaView;
-import app.ara.utils.FontChangeCrawler;
-import app.ara.utils.app.brest.game.Resource;
-import app.ara.utils.files.FileManager;
-import app.ara.utils.geometry.Point;
-import min3d.core.Object3d;
-import min3d.core.RendererActivity;
-import min3d.vos.CameraVo;
-import min3d.vos.Light;
-import uk.co.senab.photoview.PhotoViewAttacher;
-
-/**
- * An example full-screen activity that shows and hides the system UI (i.e.
- * status bar and navigation/system bar) with user interaction.
- */
-public class ViewerActivity extends RendererActivity implements View.OnTouchListener {
-
-
-    private Resource mResource;
-    private FrameLayout mFrameLayout;
-    private ImageView mImageView;
-    private Button mButton;
-    private TextView mText;
-    private PhotoViewAttacher mAttacher;
-
-    protected float mPreviousX;
-    protected float mPreviousY;
-    protected float mPreviousDist=0;
-    protected CameraVo mCamera = new CameraVo();
-    protected boolean mIsZooming = false;
-    protected boolean mIsMoving = false;
-
-    public static final int CONTENT_NULL=0;
-    public static final int CONTENT_MAP=1;
-    public static final int CONTENT_INFO=2;
-    public static final int CONTENT_IMAGE=3;
-    public static final int CONTENT_3D=4;
-    protected int mContent=CONTENT_NULL;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_viewer);
-        FontChangeCrawler.setFont(this);
-
-        mFrameLayout = (FrameLayout) findViewById(R.id.frame_viewer);
-        mImageView = (ImageView) findViewById(R.id.imageView);
-        mButton = (Button) findViewById(R.id.button_info);
-        mText = (TextView) findViewById(R.id.tv_comment);
-        if(getIntent().hasExtra("resource"))
-        {
-            mResource = (Resource) getIntent().getSerializableExtra("resource");
-            if(mResource!=null) setTitle(mResource.getTitle());
-        }
-
-        final TextView title = (TextView) findViewById(R.id.b_title);
-        title.setVisibility(View.VISIBLE);
-        mText.setVisibility(View.INVISIBLE);
-
-        if(mResource != null && !getIntent().hasExtra("information") && !getIntent().hasExtra("map"))
-        {
-            title.setText(mResource.getTitle());
-            if(mResource.isImage())
-            {
-                mContent=CONTENT_IMAGE;
-                Bitmap bmp=null;
-                try {
-                    bmp = FileManager.openImage(mResource.getName());
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-
-                mImageView.setImageBitmap(bmp);
-                mAttacher = new PhotoViewAttacher(mImageView);
-                mAttacher.setMaximumScale(20);
-
-            }
-            else if(mResource.is3D()) {
-                mContent=CONTENT_3D;
-                mFrameLayout.addView(_glSurfaceView);
-                mImageView.setVisibility(View.INVISIBLE);
-            }
-
-        } else if(getIntent().hasExtra("map") )
-        {
-            mContent=CONTENT_MAP;
-            Bitmap bmp=null;
-            try {
-                bmp = FileManager.openImage("map");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            title.setVisibility(View.GONE);
-            mImageView.setImageBitmap(bmp);
-            mAttacher = new PhotoViewAttacher(mImageView);
-            mAttacher.setMaximumScale(20);
-            mButton.setVisibility(View.GONE);
-        }
-        else if(mResource != null && getIntent().hasExtra("information"))
-        {
-            mContent=CONTENT_INFO;
-            title.setText(mResource.getTitle());
-            mButton.setVisibility(View.GONE);
-            mText.setVisibility(View.VISIBLE);
-            mText.setText(mResource.getComment());
-            //mFrameLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
-        }
-    }
-
-    public void onClickInfo(View v)
-    {
-        Intent intent = new Intent(this, ViewerActivity.class);
-        intent.putExtra("resource", mResource);
-        intent.putExtra("information", true);
-        startActivity(intent);
-    }
-
-    protected  void onPause()
-    {
-        super.onPause();
-
-    }
-
-    public void finish()
-    {
-        super.finish();
-    }
-
-    public void onDestroy()
-    {
-        super.onDestroy();
-    }
-
-    public void initScene()
-    {
-
-        scene.backgroundColor().setAll(0x00000000);
-
-        Light myLight = new Light();
-        myLight.position.setZ(0);
-        myLight.position.setY(0);
-        scene.lights().add(myLight);
-        Object3d oo = mResource.get3DModel(this);
-        oo.position().z=mResource.getPosition().z;
-        oo.position().y=mResource.getPosition().y;
-        oo.position().x=mResource.getPosition().x;
-        oo.position().z-=20;
-        mCamera.frustum.zFar(0.1f);
-        mCamera.frustum.zFar(1000);
-        scene.addChild(mResource.get3DModel(this));
-    }
-
-    @Override
-    public void updateScene() {
-
-    }
-
-    public static String actionToString(int action) {
-        switch (action) {
-
-            case MotionEvent.ACTION_DOWN: return "Down";
-            case MotionEvent.ACTION_MOVE: return "Move";
-            case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down";
-            case MotionEvent.ACTION_UP: return "Up";
-            case MotionEvent.ACTION_POINTER_UP: return "Pointer Up";
-            case MotionEvent.ACTION_OUTSIDE: return "Outside";
-            case MotionEvent.ACTION_CANCEL: return "Cancel";
-        }
-        return "";
-    }
-
-    @Override
-    public boolean onTouch(View view, MotionEvent motionEvent) {
-        float x = motionEvent.getX();
-        float y = motionEvent.getY();
-        final int action = motionEvent.getAction()%256;
-        int index = MotionEventCompat.getActionIndex(motionEvent);
-        if (motionEvent.getPointerCount() > 1) {
-            switch (action) {
-                case MotionEvent.ACTION_MOVE:
-                {
-                    if(!mIsZooming) break;
-                    Point a = new Point(motionEvent.getX(0), motionEvent.getY(0));
-                    Point b = new Point(motionEvent.getX(1), motionEvent.getY(1));
-                    double d = a.getDistanceWith(b);
-                    double delta = d - mPreviousDist;
-                    mCamera.position.z+=delta/2;
-                    mPreviousDist = (float)a.getDistanceWith(b);
-                    scene.camera(mCamera);
-                    break;
-                }
-                case MotionEvent.ACTION_POINTER_DOWN:
-                case MotionEvent.ACTION_DOWN: {
-                    Point a = new Point(motionEvent.getX(0), motionEvent.getY(0));
-                    Point b = new Point(motionEvent.getX(1), motionEvent.getY(1));
-                    mPreviousDist = (float)a.getDistanceWith(b);
-                    mIsZooming=true;
-                    break;
-                }
-                case MotionEvent.ACTION_UP:
-                case MotionEvent.ACTION_POINTER_UP:
-                case MotionEvent.ACTION_CANCEL:
-                    mIsZooming=false;
-                    mIsMoving=false;
-                    break;
-            }
-
-
-        }
-        else {
-            mIsZooming=false;
-            switch (motionEvent.getAction()) {
-                case MotionEvent.ACTION_MOVE:
-                {
-                    if(!mIsMoving) break;
-                    float dx = x - mPreviousX;
-                    float dy = y - mPreviousY;
-                    Object3d oo = mResource.get3DModel(this);
-
-                    oo.rotation().y += dx / 3;
-                    oo.rotation().x += dy / 3;
-                    _glSurfaceView.requestRender();
-
-
-                    break;
-                }
-                case MotionEvent.ACTION_DOWN:
-                    mIsMoving=true;
-                    break;
-                case MotionEvent.ACTION_UP:
-                case MotionEvent.ACTION_CANCEL:
-                    mIsMoving=false;
-                    mIsZooming=false;
-                    break;
-            }
-            mPreviousX = x;
-            mPreviousY = y;
-        }
-
-
-        return true;
-
-    }
-
-    public void onClick(View v)
-    {
-        if(mContent==CONTENT_IMAGE) {
-            Log.e("______________", "OnClick");
-
-            final TextView title = (TextView) findViewById(R.id.b_title);
-            if (title.getVisibility() == View.VISIBLE) {
-                Log.e("______________", "Visible -> Gone");
-                title.setVisibility(View.GONE);
-                mButton.setVisibility(View.GONE);
-            } else {
-                Log.e("______________", "Gone -> Visible");
-
-                title.setVisibility(View.VISIBLE);
-                mButton.setVisibility(View.VISIBLE);
-            }
-        }
-    }
-
-}

+ 19 - 39
app/src/main/java/app/ara/ui/MediaView.java

@@ -47,24 +47,29 @@ public class MediaView extends SurfaceView implements View.OnClickListener,Surfa
 
     }
 
-    @Override
-    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
-
-    }
 
     public void stop() {
         if(mPlayer!=null && mPlayer.isPlaying())
             mPlayer.stop();
     }
 
+    public void updateHolder() {
+        //if(mPlayer!=null)mPlayer.setDisplay(getHolder());
+
+    }
+
+    public void clearPlayer() {
+        mPlayer=null;
+
+    }
+
     public void play(String path)
     {
         final MediaView x=this;
         AssetFileDescriptor afd;
         mPlayer = new MediaPlayer();
-        mPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
         Log.e("MediaPlayer", "Play: '"+path+"'");
-        afd = FileManager.getAfdMedia(path);
+        afd = FileManager.getAfdMedia(mContext, path);
         try {
             mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
         } catch (IOException e) {
@@ -75,7 +80,7 @@ public class MediaView extends SurfaceView implements View.OnClickListener,Surfa
 
             @Override
             public void onPrepared(MediaPlayer mp) {
-                mp.setDisplay(mThis.getHolder());
+                //mp.setDisplay(mThis.getHolder());
                 mp.start();
                 if(mOnStart!=null)
                     mOnStart.onStart(x);
@@ -133,39 +138,14 @@ public class MediaView extends SurfaceView implements View.OnClickListener,Surfa
         mPlayer.seekTo(x);
     }
 
-    MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {
-
-        @Override
-        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
-
-            setFitToFillAspectRatio(mp, width, height);
-
-        }
-    };
-
-
-    private void setFitToFillAspectRatio(MediaPlayer mp, int videoWidth, int videoHeight)
-    {
-        if(mp != null)
-        {
-            Integer screenWidth = getWidth();
-            Integer screenHeight = getHeight();
-            android.view.ViewGroup.LayoutParams videoParams = getLayoutParams();
-
-
-            if (videoWidth > videoHeight)
-            {
-                videoParams.width = screenWidth;
-                videoParams.height = screenWidth * videoHeight / videoWidth;
-            }
-            else
-            {
-                videoParams.width = screenHeight * videoWidth / videoHeight;
-                videoParams.height = screenHeight;
+    public void surfaceDestroyed(SurfaceHolder var1) {
+        synchronized (this) {
+            //mHasActiveHolder = false;
+            if(mPlayer!=null) mPlayer.stop();
+            mPlayer=null;
+            synchronized(this)          {
+                this.notifyAll();
             }
-
-
-            setLayoutParams(videoParams);
         }
     }
 

+ 26 - 7
app/src/main/java/app/ara/utils/AndroidResources.java

@@ -6,8 +6,11 @@ import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 
-import app.ara.activities.MediaAcitvity;
-import app.ara.activities.ViewerActivity;
+import app.ara.activities.ImageViewerActivity;
+import app.ara.activities.InfoActivity;
+import app.ara.activities.MediaViewerAcitvity;
+import app.ara.activities.ModelViewerActivity;
+import app.ara.utils.app.brest.game.Game;
 import app.ara.utils.app.brest.game.Resource;
 import min3d.core.Object3d;
 import min3d.parser.IParser;
@@ -19,7 +22,7 @@ import min3d.parser.Parser;
 public class AndroidResources {
     public static Object3d getModel(Activity context, String name)
     {
-        IParser myParser = Parser.createParser(Parser.Type.OBJ, context.getResources(), "app.brest.testmin3d:raw/"+name+"_obj",true);
+        IParser myParser = Parser.createParser(context, Parser.Type.OBJ, context.getResources(), "app.brest.testmin3d:raw/"+name+"_obj",true);
         myParser.parse();
         return myParser.getParsedObject();
     }
@@ -51,15 +54,31 @@ public class AndroidResources {
     {
         Intent intent =null ;
         if(re.isAudio() || re.isVideo())
-            intent = new Intent(c, MediaAcitvity.class);
+            intent = new Intent(c, MediaViewerAcitvity.class);
         else if(re.is3D())
-            intent= new Intent(c, ViewerActivity.class);
+            intent= new Intent(c, ModelViewerActivity.class);
         else if(re.isImage())
-            intent= new Intent(c, ViewerActivity.class);
+            intent= new Intent(c, ImageViewerActivity.class);
 
         intent.putExtra("resource", re);
 
         return intent;
     }
-    //ViewerActivity.class
+
+    public static Intent getInfoIntent(Context c, Resource re)
+    {
+        Intent intent = new Intent(c, InfoActivity.class);
+        intent.putExtra("resource", re);
+
+        return intent;
+    }
+
+
+    public static Intent getMapIntent(Context c, Game g)
+    {
+        Intent intent = new Intent(c, ImageViewerActivity.class);
+        intent.putExtra("map", g.getName()+"_map");
+        return intent;
+    }
+    //ImageViewerActivity.class
 }

+ 7 - 1
app/src/main/java/app/ara/utils/ResourceManager.java

@@ -76,6 +76,12 @@ public class ResourceManager implements Serializable{
             if(mResourcesLeft.get(i).getName().compareTo(name)==0)
                 return mResourcesLeft.get(i);
         }
+
+        for(int i=0; i<m_otherResources.size(); i++)
+        {
+            if(m_otherResources.get(i).getName().compareTo(name)==0)
+                return m_otherResources.get(i);
+        }
         return null;
     }
 
@@ -87,7 +93,7 @@ public class ResourceManager implements Serializable{
     public ArrayList<Resource> getResourceLeftByName(ArrayList<String> names)
     {
         ArrayList<Resource> res = new ArrayList<Resource>();
-        for(int i=0; i< names.size(); i++) {
+        for(int i=names.size()-1; i>=0; i--) {
             res.add(getResourceLeftByName(names.get(i)));
         }
         return res;

+ 7 - 2
app/src/main/java/app/ara/utils/app/brest/game/Area.java

@@ -38,7 +38,8 @@ public class Area  implements Serializable {
             for(int i=0; i<ja.length(); i++) {
                 mPlaces.add(new Place(ja.getJSONObject(i)));
             }
-            for(int i=0; i<mResourceName.size(); i++) mResource.add(new Resource(mResourceName.get(i), act));
+            for(int i=0; i<mResourceName.size(); i++)
+                mResource.add(new Resource(mResourceName.get(i), act));
         } catch (JSONException e) {
             e.printStackTrace();
         }
@@ -66,7 +67,11 @@ public class Area  implements Serializable {
     public int getStage()
     {
         if(mResource==null || mResource.size()<=0) return -1;
-        return mResource.get(0).getStage();
+        int max=0;
+        for(int i=0; i<mResource.size(); i++)
+            if(mResource.get(i).getStage()>max)
+                max=mResource.get(i).getStage();
+        return max;
     }
 
     public Shape getShape() {

+ 13 - 1
app/src/main/java/app/ara/utils/app/brest/game/Game.java

@@ -132,6 +132,7 @@ public class Game  implements Serializable {
     public boolean nextStage()
     {
         mCurrentStage++;
+        Log.e("------------", "Is Finished : "+mCurrentStage+" > "+mNStages+" = "+(mCurrentStage>mNStages));
         if(mCurrentStage>mNStages) return true;
 
         loadStageAreasResources();
@@ -191,7 +192,8 @@ public class Game  implements Serializable {
                     removeArea(j);
                 }
             }
-            pickResource(r.get(i).getResource(0).getName());
+            for(int k=0; k<r.get(i).count(); k++)
+                pickResource(r.get(i).getResource(k).getName());
         }
 
         //retourne vrai si l'etape est finie
@@ -573,4 +575,14 @@ public class Game  implements Serializable {
         return mResources.hasResource(name);
     }
 
+
+    public void printStage()
+    {
+        Log.e("---------------", "Stage:"+getCurrentStage());
+        for(int i=0; i<mResources.getResourceLeft().size(); i++) {
+            Log.e("---------------", "   '" + mResources.getResourceLeft().get(i).getName() + "'");
+
+        }
+
+    }
 }

+ 1 - 1
app/src/main/java/app/ara/utils/app/brest/game/Resource.java

@@ -126,7 +126,7 @@ public class Resource implements Serializable {
         if(m3DModel==null)
         {
             Log.e("resource.get3Model", "app.brest.testmin3d:raw/"+mName+"_obj");
-            IParser myParser = Parser.createParser(Parser.Type.OBJ,  mName+"_obj",true);
+            IParser myParser = Parser.createParser(context, Parser.Type.OBJ,  mName+"_obj",true);
             myParser.parse();
 
             m3DModel = myParser.getParsedObject();

+ 13 - 16
app/src/main/java/app/ara/utils/files/FileManager.java

@@ -1,6 +1,7 @@
 package app.ara.utils.files;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.AssetManager;
 import android.graphics.Bitmap;
@@ -22,22 +23,18 @@ public class FileManager {
     {
         m_act=a;
         m_asset=a.getAssets();
-
     }
 
     private static boolean isInit() throws Exception {
-        if(m_asset==null)
-        {
-            throw new Exception("Erreur FileManager non initialisee");
-        }
+
         return true;
     }
 
-    public static InputStream openFile(String path) throws Exception {
+    public static InputStream openFile(Context a, String path) throws Exception {
         isInit();
         InputStream is = null;
         try {
-            is = m_asset.open(path);
+            is = a.getAssets().open(path);
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -63,22 +60,22 @@ public class FileManager {
             ".wav", ".WAV",
             ".ogg", ".OGG"};
 
-    private static InputStream testIimage(String path) throws Exception {
+    private static InputStream testIimage(Context a,String path) throws Exception {
         for(int i=0; i<IMG_EXT.length; i++)
         {
-            InputStream is = openFile(path+IMG_EXT[i]);
+            InputStream is = openFile(a, path+IMG_EXT[i]);
             if(is!=null)
                 return is;
         }
         return null;
     }
 
-    public static Bitmap openImage(String path) throws Exception {
+    public static Bitmap openImage(Context a,String path) throws Exception {
         isInit();
         InputStream is = null;
         Bitmap bitmap = null;
         try {
-            is = testIimage(path);
+            is = testIimage(a, path);
             bitmap = BitmapFactory.decodeStream(is);
         } catch (IOException e) {
             e.printStackTrace();
@@ -86,19 +83,19 @@ public class FileManager {
         return bitmap;
     }
 
-    public static Uri getUri(String path) throws Exception {
+    public static Uri getUri(Context a, String path) throws Exception {
         isInit();
         return Uri.parse("file:///android_asset/" + path);
     }
 
 
-    private static AssetFileDescriptor testVideo(String path) {
+    private static AssetFileDescriptor testVideo(Context a,String path) {
         for(int i=0; i<MEDIA_EXT.length; i++)
         {
             AssetFileDescriptor is = null;
             Log.e("________", "Start");
             try {
-                is = m_asset.openFd(path+MEDIA_EXT[i]);
+                is = a.getAssets().openFd(path+MEDIA_EXT[i]);
 
                 Log.e("________", "Recherche de vidéo: '"+path+MEDIA_EXT[i]+"' OK");
                 if(is!=null)
@@ -111,9 +108,9 @@ public class FileManager {
         return null;
     }
 
-    public static AssetFileDescriptor getAfdMedia(String path)
+    public static AssetFileDescriptor getAfdMedia(Context a, String path)
     {
-        return testVideo(path);
+        return testVideo(a, path);
     }
 
 }

+ 1 - 1
app/src/main/java/app/ara/utils/files/JSONAssetsManager.java

@@ -16,7 +16,7 @@ public class JSONAssetsManager {
         {
             InputStream inputStream = null;
             try {
-                inputStream = FileManager.openFile(name);
+                inputStream = FileManager.openFile(context, name);
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 6 - 0
app/src/main/java/app/ara/utils/geometry/GPSPoint.java

@@ -108,6 +108,12 @@ public class GPSPoint extends app.ara.utils.geometry.Point  implements Serializa
         if(dy>0) return -Math.atan(dx/dy)*180/Math.PI;
         else return 180-Math.atan(dx/dy)*180/Math.PI;
     }
+
+    public String toString()
+    {
+        return "("+mX+", "+mY+" : "+mAccuracy+")";
+
+    }
     /*
             Opposé
         _________________

+ 14 - 7
app/src/main/java/min3d/parser/AParser.java

@@ -16,6 +16,8 @@ import min3d.core.Object3dContainer;
 import min3d.vos.Color4;
 import min3d.vos.Number3d;
 import min3d.vos.Uv;
+
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
@@ -43,8 +45,11 @@ public abstract class AParser implements IParser {
 	protected HashMap<String, Material> materialMap;
 	protected InputStream mStream=null;
 	protected String 	  mPath;
-	public AParser()
+	protected Context mContext=null;
+
+	public AParser(Context a)
 	{
+		mContext=a;
 		vertices = new ArrayList<Number3d>();
 		texCoords = new ArrayList<Uv>();
 		normals = new ArrayList<Number3d>();
@@ -54,9 +59,10 @@ public abstract class AParser implements IParser {
 		materialMap = new HashMap<String, Material>();
 	}
 
-	public AParser(Resources resources, String resourceID, Boolean generateMipMap)
+	public AParser(Context a, Resources resources, String resourceID, Boolean generateMipMap)
 	{
-		this();
+		this(a);
+		mContext=a;
 		this.resources = resources;
 		this.resourceID = resourceID;
 		if (resourceID.indexOf(":") > -1)
@@ -64,12 +70,13 @@ public abstract class AParser implements IParser {
 		this.generateMipMap = generateMipMap;
 	}
 
-	public AParser(String path, Boolean generateMipMap)
+	public AParser(Context a, String path, Boolean generateMipMap)
 	{
-		this();
+		this(a);
+		mContext=a;
 		mPath=path;
 		try {
-			mStream= FileManager.openFile(path);
+			mStream= FileManager.openFile(a,path);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -231,7 +238,7 @@ public abstract class AParser implements IParser {
 				}else
 				{
 					try {
-						b=FileManager.openImage(ba.resourceID);
+						b=FileManager.openImage(mContext, ba.resourceID);
 					} catch (Exception e) {
 						e.printStackTrace();
 					}

+ 6 - 4
app/src/main/java/min3d/parser/MD2Parser.java

@@ -12,6 +12,8 @@ import min3d.animation.AnimationObject3d;
 import min3d.animation.KeyFrame;
 import min3d.vos.Number3d;
 import min3d.vos.Uv;
+
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.util.Log;
@@ -21,13 +23,13 @@ public class MD2Parser extends AParser implements IParser {
 	private String currentTextureName;
 	private KeyFrame[] frames;
 
-	public MD2Parser(Resources resources, String resourceID, boolean generateMipMap) {
-		super(resources, resourceID, generateMipMap);
+	public MD2Parser(Context c, Resources resources, String resourceID, boolean generateMipMap) {
+		super(c, resources, resourceID, generateMipMap);
 	}
 
 
-	public MD2Parser(String is, boolean generateMipMap) {
-		super(is, generateMipMap);
+	public MD2Parser(Context c, String is, boolean generateMipMap) {
+		super(c, is, generateMipMap);
 	}
 
 

+ 6 - 4
app/src/main/java/min3d/parser/Max3DSParser.java

@@ -9,6 +9,8 @@ import min3d.Shared;
 import min3d.core.Object3dContainer;
 import min3d.vos.Number3d;
 import min3d.vos.Uv;
+
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.util.Log;
@@ -32,13 +34,13 @@ public class Max3DSParser extends AParser implements IParser {
 	private boolean endReached;
 	private String currentObjName;
 
-	public Max3DSParser(Resources resources, String resourceID, boolean generateMipMap) {
-		super(resources, resourceID, generateMipMap);
+	public Max3DSParser(Context c, Resources resources, String resourceID, boolean generateMipMap) {
+		super(c, resources, resourceID, generateMipMap);
 	}
 
 
-	public Max3DSParser(String is, boolean generateMipMap) {
-		super(is, generateMipMap);
+	public Max3DSParser(Context c, String is, boolean generateMipMap) {
+		super(c,is, generateMipMap);
 	}
 
 	@Override

+ 7 - 5
app/src/main/java/min3d/parser/ObjParser.java

@@ -14,6 +14,8 @@ import min3d.core.Object3dContainer;
 import min3d.vos.Color4;
 import min3d.vos.Number3d;
 import min3d.vos.Uv;
+
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.util.Log;
@@ -46,14 +48,14 @@ public class ObjParser extends AParser implements IParser {
 	 * @param resources
 	 * @param resourceID
 	 */
-	public ObjParser(Resources resources, String resourceID, boolean generateMipMap) {
-		super(resources, resourceID, generateMipMap);
+	public ObjParser(Context a, Resources resources, String resourceID, boolean generateMipMap) {
+		super(a, resources, resourceID, generateMipMap);
 		System.out.println("Parser:"+resourceID);
 		System.err.println("Parser:"+resourceID);
 	}
 
-	public ObjParser(String is, boolean generateMipMap) {
-		super(is, generateMipMap);
+	public ObjParser(Context a, String is, boolean generateMipMap) {
+		super(a, is, generateMipMap);
 		System.out.println("Parser:"+resourceID);
 		System.err.println("Parser:"+resourceID);
 	}
@@ -189,7 +191,7 @@ public class ObjParser extends AParser implements IParser {
 					resourceID.toString(), null, null));
 		}else {
 			try {
-				fileIn = FileManager.openFile(packageID+libID);
+				fileIn = FileManager.openFile(mContext, packageID+libID);
 			} catch (Exception e) {
 				e.printStackTrace();
 			}

+ 9 - 8
app/src/main/java/min3d/parser/Parser.java

@@ -1,5 +1,6 @@
 package min3d.parser;
 
+import android.content.Context;
 import android.content.res.Resources;
 
 import java.io.InputStream;
@@ -25,31 +26,31 @@ public class Parser {
 	 * @param resourceID
 	 * @return
 	 */
-	public static IParser createParser(Type type, Resources resources, String resourceID, boolean generateMipMap)
+	public static IParser createParser(Context c, Type type, Resources resources, String resourceID, boolean generateMipMap)
 	{
 		switch(type)
 		{
 			case OBJ:
-				return new ObjParser(resources, resourceID, generateMipMap);
+				return new ObjParser(c,resources, resourceID, generateMipMap);
 			case MAX_3DS:
-				return new Max3DSParser(resources, resourceID, generateMipMap);
+				return new Max3DSParser(c,resources, resourceID, generateMipMap);
 			case MD2:
-				return new MD2Parser(resources, resourceID, generateMipMap);
+				return new MD2Parser(c,resources, resourceID, generateMipMap);
 		}
 		
 		return null;
 	}
 
-	public static IParser createParser(Type type, String is, boolean generateMipMap)
+	public static IParser createParser(Context c, Type type, String is, boolean generateMipMap)
 	{
 		switch(type)
 		{
 			case OBJ:
-				return new ObjParser(is, generateMipMap);
+				return new ObjParser(c,is, generateMipMap);
 			case MAX_3DS:
-				return new Max3DSParser(is, generateMipMap);
+				return new Max3DSParser(c,is, generateMipMap);
 			case MD2:
-				return new MD2Parser(is, generateMipMap);
+				return new MD2Parser(c,is, generateMipMap);
 		}
 
 		return null;

+ 23 - 0
app/src/main/res/layout/activity_credits.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    tools:context="app.ara.activities.CreditsActivity">
+
+    <ScrollView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/scrollView3" >
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="New Text"
+            android:id="@+id/tv_credits" />
+    </ScrollView>
+</RelativeLayout>

+ 50 - 0
app/src/main/res/layout/activity_info.xml

@@ -0,0 +1,50 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ImageViewerActivity"
+    android:background="#000000"
+    android:id="@+id/rl_screen">
+
+    <!-- The primary full-screen view. This can be replaced with whatever view
+         is needed to present your content, e.g. VideoView, SurfaceView,
+         TextureView, etc. -->
+
+    <!-- This FrameLayout insets its children based on system windows using
+         android:fitsSystemWindows. -->
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/frame_viewer"
+        android:layout_below="@+id/title">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:text="Medium Text"
+            android:id="@+id/tv_comment"
+            android:layout_gravity="center"
+            android:textColor="#33b5e5"
+            android:textSize="20dp"
+            android:visibility="visible" />
+    </FrameLayout>
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:text="Large Text"
+        android:id="@+id/title"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
+        android:textColor="@color/dull_2"
+        android:textStyle="bold"
+        android:textSize="25dp"
+        android:textAlignment="center" />
+
+</RelativeLayout>

+ 2 - 2
app/src/main/res/layout/activity_media.xml

@@ -7,13 +7,13 @@
     android:paddingLeft="@dimen/activity_horizontal_margin"
     android:paddingRight="@dimen/activity_horizontal_margin"
     android:paddingTop="@dimen/activity_vertical_margin"
-    tools:context="app.ara.activities.MediaAcitvity"
+    tools:context=".MediaViewerAcitvity"
     android:background="#000000">
 
     <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="Informations"
+        android:text="@string/informations"
         android:id="@+id/info"
         android:layout_alignParentBottom="true"
         android:layout_alignParentLeft="true"

+ 50 - 0
app/src/main/res/layout/activity_model_viewer.xml

@@ -0,0 +1,50 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ImageViewerActivity"
+    android:background="#000000"
+    android:id="@+id/rl_screen">
+
+    <!-- The primary full-screen view. This can be replaced with whatever view
+         is needed to present your content, e.g. VideoView, SurfaceView,
+         TextureView, etc. -->
+
+    <!-- This FrameLayout insets its children based on system windows using
+         android:fitsSystemWindows. -->
+
+    <Button
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/informations"
+        android:id="@+id/info"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:onClick="onClickInfo" />
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/info"
+        android:id="@+id/frame_viewer"
+        android:layout_below="@+id/title">
+
+    </FrameLayout>
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:text="Large Text"
+        android:id="@+id/title"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
+        android:textColor="@color/dull_5"
+        android:textStyle="bold"
+        android:textSize="25dp"
+        android:textAlignment="center" />
+
+</RelativeLayout>

+ 10 - 0
app/src/main/res/layout/activity_new_menu.xml

@@ -11,4 +11,14 @@
     android:id="@+id/menu_root"
     android:background="#000000">
 
+    <Button
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Credits"
+        android:id="@+id/button3"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentEnd="true"
+        android:onClick="onCredits"
+        android:background="#00000000" />
 </RelativeLayout>

+ 2 - 3
app/src/main/res/layout/activity_resource_list.xml

@@ -25,14 +25,13 @@
         android:textSize="30dp" />
 
     <ListView
-        android:layout_width="347dp"
+        android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:id="@+id/list_layout"
         android:scrollingCache="true"
         android:choiceMode="singleChoice"
         android:fastScrollEnabled="true"
         android:fastScrollAlwaysVisible="true"
-        android:longClickable="false"
-        android:layout_marginLeft="72px" />
+        android:longClickable="false" />
 
 </LinearLayout>

+ 6 - 16
app/src/main/res/layout/activity_viewer.xml

@@ -2,7 +2,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="app.ara.activities.ViewerActivity"
+    tools:context=".ImageViewerActivity"
     android:background="#000000"
     android:id="@+id/rl_screen">
 
@@ -16,8 +16,8 @@
     <Button
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="Informations"
-        android:id="@+id/button_info"
+        android:text="@string/informations"
+        android:id="@+id/info"
         android:layout_alignParentBottom="true"
         android:layout_centerHorizontal="true"
         android:onClick="onClickInfo" />
@@ -25,9 +25,9 @@
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_above="@+id/button_info"
+        android:layout_above="@+id/info"
         android:id="@+id/frame_viewer"
-        android:layout_below="@+id/b_title">
+        android:layout_below="@+id/title">
 
         <ImageView
             android:layout_width="fill_parent"
@@ -40,16 +40,6 @@
             android:focusable="true"
             android:visibility="visible" />
 
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="Medium Text"
-            android:id="@+id/tv_comment"
-            android:layout_gravity="center"
-            android:textColor="#33b5e5"
-            android:textSize="20dp"
-            android:visibility="invisible" />
     </FrameLayout>
 
     <TextView
@@ -57,7 +47,7 @@
         android:layout_height="wrap_content"
         android:textAppearance="?android:attr/textAppearanceLarge"
         android:text="Large Text"
-        android:id="@+id/b_title"
+        android:id="@+id/title"
         android:layout_alignParentTop="true"
         android:layout_alignParentRight="true"
         android:layout_alignParentEnd="true"

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -77,4 +77,6 @@
     <string name="gps_stub">-1.6552946 48.0210506;-1.6518083 48.0207201;-1.6584931 48.0200556;-1.6624308 48.0181617;-1.6538682 48.0224585;-1.6512439 48.0208696;-1.6510127 48.0213842;-1.6462995 48.0187739;-1.6507205 48.0179446;</string>
     <string name="gps_stub_se">-1.6552002 48.0214484;-1.6556532 48.0204598;-1.6552002 48.0214484;</string>
     <string name="title_activity_puzzle">PuzzleActivity</string>
+
+    <string name="informations">Plus</string>
 </resources>

+ 30 - 0
build.gradle

@@ -0,0 +1,30 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+
+buildscript {
+    repositories {
+        jcenter()
+        mavenCentral()
+        maven { url "https://jitpack.io" }
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:2.1.2'
+        classpath 'com.github.chrisbanes:PhotoView:1.3.0'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+
+allprojects {
+    repositories {
+        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+        jcenter()
+        maven { url "https://jitpack.io" }
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}