Syncing scores to https API and retreiving score position & hints

This commit is contained in:
Ruben 2016-09-06 14:35:40 +01:00
parent c5f2ffb67c
commit 38b41a6053
12 changed files with 481 additions and 306 deletions

View file

@ -37,7 +37,7 @@
<ConfirmationsSetting value="0" id="Add" /> <ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" /> <ConfirmationsSetting value="0" id="Remove" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View file

@ -34,10 +34,15 @@ import cz.msebera.android.httpclient.entity.StringEntity;
*/ */
public class ApiRestClient { public class ApiRestClient {
private static final String BASE_URL = "http://api.emotionhero.com"; // TODO: https! private static final String BASE_URL = "https://api.emotionhero.com"; // TODO: https!
private static AsyncHttpClient client = new AsyncHttpClient(); /**
// private static SyncHttpClient syncClient = new SyncHttpClient(); * For some reason validation of SSL certificate needs to be disabled (using true).
* Otherwise async-http-client tries to validate other virtualhost (rubenvandeven.com) with api.emotionhero.com
* which obviously is not the same domain. For some reason the connection is handles properly
* by apache (so it detects the right VirtualHost...) ... odd :-(
*/
private static AsyncHttpClient client = new AsyncHttpClient(true, 80, 443);
private String jwt; private String jwt;
@ -223,7 +228,7 @@ public class ApiRestClient {
e.printStackTrace(); e.printStackTrace();
} }
this.post("/me/games", postBody, new JsonHttpResponseHandler(){ this.post("/games", postBody, new JsonHttpResponseHandler(){
@Override @Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) { public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
@ -251,7 +256,7 @@ public class ApiRestClient {
@Override @Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject response) { public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject response) {
onFailure(statusCode, headers, response.toString(), throwable); onFailure(statusCode, headers, response == null ? null:response.toString(), throwable);
} }
}); });
@ -261,17 +266,25 @@ public class ApiRestClient {
Log.e("API", "FAILURE ON REQUEST!"); Log.e("API", "FAILURE ON REQUEST!");
Log.e("API", throwable.getMessage()); Log.e("API", throwable.getMessage());
Log.e("API", "Status: "+statusCode); Log.e("API", "Status: "+statusCode);
Log.e("API", "Headers:"); if(headers == null){
for(Header header: headers) { Log.e("API", "\tNULL");
Log.e("API", "\t" + header.getName() + ": " + header.getValue()); } else {
for(Header header: headers) {
Log.e("API", "\t" + header.getName() + ": " + header.getValue());
}
} }
Log.e("API", "Response:"); Log.e("API", "Response:");
int maxLogSize = 1000; if(responseString == null) {
for(int i = 0; i <= responseString.length() / maxLogSize; i++) { Log.e("API", "\tNULL!");
int start = i * maxLogSize; }
int end = (i+1) * maxLogSize; else {
end = end > responseString.length() ? responseString.length() : end; int maxLogSize = 1000;
Log.e("API", responseString.substring(start, end)); for(int i = 0; i <= responseString.length() / maxLogSize; i++) {
int start = i * maxLogSize;
int end = (i+1) * maxLogSize;
end = end > responseString.length() ? responseString.length() : end;
Log.e("API", responseString.substring(start, end));
}
} }
} }
} }

View file

@ -6,6 +6,7 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.PointF; import android.graphics.PointF;
import android.util.Log;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@ -376,7 +377,9 @@ public class GameOpenHelper extends SQLiteOpenHelper {
} }
public int getLocalRankOfGame(Game game) { public int getLocalRankOfGame(Game game) {
String[] params = { Long.toString(game.scenario.id), Float.toString(game.score) }; String[] params = { Long.toString(game.scenario.id), Double.toString(game.score) };
Log.e("GAME",params[0].toString());
Log.e("GAME",params[1].toString());
Cursor c = getReadableDatabase().rawQuery("SELECT COUNT(id)+1 FROM games WHERE lvl_id = ? AND score > ?", params); Cursor c = getReadableDatabase().rawQuery("SELECT COUNT(id)+1 FROM games WHERE lvl_id = ? AND score > ?", params);
c.moveToFirst(); c.moveToFirst();
return c.getInt(0); return c.getInt(0);

View file

@ -56,9 +56,6 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
boolean has_camera_permission = false; boolean has_camera_permission = false;
Button restartButton;
Button nextLvlButton;
public SoundPool sound; public SoundPool sound;
public HashMap<Integer, Integer> soundIds = new HashMap<>(); public HashMap<Integer, Integer> soundIds = new HashMap<>();
@ -85,34 +82,6 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
mContentView = (TextView) findViewById(R.id.fullscreen_content); mContentView = (TextView) findViewById(R.id.fullscreen_content);
RelativeLayout videoLayout = (RelativeLayout) findViewById(R.id.video_layout); RelativeLayout videoLayout = (RelativeLayout) findViewById(R.id.video_layout);
restartButton = (Button) findViewById(R.id.restartButton);
restartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
startActivity(getIntent());
}
});
nextLvlButton = (Button) findViewById(R.id.nextLvlButton);
nextLvlButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
Intent intent = getIntent(); // trouble create new intent because of 'this'
intent.putExtra(INTENT_EXTRA_SCENARIO, currentScenario.getNextLevelId());
startActivity(intent);
}
});
// Set up the user interaction to manually show or hide the system UI.
mContentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// toggle();
}
});
//We create a custom SurfaceView that resizes itself to match the aspect ratio of the incoming camera frames //We create a custom SurfaceView that resizes itself to match the aspect ratio of the incoming camera frames
cameraPreview = new SurfaceView(this) { cameraPreview = new SurfaceView(this) {
@Override @Override
@ -344,53 +313,35 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
} }
public void finishLevel() { public void finishLevel() {
// setText("LEVEL ENDED");
stopDetector(); stopDetector();
// restartButton.setVisibility(View.VISIBLE);
// if(!currentScenario.isFinalLevel()) {
// nextLvlButton.setVisibility(View.VISIBLE);
// }
PlayerInfo playerInfo = player.getPlayerInfo(); PlayerInfo playerInfo = player.getPlayerInfo();
ScoreList scores = playerInfo.getScoresForLevel(currentScenario.id); // ScoreList scores = playerInfo.getScoresForLevel(currentScenario.id);
Score score = currentScenario.getScore(); // Score score = currentScenario.getScore();
//
if(score.score == currentScenario.getMaxScore()) { // if(score.score == currentScenario.getMaxScore()) {
// Maximum SCORE!! // // Maximum SCORE!!
// You nailed it! // // You nailed it!
} if(scores.isEmpty()) { // } if(scores.isEmpty()) {
// First play! Nice :-) // // First play! Nice :-)
} // }
else if(scores.isHighest(score)) { // else if(scores.isHighest(score)) {
// HIGHSCORE!!!!! // // HIGHSCORE!!!!!
} else { // } else {
// Better luck next time // // Better luck next time
} // }
// show the highscores (top 3?)...
// check whether this is the highest reached level by the player // check whether this is the highest reached level by the player
// ... used by 'continue' button in main menu // ... used by 'continue' button in main menu
Scenario nextScenario = new Scenario(currentScenario.getNextLevelId(), this); Scenario nextScenario = new Scenario(currentScenario.getNextLevelId(), this);
if(nextScenario.isHigherThen(playerInfo.reachedLevelId)) { if(currentScenario.minimumScore < currentScenario.game.score && nextScenario.isHigherThen(playerInfo.reachedLevelId)) {
// allow player to continue to next level :-)
playerInfo.reachedLevelId = nextScenario.id; playerInfo.reachedLevelId = nextScenario.id;
} }
scores.add(score); // scores.add(score);
player.savePlayerInfo(playerInfo); player.savePlayerInfo(playerInfo);
// String highscoreText = "TOPSCORES\n";
//
// ScoreList topscores = scores.getTopN(3); // TODO: only highscores for current lEVEL!!!!!!!
// int i = 0;
// for(Score topscore: topscores) {
// i++;
// highscoreText += String.format("%1$d. %2$.2f\n", i, topscore.score); //make line by line elements
// }
//
// TextView highscoreView = (TextView) findViewById(R.id.highscores);
// highscoreView.setText(highscoreText);
// highscoreView.setVisibility(View.VISIBLE);
finish(); finish();
GameOpenHelper gameHelper = new GameOpenHelper(getApplicationContext()); GameOpenHelper gameHelper = new GameOpenHelper(getApplicationContext());
@ -401,10 +352,5 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
intent.putExtra(ReviewActivity.INTENT_EXTRA_GAME_ID, currentScenario.game.id); intent.putExtra(ReviewActivity.INTENT_EXTRA_GAME_ID, currentScenario.game.id);
intent.putExtra(ReviewActivity.INTENT_EXTRA_FROM_GAME, true); intent.putExtra(ReviewActivity.INTENT_EXTRA_FROM_GAME, true);
startActivity(intent); startActivity(intent);
// Intent intent = new Intent(this, HighscoreActivity.class);
// intent.putExtra(HighscoreActivity.INTENT_EXTRA_SCORE_ID, score.id.toString());
// intent.putExtra(HighscoreActivity.INTENT_EXTRA_GAME_ID, currentScenario.game.id.toString());
// startActivity(intent);
} }
} }

View file

@ -1,5 +1,6 @@
package com.rubenvandeven.emotionhero; package com.rubenvandeven.emotionhero;
import android.app.ProgressDialog;
import android.content.Intent; import android.content.Intent;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.support.design.widget.FloatingActionButton; import android.support.design.widget.FloatingActionButton;
@ -216,7 +217,7 @@ public class HighscoreActivity extends AppCompatActivity {
for(Game game: games) { for(Game game: games) {
final long itemGameId = game.id; final long itemGameId = game.id;
i++; i++;
String highscoreText = String.format("%1$d. %2$.3f", i, game.score); //make line by line elements String highscoreText = String.format("%1$d. %2$.4f", i, game.score); //make line by line elements
TextView scoreItem = new TextView(getContext()); TextView scoreItem = new TextView(getContext());
scoreItem.setText(highscoreText); scoreItem.setText(highscoreText);
scoreItem.setTextColor(ContextCompat.getColor(getContext(), R.color.highscore)); scoreItem.setTextColor(ContextCompat.getColor(getContext(), R.color.highscore));
@ -272,6 +273,8 @@ public class HighscoreActivity extends AppCompatActivity {
startLvlButton.setOnClickListener(new View.OnClickListener() { startLvlButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
ProgressDialog dialog = ProgressDialog.show(getContext(), "",
getContext().getResources().getString(R.string.load_game_activity), true);
Intent intent = new Intent(getContext(), GamingActivity.class); Intent intent = new Intent(getContext(), GamingActivity.class);
intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, scenario.id); intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, scenario.id);
getActivity().finish(); getActivity().finish();

View file

@ -35,12 +35,10 @@ public class IntroActivity extends AppCompatActivity {
player = Player.getInstance(getApplicationContext()); player = Player.getInstance(getApplicationContext());
int extraLogoDelay; int extraLogoDelay = 0;
if(player.isNew()) { // if(player.isNew()) {
extraLogoDelay = 1500; // extraLogoDelay = 1500;
} else { // }
extraLogoDelay = 0;
}
View introView = findViewById(R.id.activity_intro); View introView = findViewById(R.id.activity_intro);

View file

@ -2,9 +2,11 @@ package com.rubenvandeven.emotionhero;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.app.ProgressDialog;
import android.content.Intent; import android.content.Intent;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.animation.AlphaAnimation; import android.view.animation.AlphaAnimation;
@ -17,6 +19,8 @@ public class MenuActivity extends AppCompatActivity {
Player player; Player player;
ProgressDialog loadGameDialog;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -81,14 +85,19 @@ public class MenuActivity extends AppCompatActivity {
startButton.setOnClickListener(new View.OnClickListener() { startButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
loadGameDialog = ProgressDialog.show(MenuActivity.this, "",
MenuActivity.this.getResources().getString(R.string.load_game_activity), true);
Intent intent = new Intent(MenuActivity.this, GamingActivity.class); Intent intent = new Intent(MenuActivity.this, GamingActivity.class);
startActivity(intent); startActivity(intent);
} }
}); });
continueButton.setOnClickListener(new View.OnClickListener() { continueButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
loadGameDialog= ProgressDialog.show(MenuActivity.this, "",
MenuActivity.this.getResources().getString(R.string.load_game_activity), true);
Intent intent = new Intent(MenuActivity.this, GamingActivity.class); Intent intent = new Intent(MenuActivity.this, GamingActivity.class);
intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, player.getPlayerInfo().reachedLevelId); intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, player.getPlayerInfo().reachedLevelId);
startActivity(intent); startActivity(intent);
@ -115,4 +124,11 @@ public class MenuActivity extends AppCompatActivity {
} }
@Override
protected void onResume() {
super.onResume();
if(loadGameDialog != null)
loadGameDialog.dismiss();
}
} }

View file

@ -1,17 +1,29 @@
package com.rubenvandeven.emotionhero; package com.rubenvandeven.emotionhero;
import android.app.ProgressDialog;
import android.content.Intent; import android.content.Intent;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.Log; import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.loopj.android.http.JsonHttpResponseHandler;
import org.json.JSONException;
import org.json.JSONObject;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
import cz.msebera.android.httpclient.Header;
public class ReviewActivity extends AppCompatActivity { public class ReviewActivity extends AppCompatActivity {
@ -27,6 +39,65 @@ public class ReviewActivity extends AppCompatActivity {
*/ */
protected boolean fromGame; protected boolean fromGame;
TextView lvlNameText;
TextView dateText;
TextView scoreText;
TextView overallScorePercText;
TextView overallScoreText;
TextView improveArrow;
TextView hintText;
RelativeLayout retryLayout;
TextView retryArrow;
TextView retryText;
RelativeLayout nextLvlLayout;
TextView nextLvlArrow;
TextView nextLvlText;
ProgressBar scoreProgressBar;
protected Runnable loadRemoteInfo = new Runnable() {
@Override
public void run() {
// retry until remoteId is set.
if(game.remoteId == null) {
final Handler handler = new Handler();
handler.postDelayed(loadRemoteInfo,500);
return;
} else {
player.api.get("/games/"+game.remoteId, null, new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
JSONObject position = response.getJSONObject("position");
// overallScorePercText.setText(String.format("%1$.0f%%", position.getDouble("percentage")));
overallScoreText.setText(String.format("You beat %1$.0f%%", position.getDouble("percentage")));
overallScorePercText.setText(Integer.toString(position.getInt("position")));
if(response.has("hint"))
{
hintText.setText(response.getString("hint"));
}
position.getInt("position");
scoreProgressBar.setVisibility(View.GONE);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Something went wrong when loading results", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String response, Throwable throwable) {
throwable.printStackTrace();
Log.e("API", response == null ? "NULL" : response);
Toast.makeText(getApplicationContext(), "Something went wrong when loading results", Toast.LENGTH_LONG).show();
scoreProgressBar.setVisibility(View.GONE);
}
});
}
}
};
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -60,13 +131,23 @@ public class ReviewActivity extends AppCompatActivity {
finish(); finish();
} }
TextView lvlNameText = (TextView) findViewById(R.id.lvlNameText); lvlNameText = (TextView) findViewById(R.id.lvlNameText);
TextView dateText = (TextView) findViewById(R.id.dateText); dateText = (TextView) findViewById(R.id.dateText);
TextView scoreText= (TextView) findViewById(R.id.scoreText); scoreText= (TextView) findViewById(R.id.scoreText);
TextView overallScorePercText= (TextView) findViewById(R.id.overallScorePercText); overallScorePercText= (TextView) findViewById(R.id.overallScorePercText);
TextView improveArrow = (TextView) findViewById(R.id.improveArrow); overallScoreText= (TextView) findViewById(R.id.overallScoreText);
TextView retryArrow = (TextView) findViewById(R.id.retryArrow);
improveArrow = (TextView) findViewById(R.id.improveArrow);
hintText = (TextView) findViewById(R.id.hintText);
retryLayout = (RelativeLayout) findViewById(R.id.retryLayout);
retryArrow = (TextView) findViewById(R.id.retryArrow);
retryText = (TextView) findViewById(R.id.retryText);
nextLvlLayout = (RelativeLayout) findViewById(R.id.nextLvlLayout);
nextLvlArrow = (TextView) findViewById(R.id.nextLvlArrow);
nextLvlText = (TextView) findViewById(R.id.nextLvlText);
scoreProgressBar = (ProgressBar) findViewById(R.id.scoreProgressBar);
Typeface font = Typeface.createFromAsset(getAssets(), "unifont-9.0.02.ttf"); Typeface font = Typeface.createFromAsset(getAssets(), "unifont-9.0.02.ttf");
@ -74,14 +155,78 @@ public class ReviewActivity extends AppCompatActivity {
overallScorePercText.setTypeface(font); overallScorePercText.setTypeface(font);
retryArrow.setTypeface(font); retryArrow.setTypeface(font);
improveArrow.setTypeface(font); improveArrow.setTypeface(font);
nextLvlArrow.setTypeface(font);
lvlNameText.setText("\""+game.scenario.toString()+"\""); lvlNameText.setText("\""+game.scenario.toString()+"\"");
PrettyTime p = new PrettyTime(); PrettyTime p = new PrettyTime();
dateText.setText(p.format(game.time)); dateText.setText(p.format(game.time));
scoreText.setText(String.format("%1$.3f", game.score)); scoreText.setText(String.format("%1$.4f", game.score));
overallScorePercText.setText(String.format("%1$.0f%%", 30f)); // overallScorePercText.setText(String.format("%1$.0f%%", 30f));
loadRemoteInfo.run();
retryLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), GamingActivity.class);
intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, game.scenario.id);
ProgressDialog dialog = ProgressDialog.show(ReviewActivity.this, "",
getApplicationContext().getResources().getString(R.string.load_game_activity), true);
finish();
startActivity(intent);
}
});
if(player.getPlayerInfo().hasAccessToLevel(game.scenario.getNextLevelId())) {
nextLvlLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), GamingActivity.class);
intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, game.scenario.getNextLevelId());
ProgressDialog dialog = ProgressDialog.show(ReviewActivity.this, "",
getApplicationContext().getResources().getString(R.string.load_game_activity), true);
finish();
startActivity(intent);
}
});
} else {
nextLvlText.setVisibility(View.GONE);
nextLvlLayout.setVisibility(View.GONE);
}
int rank = player.getGameOpenHelper().getLocalRankOfGame(game);
String personalScoreJudgement = rank < 7 ? "nice work!" : "you can do better.";
String retryString = "Your " + rank + intToPosition(rank) + " score, " + personalScoreJudgement + " Now, retry and improve your performance.";
retryText.setText(retryString);
}
/**
* Translate 1 => 1st, 2 => 2nd etc.
* Thanks to http://stackoverflow.com/a/23182005
* @param number
* @return
*/
public static String intToPosition(int number) {
String value = String.valueOf(number);
if(value.length() > 1) {
// Check for special case: 11 - 13 are all "th".
// So if the second to last digit is 1, it is "th".
char secondToLastDigit = value.charAt(value.length()-2);
if(secondToLastDigit == '1')
return "th";
}
char lastDigit = value.charAt(value.length()-1);
switch(lastDigit) {
case '1':
return "st";
case '2':
return "nd";
case '3':
return "rd";
default:
return "th";
}
} }
@Override @Override

View file

@ -40,6 +40,11 @@ public class Scenario {
float duration = 0; float duration = 0;
/**
* Minimum score to be able to pass to the next level.
*/
float minimumScore = 0;
/** /**
* If a game is beign played. * If a game is beign played.
*/ */

View file

@ -49,21 +49,6 @@
android:visibility="gone" android:visibility="gone"
/> />
<Button
android:text="@string/restart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/restartButton"
android:layout_gravity="center_vertical|center_horizontal"
android:visibility="gone" />
<Button
android:text="@string/nextLvl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/nextLvlButton"
android:layout_gravity="center_vertical|right"
android:visibility="gone" />
</FrameLayout> </FrameLayout>
</FrameLayout> </FrameLayout>

View file

@ -28,209 +28,269 @@
</android.support.v7.widget.Toolbar> </android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<TextView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:id="@+id/lvlNameText" android:layout_below="@+id/appbar">
tools:text="&quot;Please don't cry&quot;"
android:fontFamily="monospace"
android:textSize="24sp"
android:textColor="@color/textPrimary"
android:layout_below="@+id/appbar"
android:text="..."
android:layout_marginLeft="5dp"
android:layout_marginBottom="5dp" />
<TextView <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/lvlNameText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/dateText"
tools:text="10 minutes ago"
android:textColor="@color/textSecondary"
android:text="..."
android:layout_marginTop="0dp"
android:layout_marginLeft="@dimen/fab_margin" />
<TextView
android:text="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/dateText"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="55dp"
android:id="@+id/scoreText"
tools:text="1038.134"
android:textColor="@color/textPrimary"
android:textSize="45sp"
android:fontFamily="sans-serif-light"
android:textAlignment="textEnd"
android:layout_marginRight="@dimen/fab_margin" />
<ImageView
android:layout_height="wrap_content"
app:srcCompat="@drawable/winner"
android:id="@+id/imageView"
android:layout_below="@+id/dateText"
android:layout_alignLeft="@+id/dateText"
android:layout_alignStart="@+id/dateText"
android:layout_marginTop="40dp"
android:layout_toStartOf="@+id/scoreText"
android:layout_width="wrap_content"
android:layout_alignBottom="@+id/scoreText"
android:layout_marginLeft="0dp"
android:layout_marginBottom="-10dp"
android:layout_alignRight="@+id/dateText"
android:layout_alignEnd="@+id/dateText" />
<TextView
android:text="..."
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/overallScorePercText"
tools:text="30%"
android:textSize="33sp"
android:layout_alignTop="@+id/scoreText"
android:textAlignment="center"
android:layout_centerInParent="false"
android:layout_centerVertical="false"
android:textColor="@color/textHighlight"
android:layout_alignRight="@+id/imageView"
android:layout_alignEnd="@+id/imageView"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView" />
<TextView
android:text="overall position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView"
android:id="@+id/overallScoreText"
android:layout_alignRight="@+id/imageView"
android:layout_alignEnd="@+id/imageView"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView"
android:textAlignment="center"
android:textColor="@color/textSecondary" />
<TextView
android:text="IMPROVE"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/improveTitle"
android:fontFamily="sans-serif"
android:textColor="@color/textPrimary"
android:layout_below="@+id/overallScoreText"
android:layout_alignLeft="@+id/overallScoreText"
android:layout_alignStart="@+id/overallScoreText"
android:layout_marginTop="16dp"
android:layout_marginBottom="5dp" />
<TextView
android:text="You hit a 50% on the 2nd target, to get a 63% score, raise your brows 2% more."
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/improveTitle"
android:padding="@dimen/fab_margin"
android:id="@+id/hintText"
android:textColor="@color/textHighlight" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:padding="@dimen/fab_margin"
android:layout_below="@+id/hintText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/improveLayout">
<TextView
android:text="Compare scores to get even better!"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/improveText" >
android:layout_toLeftOf="@+id/improveArrow" <TextView
android:layout_centerInParent="true" android:layout_width="match_parent"
android:textColor="@color/textHighlight" /> android:layout_height="wrap_content"
android:id="@+id/lvlNameText"
tools:text="&quot;Please don't cry&quot;"
android:fontFamily="monospace"
android:textSize="24sp"
android:textColor="@color/textPrimary"
android:text="..."
android:layout_marginLeft="5dp"
android:layout_marginBottom="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/lvlNameText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/dateText"
tools:text="10 minutes ago"
android:textColor="@color/textSecondary"
android:text="..."
android:layout_marginTop="0dp"
android:layout_marginLeft="@dimen/fab_margin" />
<TextView
android:text="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/dateText"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="55dp"
android:id="@+id/scoreText"
tools:text="1038.134"
android:textColor="@color/textPrimary"
android:textSize="45sp"
android:fontFamily="sans-serif-light"
android:textAlignment="textEnd"
android:layout_marginRight="@dimen/fab_margin" />
<ImageView
android:layout_height="wrap_content"
app:srcCompat="@drawable/winner"
android:id="@+id/imageView"
android:layout_below="@+id/dateText"
android:layout_alignLeft="@+id/dateText"
android:layout_alignStart="@+id/dateText"
android:layout_marginTop="40dp"
android:layout_toStartOf="@+id/scoreText"
android:layout_width="wrap_content"
android:layout_alignBottom="@+id/scoreText"
android:layout_marginLeft="0dp"
android:layout_marginBottom="-10dp"
android:layout_alignRight="@+id/dateText"
android:layout_alignEnd="@+id/dateText" />
<TextView
android:text="..."
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/overallScorePercText"
tools:text="30%"
android:textSize="33sp"
android:layout_alignTop="@+id/scoreText"
android:textAlignment="center"
android:layout_centerInParent="false"
android:layout_centerVertical="false"
android:textColor="@color/textHighlight"
android:layout_alignRight="@+id/imageView"
android:layout_alignEnd="@+id/imageView"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView" />
<TextView
android:text="overall position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView"
android:id="@+id/overallScoreText"
android:layout_alignRight="@+id/imageView"
android:layout_alignEnd="@+id/imageView"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView"
android:textAlignment="center"
android:textColor="@color/textSecondary" />
<TextView
android:text=">" <TextView
android:layout_width="wrap_content" android:text="IMPROVE"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_alignParentRight="true" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:id="@+id/improveTitle"
android:id="@+id/improveArrow" android:fontFamily="sans-serif"
android:textColor="@color/textHighlight" android:textColor="@color/textPrimary"
android:textSize="36sp" android:layout_below="@+id/overallScoreText"
android:layout_centerInParent="true" /> android:layout_alignLeft="@+id/overallScoreText"
</RelativeLayout> android:layout_alignStart="@+id/overallScoreText"
android:layout_marginTop="16dp"
android:layout_marginBottom="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/improveTitle"
android:paddingLeft="@dimen/fab_margin"
android:paddingRight="@dimen/fab_margin"
android:paddingBottom="@dimen/fab_margin"
android:id="@+id/hintText"
android:textColor="@color/textHighlight"
tools:text="You hit a 50% on the 2nd target, to get a 63% score, raise your brows 2% more." />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:padding="@dimen/fab_margin"
android:layout_below="@+id/hintText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/improveLayout">
<TextView
android:text="Compare scores to get even better!"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/improveText"
android:layout_toLeftOf="@+id/improveArrow"
android:layout_centerInParent="true"
android:textColor="@color/textHighlight" />
<TextView <TextView
android:text="BEAT IT!" android:text=">"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/retryTitle" android:layout_alignParentRight="true"
android:fontFamily="sans-serif" android:layout_alignParentEnd="true"
android:textColor="@color/textPrimary" android:id="@+id/improveArrow"
android:layout_below="@+id/improveLayout" android:textColor="@color/textHighlight"
android:layout_alignLeft="@+id/overallScoreText" android:textSize="36sp"
android:layout_alignStart="@+id/overallScoreText" android:layout_centerInParent="true" />
android:layout_marginTop="16dp" </RelativeLayout>
android:layout_marginBottom="5dp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:padding="@dimen/fab_margin"
android:layout_below="@+id/retryTitle"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/retryLayout">
<TextView <TextView
android:text="Nice work! Now, retry and improve your performance." android:text="BEAT IT!"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/retryText" android:id="@+id/retryTitle"
android:layout_toLeftOf="@+id/retryArrow" android:fontFamily="sans-serif"
android:textColor="@color/textHighlight" android:textColor="@color/textPrimary"
android:layout_centerInParent="true" /> android:layout_below="@+id/improveLayout"
android:layout_alignLeft="@+id/overallScoreText"
android:layout_alignStart="@+id/overallScoreText"
android:layout_marginTop="16dp"
android:layout_marginBottom="5dp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:padding="@dimen/fab_margin"
android:layout_below="@+id/retryTitle"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/retryLayout">
<TextView
android:text="Nice work! Now, retry and improve your performance."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/retryText"
android:layout_toLeftOf="@+id/retryArrow"
android:textColor="@color/textHighlight"
android:layout_centerInParent="true" />
<TextView
android:text=">"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/retryArrow"
android:textColor="@color/textHighlight"
android:textSize="36sp"
android:layout_centerInParent="true" />
</RelativeLayout>
<TextView
android:text="CONTINUE"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/nextLvlTitle"
android:fontFamily="sans-serif"
android:textColor="@color/textPrimary"
android:layout_below="@+id/retryLayout"
android:layout_alignLeft="@+id/overallScoreText"
android:layout_alignStart="@+id/overallScoreText"
android:layout_marginTop="16dp"
android:layout_marginBottom="5dp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:padding="@dimen/fab_margin"
android:layout_below="@+id/nextLvlTitle"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginBottom="@dimen/fab_margin"
android:id="@+id/nextLvlLayout">
<TextView
android:text="Take it up a notch, and show off in the next level!"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/nextLvlText"
android:layout_toLeftOf="@+id/nextLvlArrow"
android:textColor="@color/textHighlight"
android:layout_centerInParent="true" />
<TextView
android:text=">"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/nextLvlArrow"
android:textColor="@color/textHighlight"
android:textSize="36sp"
android:layout_centerInParent="true" />
</RelativeLayout>
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/scoreProgressBar"
android:layout_alignTop="@+id/overallScorePercText"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView"
android:layout_alignRight="@+id/imageView"
android:indeterminate="true"
android:indeterminateTint="@color/textHighlight"
android:layout_alignEnd="@+id/imageView" />
</RelativeLayout>
</ScrollView>
<TextView
android:text=">"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/retryArrow"
android:textColor="@color/textHighlight"
android:textSize="36sp"
android:layout_centerInParent="true" />
</RelativeLayout>
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_alignTop="@+id/overallScorePercText"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView"
android:layout_alignRight="@+id/imageView"
android:indeterminate="true"
android:indeterminateTint="@color/textHighlight"
android:layout_alignEnd="@+id/imageView" />
</RelativeLayout> </RelativeLayout>

View file

@ -13,4 +13,5 @@
<string name="title_activity_highscore">HighscoreActivity</string> <string name="title_activity_highscore">HighscoreActivity</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="section_format">Hello World from section: %1$d</string> <string name="section_format">Hello World from section: %1$d</string>
<string name="load_game_activity">Loading training...</string>
</resources> </resources>