Bläddra i källkod

Internationalisation

gautrais 7 år sedan
förälder
incheckning
3341b4ed3d
35 ändrade filer med 533 tillägg och 221 borttagningar
  1. 7 8
      app/app.iml
  2. 5 9
      app/src/main/AndroidManifest.xml
  3. 12 18
      app/src/main/assets/game_medium
  4. 9 4
      app/src/main/java/macampcorp/macamp/activities/BombActivity.java
  5. 9 0
      app/src/main/java/macampcorp/macamp/activities/CreditsActivity.java
  6. 73 0
      app/src/main/java/macampcorp/macamp/activities/EndActivity.java
  7. 92 11
      app/src/main/java/macampcorp/macamp/activities/HostActivity.java
  8. 0 66
      app/src/main/java/macampcorp/macamp/activities/LoadingActivity.java
  9. 18 20
      app/src/main/java/macampcorp/macamp/activities/PermissionActivity.java
  10. 19 8
      app/src/main/java/macampcorp/macamp/activities/TutoActivity.java
  11. 6 1
      app/src/main/java/macampcorp/macamp/activities/fragments/ChallengeFragment.java
  12. 1 1
      app/src/main/java/macampcorp/macamp/activities/fragments/QCMFragment.java
  13. 7 12
      app/src/main/java/macampcorp/macamp/activities/fragments/QuestionFragment.java
  14. 1 1
      app/src/main/java/macampcorp/macamp/activities/viewers/ImageViewerActivity.java
  15. 12 1
      app/src/main/java/macampcorp/macamp/game/Bomb.java
  16. 17 11
      app/src/main/java/macampcorp/macamp/game/Event.java
  17. 22 1
      app/src/main/java/macampcorp/macamp/game/Game.java
  18. 11 1
      app/src/main/java/macampcorp/macamp/game/Stage.java
  19. 3 2
      app/src/main/java/macampcorp/macamp/game/scheduler/EventTask.java
  20. 20 6
      app/src/main/java/macampcorp/macamp/game/scheduler/Scheduler.java
  21. 15 1
      app/src/main/java/macampcorp/macamp/game/scheduler/SpecialTask.java
  22. 1 0
      app/src/main/java/macampcorp/macamp/game/scheduler/Task.java
  23. 12 0
      app/src/main/java/macampcorp/macamp/lang/Locale.java
  24. 29 0
      app/src/main/java/macampcorp/macamp/utils/Android.java
  25. 6 4
      app/src/main/res/layout/activity_credits.xml
  26. 74 0
      app/src/main/res/layout/activity_end.xml
  27. 5 5
      app/src/main/res/layout/activity_host.xml
  28. 0 22
      app/src/main/res/layout/activity_loading.xml
  29. 1 1
      app/src/main/res/layout/activity_media.xml
  30. 1 1
      app/src/main/res/layout/activity_permission.xml
  31. 1 1
      app/src/main/res/layout/activity_resource_list.xml
  32. 3 3
      app/src/main/res/layout/activity_tuto.xml
  33. 2 1
      app/src/main/res/layout/fragment_bomb.xml
  34. 1 1
      app/src/main/res/layout/fragment_qrcode.xml
  35. 38 0
      app/src/main/res/values/strings.xml

+ 7 - 8
app/app.iml

@@ -49,13 +49,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
@@ -63,6 +56,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
@@ -98,7 +98,6 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-main-apk-res" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifest-checker" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />

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

@@ -9,11 +9,6 @@
     <uses-feature android:name="android.hardware.camera2.full" />
     <uses-feature android:name="android.hardware.camera.autofocus" />
 
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
     <application
         android:allowBackup="true"
@@ -31,8 +26,9 @@
             android:label="@string/title_activity_resource_list"
             android:screenOrientation="portrait"
             android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
-        <activity android:name=".PermissionActivity"
-                    android:theme="@style/AppTheme.NoActionBar.Fullscreen" >
+        <activity
+            android:name=".PermissionActivity"
+            android:theme="@style/AppTheme.NoActionBar.Fullscreen">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -57,9 +53,9 @@
             android:name=".ErrorActivity"
             android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
         <activity
-            android:name=".LoadingActivity"
+            android:name=".TutoActivity"
             android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
-        <activity android:name=".TutoActivity"
+        <activity android:name=".EndActivity"
             android:theme="@style/AppTheme.NoActionBar.Fullscreen" />
     </application>
 

+ 12 - 18
app/src/main/assets/game_medium

@@ -5,24 +5,6 @@
 	"name" : "Intro",
 	"challenges" : [
 
-
-    			{
-    				"type" : "Question",
-    				"name" : "accueilQuestion3",
-    				"resource" : "accueil",
-    				"question" : "Comment est votre blanquette ?\nDemandez donc aux personnes les mieux renseignés de la bibliothèque ET de la MJC. Et au passage, la plaquette de la MJC et le facebook de la bibliothèque pourrait être utile !",
-    				"answer" : "1"
-    			},
-    			{
-    				"type" : "Question",
-    				"name" : "accueilQuestion2",
-    				"resource" : "accueil",
-    				"question" : "Comment est votre blanquette ?\nDemandez donc aux personnes les mieux renseignés de la bibliothèque ET de la MJC. Et au passage, la plaquette de la MJC et le facebook de la bibliothèque pourrait être utile !",
-    				"answer" : "2"
-    			}
-
-
-
 	],
 	"resources" : ["intro"],
 	"event_end" : [ 
@@ -449,6 +431,18 @@
 		],
 	"resources" : []
 }	],
+     "win" : {
+         "name" : "win",
+         "resources" : ["intro"],
+          "challenges" : [],
+         "event_start" : {"method" : "alert", "args" : ["T'as gagné u !"] }
+     },
+      "loose" : {
+          "name" : "loose",
+          "resources" : ["intro"],
+          "challenges" : [],
+          "event_start" : {"method" : "alert", "args" : ["T'as perd u !"] }
+      },
 	"credits" : 
 	{
 		"text" : "Par Fran\u00e7ois Gautrais !",

+ 9 - 4
app/src/main/java/macampcorp/macamp/activities/BombActivity.java

@@ -11,12 +11,14 @@ import android.view.View;
 import android.widget.TextView;
 import android.widget.Toast;
 
+
 import java.util.Timer;
 import java.util.TimerTask;
 
 import macampcorp.macamp.game.Bomb;
 import macampcorp.macamp.game.Game;
 import macampcorp.macamp.game.scheduler.SpecialTask;
+import macampcorp.macamp.lang.Locale;
 
 public class BombActivity extends AppCompatActivity {
 
@@ -47,10 +49,10 @@ public class BombActivity extends AppCompatActivity {
                 mTvCar.setText(mGame.getBomb().getTimeBeforeBoom());
             }else
             {
+                mTimer.cancel();
                 mTvCar.setText("BOOM !");
                 mGame.getScheduler().clear();
                 mGame.getScheduler().append(SpecialTask.FINISHED_FAILED);
-                mTimer.cancel();
                 finish();
             }
         }
@@ -121,16 +123,19 @@ public class BombActivity extends AppCompatActivity {
         {
             if(mBomb.disarm(mTyped))
             { //code bon
+                mTimer.cancel();
+                mGame.getScheduler().clear();
                 mGame.getScheduler().append(SpecialTask.FINISHED_SUCESS);
                 setResult(0);
                 finish();
-                Toast.makeText(this, "OK !", Toast.LENGTH_LONG).show();
+                Toast.makeText(this, R.string.toast_ok, Toast.LENGTH_LONG).show();
             }else
             { //code mauvais
-                Toast.makeText(this, "Raté !", Toast.LENGTH_LONG).show();
+                Toast.makeText(this,  R.string.toast_fail, Toast.LENGTH_LONG).show();
+                mGame.getBomb().addTime(-100);
             }
         }else
-        Toast.makeText(this, "Mauvaise longeur !", Toast.LENGTH_SHORT).show();
+        Toast.makeText(this, R.string.toast_length, Toast.LENGTH_SHORT).show();
     }
 
     @Override

+ 9 - 0
app/src/main/java/macampcorp/macamp/activities/CreditsActivity.java

@@ -1,5 +1,8 @@
 package macampcorp.macamp.activities;
 
+import android.app.Activity;
+import android.app.IntentService;
+import android.content.Intent;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.text.Html;
@@ -47,4 +50,10 @@ public class CreditsActivity extends AppCompatActivity {
     }
 
     public static final int REQUEST_CODE = 23;
+
+    public static void start(Activity v)
+    {
+        Intent in = new Intent(v, CreditsActivity.class);
+        v.startActivityForResult(in, REQUEST_CODE);
+    }
 }

+ 73 - 0
app/src/main/java/macampcorp/macamp/activities/EndActivity.java

@@ -0,0 +1,73 @@
+package macampcorp.macamp.activities;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.text.Html;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import macampcorp.macamp.game.Game;
+import macampcorp.macamp.utils.Android;
+
+public class EndActivity extends AppCompatActivity {
+    public static final int REQUEST_CODE=1011;
+
+    protected boolean mWon=false;
+    protected TextView mText;
+    protected Button mRetry;
+    protected LinearLayout mRoot;
+
+    protected static final String mTextWin = "Bien joué";
+    protected static final String mTextLoose = "Perdu !";
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_end);
+        mWon=getIntent().getBooleanExtra("won", false);
+        mRetry = findViewById(R.id.btn_retry);
+        mRoot = findViewById(R.id.ll_end);
+
+        mText=findViewById(R.id.tv_end);
+        if(mWon)
+        {
+            mText.setText(Html.fromHtml(mTextWin));
+            mRetry.setVisibility(View.GONE);
+        }
+        else
+        {
+            mText.setText(Html.fromHtml(mTextLoose));
+            mRetry.setVisibility(View.VISIBLE);
+        }
+    }
+
+    public void onCredits(View v)
+    {
+        CreditsActivity.start(this);
+    }
+
+    public void onQuit(View v)
+    {
+        Game.erase(this);
+        Game.setGame(null);
+        finish();
+    }
+
+    public void onRetry(View v)
+    {
+        HostActivity.startGame(this, true);
+    }
+
+    public static void start(Activity a, boolean win)
+    {
+        Intent it = new Intent(a, EndActivity.class);
+        it.putExtra("won", win);
+        a.startActivityForResult(it, REQUEST_CODE);
+    }
+}

+ 92 - 11
app/src/main/java/macampcorp/macamp/activities/HostActivity.java

@@ -14,6 +14,7 @@ import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import java.util.Timer;
 import java.util.TimerTask;
@@ -26,6 +27,7 @@ import macampcorp.macamp.activities.fragments.QuestionFragment;
 import macampcorp.macamp.activities.viewers.ImageViewerActivity;
 import macampcorp.macamp.activities.viewers.MediaViewerAcitvity;
 import macampcorp.macamp.activities.viewers.ResourceListActivity;
+import macampcorp.macamp.game.Bomb;
 import macampcorp.macamp.game.Game;
 import macampcorp.macamp.game.Resource;
 import macampcorp.macamp.game.Stage;
@@ -33,7 +35,9 @@ import macampcorp.macamp.game.challenges.Challenge;
 import macampcorp.macamp.game.Indice;
 import macampcorp.macamp.game.scheduler.Scheduler;
 import macampcorp.macamp.game.scheduler.SpecialTask;
+import macampcorp.macamp.lang.Locale;
 import macampcorp.macamp.utils.AndroidResources;
+import macampcorp.macamp.utils.L;
 
 
 public class HostActivity extends Activity implements ChallengeFragment.OnFragmentInteractionListener {
@@ -54,6 +58,11 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
 
     private static final int ACTIVITY_RESULT_RESOURCE_VIEWER_SCHEDULER = 2;
 
+    public String _(int x)
+    {
+        return  getResources().getString(x);
+    }
+
     private Timer mTimer;
     private Runnable mTimerTick = new Runnable() {
         public void run() {
@@ -62,9 +71,9 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
                 mUITimeLeft.setText(mGame.getBomb().getTimeBeforeBoom());
             }else
             {
+                mTimer.cancel();
                 mUITimeLeft.setText("BOOM !");
                 onExplose();
-                mTimer.cancel();
             }
         }
     };
@@ -74,6 +83,8 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
         TutoActivity.start(this);
     }
 
+
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -241,13 +252,15 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
         {
             Indice x = mCurrentFragment.getChallenge().peakNextIndice();
             int c = Math.round(x.getPenality()*60);
-            String out = ""+c+" secondes";
+            String out = ""+c+" "+_(R.string.secondes);
             if(c>=60)
-                out=(c/60)+" minutes et "+(c%60)+" secondes";
+                out=(c/60)+" "+_(R.string.secondes)+" "+
+                        _(R.string.and)+" "+(c%60)+" "+_(R.string.minutes);
 
             new AlertDialog.Builder(this)
-                    .setTitle("Êtes vous sûre ?")
-                    .setMessage("Cet indice vous coutera "+out+", voulez vous continuer ?")
+                    .setTitle(_(R.string.dialog_sure_title))
+                    .setMessage(_(R.string.dialog_sure_pre)+out+
+                                _(R.string.dialog_sure_post))
                     .setNegativeButton(android.R.string.no,  null)
                     .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface arg0, int arg1) {
@@ -299,18 +312,20 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        int x =23;
-        x++;
         switch (requestCode)
         {
             case CreditsActivity.REQUEST_CODE:
             case MediaViewerAcitvity.REQUEST_CODE:
             case BombActivity.REQUEST_CODE:
             case ImageViewerActivity.REQUEST_CODE:
+            case TutoActivity.REQUEST_CODE:
                 mGame.getScheduler().schedule(this, mGame);
                 save();
             break;
 
+            case EndActivity.REQUEST_CODE:
+                finish();
+                break;
 
         }
     }
@@ -344,16 +359,40 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
         return mCurrentChallenge;
     }
 
+
+
     public void setFinished()
     {
+        mTimer.cancel();
+        mGame.getScheduler().clear();
+        L.error("__SCHEDULER_DEBUG__", "Win");
+        L.error("__SCHEDULER_DEBUG__","clear:"+ mGame.getScheduler().getTaskListString());
+        mGame.getScheduler().append(mGame.getOnWin().getStartEvent());
+        L.error("__SCHEDULER_DEBUG__", "start:"+mGame.getScheduler().getTaskListString()+ " -> "+mGame.getOnLoose().getStartEvent().size());
+        mGame.getScheduler().append(mGame.getOnWin().getResources());
+        L.error("__SCHEDULER_DEBUG__", "res:"+mGame.getScheduler().getTaskListString());
+        mGame.getScheduler().append(mGame.getOnWin().getEndEvent());
+        L.error("__SCHEDULER_DEBUG__", "end:"+mGame.getScheduler().getTaskListString());
+        mGame.getScheduler().append(SpecialTask.END_SUCCESS);
+        mGame.getScheduler().schedule(this, mGame);
 
     }
 
     public void setFailed()
     {
-        Intent intent = new Intent(this, CreditsActivity.class);
-        startActivity(intent);
-        finish();
+        mTimer.cancel();
+        mGame.getScheduler().clear();
+        L.error("__SCHEDULER_DEBUG__", "Loose");
+        L.error("__SCHEDULER_DEBUG__","clear:"+ mGame.getScheduler().getTaskListString());
+        mGame.getScheduler().append(mGame.getOnLoose().getStartEvent());
+        L.error("__SCHEDULER_DEBUG__", "start:"+mGame.getScheduler().getTaskListString()+ " -> "+mGame.getOnLoose().getStartEvent().size());
+        mGame.getScheduler().append(mGame.getOnLoose().getResources());
+        L.error("__SCHEDULER_DEBUG__", "res:"+mGame.getScheduler().getTaskListString());
+        mGame.getScheduler().append(mGame.getOnLoose().getEndEvent());
+        L.error("__SCHEDULER_DEBUG__", "end:"+mGame.getScheduler().getTaskListString());
+        mGame.getScheduler().append(SpecialTask.END_FAILED);
+        mGame.getScheduler().schedule(this, mGame);
+
     }
 
     public Activity getActivity() {
@@ -369,7 +408,6 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
         mGame.save(this);
     }
 
-
     @Override
     public void onBackPressed()
     {
@@ -384,4 +422,47 @@ public class HostActivity extends Activity implements ChallengeFragment.OnFragme
     }
 
 
+
+    public static void startGame(Activity a)
+    {
+        startGame(a,false, "game_medium");
+    }
+
+    public static void startGame(Activity a, boolean b)
+    {
+        startGame(a,b, "game_medium");
+    }
+
+
+    public static void startGame(Activity a, String b)
+    {
+        startGame(a,false, b);
+    }
+
+
+    public static void startGame(Activity a, boolean erase, String file)
+    {
+        if(erase)
+        {
+            Game.erase(a);
+            Game.setGame(null);
+        }
+
+        if(Game.game()==null)
+        {
+            Game g = Game.load(a);
+            if (g != null ) {
+                Game.setGame(g);
+                Toast.makeText(a, R.string.game_loading, Toast.LENGTH_SHORT).show();
+            } else {
+                Game game = new Game(file, a);
+                Game.setGame(game);
+                Toast.makeText(a, R.string.game_new, Toast.LENGTH_SHORT).show();
+            }
+        }
+
+        Intent intent = new Intent(a, HostActivity.class);
+        a.startActivityForResult(intent, HostActivity.REQUEST_CODE);
+    }
+
 }

+ 0 - 66
app/src/main/java/macampcorp/macamp/activities/LoadingActivity.java

@@ -1,66 +0,0 @@
-package macampcorp.macamp.activities;
-
-import android.content.Intent;
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.Toast;
-
-import macampcorp.macamp.game.Game;
-
-
-
-public class LoadingActivity extends AppCompatActivity {
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data){
-        if(requestCode==HostActivity.REQUEST_CODE)
-            finish();
-        else
-            startGame();
-    }
-
-
-    public void startGame()
-    {
-        Intent intent = new Intent(this, HostActivity.class);
-        startActivityForResult(intent, HostActivity.REQUEST_CODE);
-        finish();
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_loading);
-
-        //TutoActivity.start(this);
-        //return;
-
-        Game game=null;
-        if(Game.game()==null)
-        {
-            Game g = Game.load(this);
-            if (g != null ) {
-                game = g;
-                Game.setGame(game);
-                Toast.makeText(this, "Chargement", Toast.LENGTH_SHORT).show();
-            } else {
-                game = new Game("game_medium", this);
-                Game.setGame(game);
-                Toast.makeText(this, "Nouveau Jeu", Toast.LENGTH_SHORT).show();
-            }
-        }
-
-        startGame();
-
-
-    }
-
-    public void go(View v)
-    {
-        startGame();
-    }
-
-
-}

+ 18 - 20
app/src/main/java/macampcorp/macamp/activities/PermissionActivity.java

@@ -3,9 +3,12 @@ package macampcorp.macamp.activities;
 import android.Manifest;
 import android.app.Activity;
 import android.app.AlertDialog;
+import android.app.KeyguardManager;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.PowerManager;
 import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AppCompatActivity;
@@ -18,10 +21,11 @@ import java.util.ArrayList;
 
 import macampcorp.macamp.game.Game;
 import macampcorp.macamp.game.Resource;
+import macampcorp.macamp.lang.Locale;
 import macampcorp.macamp.utils.files.FileManager;
 
 public class PermissionActivity extends AppCompatActivity {
-    private int m_nPerm=3;
+    private int m_nPerm=1;
     static final int PERM_FINE_LOCATION=1337;
     static final int ALL_PERMISSIONS=1337;
     static final int PERM_CAMERA=1338;
@@ -56,21 +60,12 @@ public class PermissionActivity extends AppCompatActivity {
         }
 
 
-        if (ContextCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_FINE_LOCATION)
-                != PackageManager.PERMISSION_GRANTED) {
-            al.add(Manifest.permission.ACCESS_FINE_LOCATION);
-        } else m_nPerm--;
-
         if (ContextCompat.checkSelfPermission(this,   Manifest.permission.CAMERA)
                 != PackageManager.PERMISSION_GRANTED) {
             al.add(Manifest.permission.CAMERA);
         } else m_nPerm--;
 
 
-        if (ContextCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_COARSE_LOCATION)
-                != PackageManager.PERMISSION_GRANTED) {
-            al.add(Manifest.permission.ACCESS_COARSE_LOCATION);
-        } else m_nPerm--;
         try {
             if (al.size() > 0)
                 ActivityCompat.requestPermissions(this, al.toArray(new String[m_nPerm]), ALL_PERMISSIONS);
@@ -78,6 +73,10 @@ public class PermissionActivity extends AppCompatActivity {
             e.printStackTrace();
         }
 
+
+
+
+
     }
 
 
@@ -86,20 +85,18 @@ public class PermissionActivity extends AppCompatActivity {
         final Activity t = this;
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         // Add the buttons
-                builder.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
+                builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int id) {
-                        startGame();
+                        startGame(false);
                     }
                 });
-                builder.setNegativeButton("Non", new DialogInterface.OnClickListener() {
+                builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int id) {
-                        Game.erase(t);
-                        Game.setGame(null);
-                        startGame();
+                        startGame(true);
                     }
                 });
         // Set other dialog properties
-        builder.setMessage("Voulez vous continuer la partie ?");
+        builder.setMessage(R.string.toast_continue);
 
         // Create the AlertDialog
         AlertDialog dialog = builder.create();
@@ -126,15 +123,16 @@ public class PermissionActivity extends AppCompatActivity {
 
     }
 
-    public void startGame()
+    public void startGame(boolean  erase)
     {
-        Intent intent = new Intent(this, LoadingActivity.class);
-        startActivity(intent);
+        HostActivity.startGame(this, erase);
         finish();
     }
 
     public void onUnderstood(View v)
     {
+
+
         if(m_nPerm==0)
         {
             askForReset();

+ 19 - 8
app/src/main/java/macampcorp/macamp/activities/TutoActivity.java

@@ -1,5 +1,6 @@
 package macampcorp.macamp.activities;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -18,16 +19,20 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 
+import macampcorp.macamp.game.Game;
+import macampcorp.macamp.lang.Locale;
 import macampcorp.macamp.utils.files.FileManager;
 
 
 public class TutoActivity extends AppCompatActivity  {
+    public static final int REQUEST_CODE=1010;
     protected ImageView mImage;
     protected ArrayList<String> mPathList = new ArrayList<>();
     protected int mCurrent=0;
 
     protected Button mNext;
     protected Button mPrev;
+    protected long mTime=0;
 
     @Override
     protected void onCreate(Bundle savedInstanceState)  {
@@ -56,23 +61,29 @@ public class TutoActivity extends AppCompatActivity  {
         update();
     }
 
+    public void exit()
+    {
+        setResult(0);
+        finish();
+    }
+
     public void onPass(View v)
     {
         if(mCurrent<mPathList.size()-1)
         { //Si ce n''est pas le dernier on demande confirmation
             new AlertDialog.Builder(this)
-                    .setTitle("Passer le tutorial ?")
-                    .setMessage("Êtes-vous variment sûre de vouloir passer le tutorial. Il est important pour bien comprendre le fonctionnement du jeu... ")
+                    .setTitle(R.string.tuto_pass_title)
+                    .setMessage(R.string.no)
                     .setNegativeButton(android.R.string.no,  null)
                     .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface arg0, int arg1) {
-                           finish();
+                            exit();
                         }
                     }).create().show();
 
         }
         else
-            finish();
+            exit();
 
     }
 
@@ -91,8 +102,8 @@ public class TutoActivity extends AppCompatActivity  {
         if(mCurrent==0) mPrev.setVisibility(View.INVISIBLE);
         else mPrev.setVisibility(View.VISIBLE);
 
-        if(mCurrent==mPathList.size()-1) mNext.setText("OK");
-        else mNext.setText("Suivant");
+        if(mCurrent==mPathList.size()-1) mNext.setText(R.string.btn_ok);
+        else mNext.setText(R.string.btn_next);
     }
 
     @Override
@@ -126,9 +137,9 @@ public class TutoActivity extends AppCompatActivity  {
         }
     }
 
-    public static void start(Context c)
+    public static void start(Activity c)
     {
         Intent it = new Intent(c, TutoActivity.class);
-        c.startActivity(it);
+        c.startActivityForResult(it, REQUEST_CODE);
     }
 }

+ 6 - 1
app/src/main/java/macampcorp/macamp/activities/fragments/ChallengeFragment.java

@@ -25,6 +25,7 @@ import macampcorp.macamp.game.Resource;
 import macampcorp.macamp.game.ResourceManager;
 import macampcorp.macamp.game.challenges.Challenge;
 import macampcorp.macamp.game.Indice;
+import macampcorp.macamp.lang.Locale;
 import macampcorp.macamp.utils.files.FileManager;
 import uk.co.senab.photoview.PhotoViewAttacher;
 
@@ -33,6 +34,10 @@ public abstract class ChallengeFragment extends Fragment{
     protected abstract  void onResetUi();
 
 
+    public String _(int x)
+    {
+        return  getResources().getString(x);
+    }
 
     protected LinearLayout  mUITextIndices;
     protected LinearLayout  mUIGlobalIndice;
@@ -112,7 +117,7 @@ public abstract class ChallengeFragment extends Fragment{
         TextView tv = new TextView(getActivity());
         tv.setTextColor(0xff70e030);
         tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
-        tv.setText("  Indice "+(indInd+1)+" : "+ind.getText());
+        tv.setText(_(R.string.indice_prefix)+ " "+ind.getText());
         tv.setTypeface(null, Typeface.BOLD);
         return  tv;
     }

+ 1 - 1
app/src/main/java/macampcorp/macamp/activities/fragments/QCMFragment.java

@@ -71,7 +71,7 @@ public class QCMFragment extends ChallengeFragment {
 
         if(x<0 || x>=mChoices.size())
         {
-            Toast.makeText(getActivity(), "Vous devez sélectionner une réponse ! ", Toast.LENGTH_SHORT).show();
+            Toast.makeText(getActivity(), R.string.no_response, Toast.LENGTH_SHORT).show();
             return Challenge.NO_RESPONSE;
         }else
         {

+ 7 - 12
app/src/main/java/macampcorp/macamp/activities/fragments/QuestionFragment.java

@@ -20,6 +20,7 @@ import macampcorp.macamp.activities.HostActivity;
 import macampcorp.macamp.activities.R;
 import macampcorp.macamp.game.challenges.Challenge;
 import macampcorp.macamp.game.challenges.Question;
+import macampcorp.macamp.utils.Android;
 
 /**
  * A simple {@link Fragment} subclass.
@@ -76,7 +77,7 @@ public class QuestionFragment extends ChallengeFragment  {
         String resp = mUIResponse.getText().toString();
         if(resp.length()==0)
         {
-            Toast.makeText(getActivity(), "Vous devez entrer une réponse ...", Toast.LENGTH_SHORT).show();
+            Toast.makeText(getActivity(), R.string.no_respons_q, Toast.LENGTH_SHORT).show();
             return Challenge.NO_RESPONSE;
         }
         if(mQuestion.checkAnswer(resp))
@@ -96,14 +97,14 @@ public class QuestionFragment extends ChallengeFragment  {
 
     public void onChallengeFailed()
     {
-        hideKeyboard(getActivity());
+        Android.hideKeyboard(getActivity());
     }
 
 
     @Override
     protected void onInitChallenge(Challenge c) {
         super.onInitChallenge(c);
-        hideKeyboard(getActivity());
+        Android.hideKeyboard(getActivity());
 
 
 
@@ -121,17 +122,11 @@ public class QuestionFragment extends ChallengeFragment  {
     @Override
     protected void onResetUi() {
         mUIResponse.setText("");
-        mUIResponse.setHint("Entrer votre réponse");
+        mUIResponse.setHint(R.string.hint_resp);
         getHostActivity().setVisibilityView(R.id.btn_valid, View.VISIBLE);
-        hideKeyboard(getActivity());
+        Android.hideKeyboard(getActivity());
 
     }
 
-    public static void hideKeyboard(Activity activity) {
-        View view = activity.findViewById(android.R.id.content);
-        if (view != null) {
-            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
-            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
-        }
-    }
+
 }

+ 1 - 1
app/src/main/java/macampcorp/macamp/activities/viewers/ImageViewerActivity.java

@@ -49,7 +49,7 @@ public class ImageViewerActivity extends AppCompatActivity {
             if(mResource.isImage())
             {
                 Bitmap bmp=null;
-                Toast.makeText(this, "Chargement de '"+mResource.getName()+"'", Toast.LENGTH_SHORT).show();
+
                 try {
                     bmp = FileManager.openImage(this, mResource.getFile());
                 } catch (Exception e) {

+ 12 - 1
app/src/main/java/macampcorp/macamp/game/Bomb.java

@@ -16,6 +16,7 @@ public class Bomb implements Serializable{
     public  static final int BOMB_UNARMED=0;
     public  static final int BOMB_ARMED=1;
     public  static final int BOMB_DISARMED=2;
+    public  static final int BOMB_EXPLOSED=3;
 
     protected long      mDeadLine;
     protected String    mPassword;
@@ -134,8 +135,18 @@ public class Bomb implements Serializable{
         mDeadLine=(s*1000+Calendar.getInstance().getTimeInMillis());
     }
 
+    protected void explose()
+    {
+        mStatus=BOMB_EXPLOSED;
+    }
+
     public boolean hasExplosed()
     {
-        return mDeadLine < Calendar.getInstance().getTimeInMillis();
+        if(getSecondsBeforeBoom()<0)
+            explose();
+
+        return mStatus!=BOMB_DISARMED && mDeadLine < Calendar.getInstance().getTimeInMillis();
     }
+
+    public int getStatus() { return mStatus; }
 }

+ 17 - 11
app/src/main/java/macampcorp/macamp/game/Event.java

@@ -57,7 +57,7 @@ public class Event implements Serializable {
 
     public class EventReturn  implements  Serializable{
         public int code;
-
+        public boolean wait=false;
         public String message;
         public ArrayList<Object> args;
 
@@ -69,6 +69,7 @@ public class Event implements Serializable {
 
         public EventReturn set(int c, String m) { code=c; message=m; return this;}
         public EventReturn addArg(Object e) {args.add(e); return this;}
+        public void setWait(){ wait=true;}
 
         public boolean isError() { return code!=0;}
     }
@@ -93,7 +94,7 @@ public class Event implements Serializable {
     public EventReturn exec(HostActivity a, Game g)
     {
         Class[] paramType = new Class[2];
-        paramType[0] = Activity.class;
+        paramType[0] = HostActivity.class;
         paramType[1] = Game.class;
         EventReturn ev =  new EventReturn();
 
@@ -122,7 +123,7 @@ public class Event implements Serializable {
 
 
 
-    public EventReturn armBomb(Activity a, Game g)
+    public EventReturn armBomb(HostActivity a, Game g)
     {
         g.getBomb().arm();
         return new EventReturn(0,"OK");
@@ -134,7 +135,7 @@ public class Event implements Serializable {
      * $0 : temps en minutes
      * @return OK
      */
-    public EventReturn setTimerTo(Activity a, Game g)
+    public EventReturn setTimerTo(HostActivity a, Game g)
     {
         long time = g.getBomb().getSecondsBeforeBoom();
         long seuil = argAsInt(0, 15) * 60;
@@ -144,41 +145,46 @@ public class Event implements Serializable {
     }
 
 
-    public EventReturn print(Activity a, Game g)
+    public EventReturn print(HostActivity a, Game g)
     {
         Toast.makeText(a, argAsString(0, "Error"), Toast.LENGTH_LONG).show();
         L.info(  argAsString(0, "Error"));
         return new EventReturn(0,"OK");
     }
 
-    public EventReturn alert(final Activity a, final Game g)
+    public EventReturn alert(final HostActivity a, final Game g)
     {
         String message = argAsString(0, "");
         AlertDialog.Builder builder = new AlertDialog.Builder(a);
         // Add the buttons
         builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int id) {
-                g.getScheduler().schedule(HostActivity.cast(a), g);
+                g.getScheduler().schedule(a, g);
             }
         });
         builder.setNegativeButton("Non", new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int id) {
-                g.getScheduler().schedule(HostActivity.cast(a), g);
+                g.getScheduler().schedule(a, g);
             }
         });
         // Set other dialog properties
         builder.setMessage(message);
+        L.debug(message);
 
         // Create the AlertDialog
         AlertDialog dialog = builder.create();
         dialog.show();
-        return new EventReturn(0,"OK");
+        EventReturn ev = new EventReturn(0, "OK");
+        ev.setWait();
+        return ev;
     }
 
-    public EventReturn tuto(Activity a, Game g)
+    public EventReturn tuto(HostActivity a, Game g)
     {
         TutoActivity.start(a);
-        return new EventReturn(0, "OK");
+        EventReturn ev = new EventReturn(0, "OK");
+        ev.setWait();
+        return ev;
     }
 
     public String getMethod() {

+ 22 - 1
app/src/main/java/macampcorp/macamp/game/Game.java

@@ -36,6 +36,9 @@ public class Game  implements Serializable {
     protected Stage            mCurrentStage=null;
     protected int              mCurrentStageIndex=-1;
 
+    protected Stage            mOnWin=null;
+    protected Stage            mOnLoose=null;
+
     protected Inventaire       mInventaire;
     protected Scheduler        mSched = new Scheduler();
 
@@ -82,6 +85,23 @@ public class Game  implements Serializable {
             throw new BadGameConfigException("Bad parameter 'password'");
         }
 
+        try {
+            JSONObject arr = root.getJSONObject("win");
+            mOnWin=new Stage(this, arr, act);
+        } catch (JSONException e) {
+            L.warn("Le champs 'win' n'est pas renseigné");
+            throw  new BadGameConfigException("Le champs 'win' n'est pas renseigné");
+        }
+
+
+        try {
+            JSONObject arr = root.getJSONObject("loose");
+            mOnLoose=new Stage(this, arr, act);
+        } catch (JSONException e) {
+            L.warn("Le champs 'loose' n'est pas renseigné");
+            throw  new BadGameConfigException("Le champs 'win' n'est pas renseigné");
+        }
+
         mCurrentStageIndex=-1;
         if(mStages.size()>0)
             mCurrentStage=mStages.get(0);
@@ -93,7 +113,8 @@ public class Game  implements Serializable {
         return mCurrentStage;
     }
 
-
+    public Stage getOnWin() { return mOnWin; }
+    public Stage getOnLoose() {return mOnLoose; }
 
     public Challenge getCurrentChallenge()
     {

+ 11 - 1
app/src/main/java/macampcorp/macamp/game/Stage.java

@@ -32,7 +32,16 @@ public class Stage  implements Serializable {
         try {
             mName = root.getString("name");
             mDone = false;
-            JSONArray chall = root.getJSONArray("challenges");
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+            throw new RuntimeException(e.getMessage() + " Name:"+mName);
+        }
+
+
+        try {
+            JSONArray chall = null;
+            chall = root.getJSONArray("challenges");
             for(int i=0; i<chall.length(); i++)
             {
                 JSONObject obj = chall.getJSONObject(i);
@@ -45,6 +54,7 @@ public class Stage  implements Serializable {
             throw new RuntimeException(e.getMessage() + " Name:"+mName);
         }
 
+
         try{
 
             JSONArray chall = root.getJSONArray("resources");

+ 3 - 2
app/src/main/java/macampcorp/macamp/game/scheduler/EventTask.java

@@ -21,9 +21,10 @@ public class EventTask extends Task {
 
     @Override
     public int exec(Scheduler s, HostActivity cd, Game g) {
-        mEvent.exec(cd, g);
+        Event.EventReturn ev = mEvent.exec(cd, g);
         cd.save();
-        return s.schedule(cd, g);
+        if(!ev.wait) return s.schedule(cd, g);
+        return Task.TASK_EVENT;
     }
 
     public Event getEvent() {

+ 20 - 6
app/src/main/java/macampcorp/macamp/game/scheduler/Scheduler.java

@@ -11,6 +11,7 @@ import macampcorp.macamp.game.Event;
 import macampcorp.macamp.game.Game;
 import macampcorp.macamp.game.Resource;
 import macampcorp.macamp.game.challenges.Challenge;
+import macampcorp.macamp.utils.L;
 
 
 public class Scheduler implements Serializable {
@@ -62,6 +63,8 @@ public class Scheduler implements Serializable {
                 append(new ResourceTask((Resource)c.get(i)));
             else if(c.get(i) instanceof Event)
                 append(new EventTask((Event)c.get(i)));
+            else if(c.get(i) instanceof Challenge)
+                append(new ChallengeTask((Challenge)c.get(i)));
     }
 
     public void prepend(Resource r) { prepend(new ResourceTask(r));}
@@ -74,21 +77,18 @@ public class Scheduler implements Serializable {
     {
         Task t = mStart;
         mLastTask=t;
+        L.error("___SCHEDULER_DEBUG___", "Executing task : " + getTaskListString());
+        if(t==null) return Task.TASK_NONE;
         if(t!=null)
         {
             mStart=mStart.next();
             mLastTask.mNext=null;
-            //Log.e("___SCHEDULER_DEBUG___", "Executing task : "+t.toString());
             return t.exec(this, cd, g);
         }else  mLastTask.mNext=null;
         return Task.TASK_NONE;
     }
 
-    public void scheduleFromActivity(Activity cd, Game g)
-    {
-        Intent it = new Intent(cd, HostActivity.class);
-        cd.startActivity(it);
-    }
+
 
     public ArrayList<Task> getTaskList()
     {
@@ -98,6 +98,20 @@ public class Scheduler implements Serializable {
         return at;
     }
 
+    public String getTaskListString()
+    {
+        String x = "[ ";
+        Task t = mStart;
+        while(t!=null)
+        {
+            x+=t.toString();
+            t=t.mNext;
+        }
+        x+=" ]";
+        if(mLastTask!=null) x+=" : "+mLastTask.toString();
+        return x;
+    }
+
     public Task getLastTask() {
         return mLastTask;
     }

+ 15 - 1
app/src/main/java/macampcorp/macamp/game/scheduler/SpecialTask.java

@@ -4,6 +4,7 @@ import android.app.Activity;
 import android.content.Intent;
 
 import macampcorp.macamp.activities.BombActivity;
+import macampcorp.macamp.activities.EndActivity;
 import macampcorp.macamp.activities.HostActivity;
 import macampcorp.macamp.game.Game;
 
@@ -11,6 +12,8 @@ public class SpecialTask extends Task {
 
     public static final int FINISHED_SUCESS=1;
     public static final int FINISHED_FAILED=2;
+    public static final int END_SUCCESS=4;
+    public static final int END_FAILED=5;
     public static final int BOMB=3;
 
     protected int mState;
@@ -21,7 +24,8 @@ public class SpecialTask extends Task {
     }
 
     private static final String[] gStrings={"STATE_NONE", "STATE_FINISHED_SUCESS",
-                                              "STATE_FINISHED_FAILED", "STATE_FINISHED_FAILED" };
+                                              "STATE_FINISHED_FAILED", "STATE_FINISHED_FAILED",
+                                                "STATE_END_SUCCESS", "STATE_END_FAILED" };
 
     public String toString()
     {
@@ -45,6 +49,16 @@ public class SpecialTask extends Task {
                 act.startActivityForResult(in, BombActivity.REQUEST_CODE);
             }
             break;
+
+            case END_FAILED:
+                EndActivity.start(cd, false);
+                //cd.finish();
+                break;
+
+            case END_SUCCESS:
+                EndActivity.start(cd, true);
+                //cd.finish();
+                break;
         }
         return TASK_SPECIAL;
     }

+ 1 - 0
app/src/main/java/macampcorp/macamp/game/scheduler/Task.java

@@ -11,6 +11,7 @@ public abstract class Task implements Serializable {
     public final static int TASK_EVENT=2;
     public final static int TASK_RESOURCE=3;
     public final static int TASK_SPECIAL=4;
+    public final static int TASK_WAIT=5;
 
     protected int mType;
     protected Task mNext=null;

+ 12 - 0
app/src/main/java/macampcorp/macamp/lang/Locale.java

@@ -0,0 +1,12 @@
+package macampcorp.macamp.lang;
+
+import android.content.res.Resources;
+
+import macampcorp.macamp.activities.R;
+
+public class Locale {
+    public static String _(int x)
+    {
+        return Resources.getSystem().getString(x);
+    }
+}

+ 29 - 0
app/src/main/java/macampcorp/macamp/utils/Android.java

@@ -0,0 +1,29 @@
+package macampcorp.macamp.utils;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Build;
+import android.text.InputType;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+public class Android {
+    public static void hideKeyboard(Activity activity) {
+        View view = activity.findViewById(android.R.id.content);
+        if (view != null) {
+            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
+            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+        }
+    }
+
+    public static void disableSoftInputFromAppearing(EditText editText) {
+        if (Build.VERSION.SDK_INT >= 11) {
+            editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
+            editText.setTextIsSelectable(true);
+        } else {
+            editText.setRawInputType(InputType.TYPE_NULL);
+        }
+        editText.setFocusable(true);
+    }
+}

+ 6 - 4
app/src/main/res/layout/activity_credits.xml

@@ -12,9 +12,11 @@
         android:layout_width="87dp"
         android:layout_height="96dp"
         android:layout_marginBottom="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginStart="8dp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:srcCompat="@drawable/mj"
-        tools:layout_editor_absoluteX="8dp" />
+        app:layout_constraintStart_toStartOf="parent"
+        app:srcCompat="@drawable/mj" />
 
     <ImageView
         android:id="@+id/imageView3"
@@ -28,7 +30,7 @@
         app:srcCompat="@drawable/angouleme" />
 
     <ScrollView
-        android:layout_width="344dp"
+        android:layout_width="0dp"
         android:layout_height="0dp"
         android:layout_marginBottom="8dp"
         android:layout_marginEnd="8dp"
@@ -44,7 +46,7 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="vertical" >
+            android:orientation="vertical">
 
             <TextView
                 android:id="@+id/tv_credits"

+ 74 - 0
app/src/main/res/layout/activity_end.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="macampcorp.macamp.activities.EndActivity">
+
+    <LinearLayout
+        android:id="@+id/linearLayout2"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_marginBottom="8dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginRight="8dp"
+        android:layout_marginStart="8dp"
+        android:gravity="bottom"
+        android:orientation="vertical"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <Button
+            android:id="@+id/button16"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:onClick="onCredits"
+            android:text="@string/btn_credits" />
+
+        <Button
+            android:id="@+id/btn_retry"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:onClick="onRetry"
+            android:text="@string/btn_retry" />
+
+        <Button
+            android:id="@+id/button14"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:onClick="onQuit"
+            android:text="@string/btn_quit" />
+    </LinearLayout>
+
+    <ScrollView
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginBottom="8dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginRight="8dp"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <LinearLayout
+            android:id="@+id/ll_end"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_end"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="TextView" />
+        </LinearLayout>
+    </ScrollView>
+
+</android.support.constraint.ConstraintLayout>

+ 5 - 5
app/src/main/res/layout/activity_host.xml

@@ -39,7 +39,7 @@
                     android:layout_marginRight="8dp"
                     android:layout_marginStart="8dp"
                     android:layout_marginTop="2dp"
-                    android:text="Code de la bombe"
+                    android:text="@string/btn_code"
                     android:textSize="14sp"
                     app:layout_constraintEnd_toStartOf="@+id/imageButton2"
                     app:layout_constraintStart_toEndOf="@+id/divider4"
@@ -52,7 +52,7 @@
                     android:layout_marginLeft="8dp"
                     android:layout_marginStart="8dp"
                     android:layout_marginTop="2dp"
-                    android:text="Temps restant:"
+                    android:text="@string/lbl_time"
                     android:textSize="14sp"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent" />
@@ -161,7 +161,7 @@
                 android:layout_weight="1"
                 android:gravity="center"
                 android:onClick="onClickIndice"
-                android:text="Indice"
+                android:text="@string/btn_indice"
                 android:textSize="12sp" />
 
             <Button
@@ -171,7 +171,7 @@
                 android:layout_weight="1"
                 android:gravity="center"
                 android:onClick="onClickVideos"
-                android:text="Vidéos"
+                android:text="@string/btn_journal"
                 android:textSize="12sp" />
 
             <Button
@@ -181,7 +181,7 @@
                 android:layout_weight="1"
                 android:gravity="center"
                 android:onClick="onClickValid"
-                android:text="Valider"
+                android:text="@string/btn_valid"
                 android:textSize="12sp" />
         </LinearLayout>
 

+ 0 - 22
app/src/main/res/layout/activity_loading.xml

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context="macampcorp.macamp.activities.LoadingActivity">
-
-    <Button
-        android:id="@+id/button10"
-        android:layout_width="314dp"
-        android:layout_height="118dp"
-        android:layout_marginEnd="8dp"
-        android:layout_marginLeft="8dp"
-        android:layout_marginRight="8dp"
-        android:layout_marginStart="8dp"
-        android:onClick="go"
-        android:text="lancer"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        tools:layout_editor_absoluteY="-14dp" />
-</android.support.constraint.ConstraintLayout>

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

@@ -19,7 +19,7 @@
         android:layout_alignParentRight="true"
         android:layout_alignParentStart="true"
         android:onClick="onOk"
-        android:text="Ok"
+        android:text="@string/btn_ok"
         android:textStyle="bold" />
 
     <ImageButton

+ 1 - 1
app/src/main/res/layout/activity_permission.xml

@@ -19,7 +19,7 @@
         android:layout_alignParentRight="true"
         android:layout_alignParentStart="true"
         android:onClick="onUnderstood"
-        android:text="J&apos;ai compris"
+        android:text="@string/btn_understood"
         android:textColor="#000000"
         android:textSize="25dp"
         android:textStyle="bold" />

+ 1 - 1
app/src/main/res/layout/activity_resource_list.xml

@@ -17,7 +17,7 @@
         android:layout_width="match_parent"
         android:layout_height="70dp"
         android:layout_gravity="center_horizontal"
-        android:text="Journal"
+        android:text="@string/lbl_journal"
         android:textSize="30dp"
         android:textStyle="bold" />
 

+ 3 - 3
app/src/main/res/layout/activity_tuto.xml

@@ -22,7 +22,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:onClick="onNext"
-        android:text="Suivant"
+        android:text="@string/btn_next"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent" />
 
@@ -31,7 +31,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:onClick="onPrev"
-        android:text="Précédant"
+        android:text="@string/btn_prev"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent" />
 
@@ -44,7 +44,7 @@
         android:layout_marginRight="8dp"
         android:layout_marginStart="8dp"
         android:onClick="onPass"
-        android:text="Passer"
+        android:text="@string/btn_pass"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toStartOf="@+id/btn_next"
         app:layout_constraintStart_toEndOf="@+id/btn_prev" />

+ 2 - 1
app/src/main/res/layout/fragment_bomb.xml

@@ -90,7 +90,8 @@
                                 android:layout_height="wrap_content"
                                 android:layout_gravity="bottom"
                                 android:layout_weight="5"
-                                android:hint="Désamorcer la bombe" />
+                                android:hint="Désamorcer la bombe"
+                                android:text="@string/btn_defuse" />
                         </LinearLayout>
                     </ScrollView>
 

+ 1 - 1
app/src/main/res/layout/fragment_qrcode.xml

@@ -88,7 +88,7 @@
             android:id="@+id/btn_scan"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="Scanner le code" />
+            android:text="@string/btn_scan" />
     </LinearLayout>
 
 </LinearLayout>

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

@@ -96,4 +96,42 @@
     <string name="hello_blank_fragment">Hello blank fragment</string>
     <string name="title_activity_test_video">TestVideoActivity</string>
     <string name="title_activity_bomb">BombActivity</string>
+    <string name="btn_credits">Crédits</string>
+    <string name="btn_retry">Réessayer</string>
+    <string name="btn_quit">Quitter</string>
+    <string name="lbl_time">Temps restant:</string>
+    <string name="btn_code">Code de la bombe:</string>
+    <string name="btn_indice">Indice</string>
+    <string name="btn_journal">Journal</string>
+    <string name="btn_valid">Valider</string>
+    <string name="btn_ok">Ok</string>
+    <string name="btn_understood">J\'ai compris</string>
+    <string name="lbl_journal">Journal</string>
+    <string name="btn_prev">Précédant</string>
+    <string name="btn_pass">Passer</string>
+    <string name="btn_next">Suivant</string>
+    <string name="btn_defuse">Désamorcer</string>
+    <string name="btn_scan">Scanner le code</string>
+    <string name="toast_ok">Bombe désamorcée !</string>
+    <string name="toast_fail">Mauvais code !</string>
+    <string name="toast_length">Code incomplet</string>
+    <string name="game_loading">Chargment...</string>
+    <string name="game_new">Nouveau jeu</string>
+    <string name="yes">Oui</string>
+    <string name="no">Non</string>
+    <string name="toast_continue">Voulez-vous continuer la partie ?</string>
+    <string name="tuto_pass_title">Passer le tutorial</string>
+    <string name="tuto_pass">Êtes-vous variment sûre de vouloir passer le tutorial. Il est important pour bien comprendre le fonctionnement du jeu...</string>
+    <string name="indice_prefix">Indice :</string>
+    <string name="no_response">Vous devez sélectionner une réponse</string>
+    <string name="no_respons_q">Vous devez entrer une réponse</string>
+    <string name="hint_resp">Entrez votre réponse</string>
+    <string name="minutes">minutes</string>
+    <string name="secondes">secondes</string>
+    <string name="and">et</string>
+    <string name="dialog_sure_title">Êtes-vous sûre ?</string>
+    <string name="dialog_sure_pre">Cet indice vous coutera</string>
+    <string name="dialog_sure_post">, voulez vous continuer ?</string>
+
+
 </resources>