Browse Source

modifs mineures

François Gautrais 7 năm trước cách đây
mục cha
commit
27e1d9b1b5

+ 8 - 8
app/app.iml

@@ -70,13 +70,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@@ -84,6 +77,14 @@
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/applicationId" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/build-info" />
@@ -95,7 +96,6 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-apk" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-main-apk-res" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />

+ 4 - 2
app/src/main/AndroidManifest.xml

@@ -29,8 +29,10 @@
             android:name=".viewers.ResourceListActivity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:label="@string/title_activity_resource_list"
-            android:screenOrientation="portrait" />
-        <activity android:name=".PermissionActivity">
+            android:screenOrientation="portrait"
+            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" />
 

+ 49 - 38
app/src/main/assets/game_medium

@@ -1,11 +1,14 @@
 {
     "password" : "12345678",
-    "max_time" : 30,
+    "max_time" : 120,
 	"stages" : [{
 	"name" : "Intro",
 	"challenges" : [],
 	"resources" : ["intro"],
-	"event_end" : [{ "method" : "tuto" }, { "method" : "armBomb" }]
+	"event_end" : [ 
+		{"method" : "tuto"},
+		{"method" : "armBomb"}
+	]
 },
 {
 	"name" : "Bibliotheuqe_intro",
@@ -21,7 +24,7 @@
 					{
 						"type" : "text",
 						"text" : "On ne peut hélas toujours pas rentrer en vélo dans ces structures...",
-						"penality": 1
+						"penality": 0.5
 					},
 					{
 						"type" : "text",
@@ -32,11 +35,11 @@
 			}
 		],
 	"resources" : ["intro_fin"],
-	"charIndex" : 0
+	"charIndex" : 7
 },
 {
 	"name" : "MPG",
-	"charIndex" : 1,
+	"charIndex" : 0,
 	"challenges" :
 		[
 			{
@@ -48,7 +51,7 @@
 				"indices" : [
 					{
 						"text" : "Un endroit Merveilleux où les enfants et ados sont Joyeux !",
-						"penality": 1
+						"penality": 0.5
 					},
 					{
 						"penality": 1,
@@ -78,7 +81,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  },
                  {
@@ -98,7 +101,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  },
                  {
@@ -118,7 +121,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  },
                  {
@@ -139,7 +142,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  },
                  {
@@ -160,7 +163,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  },
                  {
@@ -181,7 +184,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  },
                  {
@@ -202,7 +205,7 @@
 								],
                     "bad_message" : "T'es nul !",
 					"resource" : "question",
-					 "penality": 1,
+					 "penality": 0.5,
                      "mandatory" : false
                  }
 		]
@@ -221,7 +224,7 @@
 					{
 						"type" : "text",
 						"text" : "La pelouse est trop verte pour être vrai...",
-						"penality": 1
+						"penality": 0.5
 					},
 					{
 						"type" : "text",
@@ -240,7 +243,7 @@
 				"answer" : "97",
 				"indices" : [
 					{
-						"penality" : 1,
+						"penality" : 0.5,
 						"text": "Question de point de vu..."
 					},
 					{
@@ -261,7 +264,7 @@
 		],
 	"resources" : ["milieu"],
 	"event_end" : { "method" : "setTimerTo", "args" : [15] },
-	"charIndex" : 2
+	"charIndex" : 5
 },
 {
 	"name" : "JardinDhiver",
@@ -277,7 +280,7 @@
 				"answer" : "ABBA",
 				"indices" : [
 					{
-						"penality" : 1,
+						"penality" : 0.5,
 						"text": "J’ai bien dit X lettres !"
 					},
 					{
@@ -297,7 +300,7 @@
 			}
 		],
 	"resources" : [],
-	"charIndex" : 3
+	"charIndex" : 2
 },
 {
 	"name" : "Accueil",
@@ -313,7 +316,7 @@
 				"answer" : "Trop cuite",
 				"indices" : [
 					{
-						"penality" : 1,
+						"penality" : 0.5,
 						"text": "Allez ne faites pas les timides, allez demander !"
 					},
 					{
@@ -333,7 +336,7 @@
 			}
 		],
 	"resources" : [],
-	"charIndex" : 4
+	"charIndex" : 6
 },
 {
 	"name" : "Prospectus",
@@ -348,7 +351,7 @@
 				"qr_value" : "1",
 				"indices" : [
 					{
-						"penality" : 1,
+						"penality" : 0.5,
 						"text": "Je vous avais bien dit de prendre la plaquette et le facebook de la bibliothèque."
 					},
 					{
@@ -372,7 +375,7 @@
 			}
 		],
 	"resources" : [],
-	"charIndex" : 5
+	"charIndex" : 1
 },
 {
 	"name" : "Accueil",
@@ -388,11 +391,7 @@
 				"answer" : "Dindon",
 				"indices" : [
 					{
-						"penality" : 1,
-						"text": "C’est écrit par Sylvie Granotier, le titre est “Double je”"
-					},
-					{
-						"penality" : 1,
+						"penality" : 0.5,
 						"text": "La Côte est POL GRA"
 					},
 					{
@@ -406,18 +405,30 @@
 	"resources" : [],
 	"charIndex" : 6
 },
-
 {
-    "name": "bombStage",
-    "challenges" : [
-        {
-            "type" : "BombDefuse",
-            "text" : "Salut ca va ?",
-            "resource" : "bib",
-            "name" : "bombe"
-        }
-    ]
-}],
+	"name" : "Bomb",
+	"challenges" :
+		[
+			{
+				"type" : "BombDefuse",
+				"name" : "DefuseBomb",
+				"resource" : "oeil",
+				"text" : "Allez chercher ce roman policier un message codé se trouve à l'intérieur...",
+				"indices" : [
+					{
+						"penality" : 0.5,
+						"text": "L’oeil se trouve sur une peinture d’un mur"
+					},
+					{
+						"penality" : 1,
+						"text": "On dirait que plus c’est écrit grand moins on le voit"
+					}
+				],
+				"penality" : 1
+			}
+		],
+	"resources" : []
+}	],
 	"credits" : 
 	{
 		"text" : "Par Fran\u00e7ois Gautrais !",

+ 0 - 110
app/src/main/assets/game_medium - Copie

@@ -1,110 +0,0 @@
-{
-    "password" : "12345678",
-    "max_time" : 30,
-	"stages" : [{
-	"name" : "Intro",
-	"challenges" : [],
-	"event_end" : { "method" : "armBomb" }
-},
-{"name" : "Intro2", "challenges" : [], "charIndex" : 1},
-{"name" : "Intro3", "challenges" : [], "charIndex" : 2},
-{"name" : "Intro4", "challenges" : [], "charIndex" : 3},
-{"name" : "Intro5", "challenges" : [], "charIndex" : 4},
-{"name" : "Intro5", "challenges" : [], "charIndex" : 5},
-{"name" : "Intro5", "challenges" : [], "charIndex" : 7},
-{
-	"name" : "MPG",
-	"charIndex" : 1,
-	"challenges" :
-		[
-			{
-                    "type" : "QCM",
-                    "name" : "a1",
-                    "question" : "De quelle couleur était le cheval blanc d'Henri IV ?",
-                    "answer" : "Blanc",
-                    "choices" : [
-									"Blanc",
-									"Rouge", 
-									"Noir", 
-									"Transparent"
-								],
-                    "bad_message" : "T'es nul !",
-					"resource" : "henri",
-					"indices" : [
-						{ 
-							"text" : "Un indice se cache dans la question...",
-							"penality" : 3.5
-						},
-						{ 
-							"text" : "Ça commence par un B",
-							"penality" : 10
-						}
-					],
-					"penality": 1
-                 }
-		]
-},
-{
-	"name" : "Bibliotheuqe_intro",
-	"challenges" :
-		[
-			{
-				"type" : "QRCodeTreasure",
-				"name" : "BibQr",
-				"qr_value" : "1",
-				"resource" : "tour",
-				"indices" : [
-					{
-						"type" : "text",
-						"text" : "On ne peut hélas toujours pas rentrer en vélo dans ces structures...",
-						"penality": 10
-					},
-					{
-						"type" : "text",
-						"penality": 1,
-						"text" : "Encore moins dans la bibliothèque !" 
-					}
-				]
-			}
-		],
-	"charIndex" : 0
-},
-{
-	"name" : "Accueil",
-	"challenges" :
-		[
-			{
-				"type" : "Question",
-				"name" : "accueilQuestion",
-				"bad_message" : "Non !",
-				"good_message" : "Bravo !",
-				"resource" : "ballon",
-				"question" : "Quel pays a gagné la Coupe du Monde de Football Masculin 2018 ?",
-				"answer" : "France",
-				"indices" : [
-					{
-						"penality" : 1,
-						"text": "C'est pas très loin..."
-					},
-					{
-						"penality" : 1,
-						"text": "Leur drapeau est bleu-blanc-rouge"
-					},
-					{
-						"penality" : 1,
-						"text": "Ça commence par un F"
-					}
-				],
-				"penality" : 1
-			}
-		],
-	"resources" : [],
-	"charIndex" : 6
-}	],
-	"credits" : 
-	{
-		"text" : "Par Fran\u00e7ois Gautrais !",
-		"useHtml" : true
-	},
-	"name" : "game_medium"
-}

BIN
app/src/main/assets/oeil.jpg


+ 0 - 6
app/src/main/assets/ressources - Copie.res

@@ -1,6 +0,0 @@
-{
-	"tour" : { "type" : "Image" },
-	"henri" : { "type" : "Image" },
-	"question" : { "type" : "Image" },
-	"ballon" : { "type" : "Image" }
-}

+ 2 - 1
app/src/main/assets/ressources.res

@@ -28,5 +28,6 @@
 	"accueil" :  {"type" : "Image"},
 	"prospect" :  {"type" : "Image"},
 	"error" : {"type" : "Image"},
-	"livre" : {"type" : "Image"}
+	"livre" : {"type" : "Image"},
+	"oeil" : { "type": "Image" }
 }

+ 11 - 19
app/src/main/java/macampcorp/macamp/activities/CreditsActivity.java

@@ -12,31 +12,23 @@ 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" +
+            "Ce jeux a été initié par la médiathèque Ma Campagne ainsi que le CSCS Louis Aragon\n" +
             "\n" +
             "<h2> Scénario </h2>\n" +
-            "- Romain<br>\n" +
-            "- Tiffen<br>\n" +
-            "- Léa <br>\n" +
-            "- Thaïs<br>\n" +
-            "- Jules <br>\n" +
+            "- <br>\n" +
+            "- <br>\n" +
+            "- <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" +
+            "<h2> Réalisation des énigmes </h2>\n" +
+            "- Quentin Bourgois<br>\n" +
+            "- François Gautrais (RIB)<br>\n" +
             "\n" +
-            "<h2> Actteurs-ices </h2>\n" +
+            "<h2> Son </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" +
+            "- Quentin Bourgois<br>\n" +
             "\n" +
-            "<h2> Programmation / Interface / Montage </h2>\n" +
-            "- François Gautrais<br>\n" +
+            "<h2> Programmation </h2>\n" +
+            "- François Gautrais (RIB)<br>\n" +
             "\n";
 
     @Override

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

@@ -176,24 +176,29 @@ public class HostActivity extends Activity implements ChallengeDriver{
 
     public void onClickValid(View v)
     {
-        if(mCurrentFragment!=null)
+        if(mCurrentFragment!=null && mCurrentFragment.getChallenge()!=null)
         {
-            if(mCurrentFragment.check())
+            int res = mCurrentFragment.check();
+            if(res==Challenge.OK)
             { //bonne réponse
                 challengeValidate(mCurrentFragment.getChallenge(),  mGame, this);
-            }else
+            }else if(res==Challenge.FAIL)
             { //mauvaise réponse
                 //réponse facultative
                 if(!mCurrentFragment.getChallenge().isMandatory())
                 {
                     mCurrentFragment.onChallengePassed();
-                    mGame.getBomb().addTime(-mCurrentFragment.getChallenge().getPenality());
                     challengeValidate(mCurrentFragment.getChallenge(),  mGame, this);
+                    mGame.getBomb().addTime(-mCurrentFragment.getChallenge().getPenality());
                 }else //réponse obligatoire
                 {
                     mCurrentFragment.onChallengeFailed();
+                    mGame.getBomb().addTime(-mCurrentFragment.getChallenge().getPenality());
                 }
             }
+        }else
+        {
+            throw new RuntimeException("Erreur onClickValid, le fragment ou le challenge est nul...");
         }
     }
 

+ 2 - 2
app/src/main/java/macampcorp/macamp/activities/fragments/BombFragment.java

@@ -60,8 +60,8 @@ public class BombFragment extends ChallengeFragment implements View.OnClickListe
     }
 
     @Override
-    public boolean check() {
-        return false;
+    public int check() {
+        return Challenge.FAIL;
     }
 
     @Override

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

@@ -33,7 +33,7 @@ import macampcorp.macamp.utils.files.FileManager;
 import uk.co.senab.photoview.PhotoViewAttacher;
 
 public abstract class ChallengeFragment extends Fragment {
-    public abstract boolean check();
+    public abstract int check();
     protected abstract  void onResetUi();
 
 

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

@@ -66,13 +66,13 @@ public class QCMFragment extends ChallengeFragment {
 
 
     @Override
-    public boolean check() {
+    public int check() {
         int x = mUIGoupQCM.getCheckedRadioButtonId()-mIdOffset;
 
         if(x<0 || x>=mChoices.size())
         {
-            Toast.makeText(getActivity(), "Vous devez sélectionner une réponse ! "+x, Toast.LENGTH_SHORT).show();
-            return false;
+            Toast.makeText(getActivity(), "Vous devez sélectionner une réponse ! ", Toast.LENGTH_SHORT).show();
+            return Challenge.NO_RESPONSE;
         }else
         {
             String resp = mChoices.get(x);
@@ -80,12 +80,12 @@ public class QCMFragment extends ChallengeFragment {
             {
                 if(mQCM.getGoodMessage()!=null)
                     Toast.makeText(getActivity(), mQCM.getGoodMessage(), Toast.LENGTH_SHORT).show();
-                return true;
+                return Challenge.OK;
             }else
             {
                 if(mQCM.getBadMessage()!=null)
                     Toast.makeText(getActivity(), mQCM.getBadMessage(), Toast.LENGTH_SHORT).show();
-                return false;
+                return Challenge.FAIL;
             }
         }
     }

+ 2 - 2
app/src/main/java/macampcorp/macamp/activities/fragments/QRCodeFragment.java

@@ -280,8 +280,8 @@ public class QRCodeFragment extends ChallengeFragment  implements
     }
 
     @Override
-    public boolean check() {
-        return false;
+    public int check() {
+        return Challenge.FAIL;
     }
 
 

+ 8 - 3
app/src/main/java/macampcorp/macamp/activities/fragments/QuestionFragment.java

@@ -54,20 +54,25 @@ public class QuestionFragment extends ChallengeFragment  {
 
 
     @Override
-    public boolean check() {
+    public int check() {
         String resp = mUIResponse.getText().toString();
+        if(resp.length()==0)
+        {
+            Toast.makeText(getActivity(), "Vous devez entrer une réponse ...", Toast.LENGTH_SHORT).show();
+            return Challenge.NO_RESPONSE;
+        }
         if(mQuestion.checkAnswer(resp))
         {
             if(mQuestion.getGoodMessage()!=null)
                 Toast.makeText(getActivity(), mQuestion.getGoodMessage(), Toast.LENGTH_SHORT).show();
             mUIResponse.getText().clear();
-            return true;
+            return Challenge.OK;
         }else
         {
             if(mQuestion.getBadMessage()!=null)
                 Toast.makeText(getActivity(), mQuestion.getBadMessage(), Toast.LENGTH_LONG).show();
             mUIResponse.getText().clear();
-            return false;
+            return Challenge.FAIL;
         }
     }
 

+ 4 - 2
app/src/main/java/macampcorp/macamp/game/Bomb.java

@@ -81,7 +81,9 @@ public class Bomb implements Serializable{
 
     public void addTime(float minutes)
     {
-        mDeadLine+=minutes*60.0*1000;
+        int x = (int)(minutes*60.0*1000);
+        L.info("Ajout de temps : "+x+" secondes "+minutes);
+        mDeadLine+=x;
     }
 
     public String getTimeBeforeBoom()
@@ -104,7 +106,7 @@ public class Bomb implements Serializable{
             if (h > 0) {
                 if (h < 10) ret += "0";
                 ret += h;
-                ret += " : ";
+                ret += ":";
             }
 
             if (m < 10) ret += "0";

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

@@ -81,7 +81,7 @@ public class Event implements Serializable {
             mMethod = j.getString("method");
         } catch (JSONException e) {
             e.printStackTrace();
-            throw new BadConfigFileException("(Event) Bad parameter 'method'");
+            throw new BadConfigFileException("(Event) Bad parameter 'method' :" +e.getMessage());
         }
 
         try {

+ 4 - 2
app/src/main/java/macampcorp/macamp/game/challenges/Challenge.java

@@ -24,7 +24,9 @@ public abstract class Challenge implements Serializable{
 
     public static final String CHALLENGE_NULL="null";
 
-
+    public static int OK =1;
+    public static int FAIL=0;
+    public static int NO_RESPONSE=-1;
     protected String mType=CHALLENGE_NULL;
     protected String mName="null";
     protected String mGoodMessage="";
@@ -116,7 +118,7 @@ public abstract class Challenge implements Serializable{
         } catch(JSONException e){}
 
         try {
-            mPenality = root.getInt("penality");
+            mPenality = (float)root.getDouble("penality");
         } catch(JSONException e){mPenality=0;}
 
 

BIN
app/src/main/res/drawable/angouleme.png


BIN
app/src/main/res/drawable/mj.jpg


+ 49 - 13
app/src/main/res/layout/activity_credits.xml

@@ -1,23 +1,59 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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"
-    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="macampcorp.macamp.activities.CreditsActivity">
 
+
+    <ImageView
+        android:id="@+id/imageView2"
+        android:layout_width="87dp"
+        android:layout_height="96dp"
+        android:layout_marginBottom="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:srcCompat="@drawable/mj"
+        tools:layout_editor_absoluteX="8dp" />
+
+    <ImageView
+        android:id="@+id/imageView3"
+        android:layout_width="133dp"
+        android:layout_height="96dp"
+        android:layout_marginBottom="8dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:srcCompat="@drawable/angouleme" />
+
     <ScrollView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:id="@+id/scrollView3" >
+        android:layout_width="344dp"
+        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/imageView3"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
 
-        <TextView
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="New Text"
-            android:id="@+id/tv_credits" />
+            android:orientation="vertical" >
+
+            <TextView
+                android:id="@+id/tv_credits"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="TextView"
+                tools:layout_editor_absoluteX="51dp"
+                tools:layout_editor_absoluteY="133dp" />
+        </LinearLayout>
     </ScrollView>
-</RelativeLayout>
+
+</android.support.constraint.ConstraintLayout>