New highscore system which gets synced to api.emotionhero

This commit is contained in:
Ruben 2016-09-04 00:03:22 +01:00
parent f5fa4ead2f
commit c5f2ffb67c
17 changed files with 495 additions and 91 deletions

View file

@ -30,5 +30,6 @@ dependencies {
compile 'com.google.code.gson:gson:2.4' compile 'com.google.code.gson:gson:2.4'
compile 'com.android.support:design:23.4.0' compile 'com.android.support:design:23.4.0'
compile 'com.loopj.android:android-async-http:1.4.9' compile 'com.loopj.android:android-async-http:1.4.9'
compile 'org.ocpsoft.prettytime:prettytime:4.0.1.Final'
testCompile 'junit:junit:4.12' testCompile 'junit:junit:4.12'
} }

View file

@ -48,8 +48,12 @@
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value="com.rubenvandeven.emotionhero.MenuActivity" /> android:value="com.rubenvandeven.emotionhero.MenuActivity" />
</activity> </activity>
<activity android:name=".CreditsActivity" <activity
android:theme="@style/FullscreenTheme"></activity> android:name=".CreditsActivity"
android:theme="@style/FullscreenTheme" />
<activity android:name=".ReviewActivity"
android:theme="@style/AppTheme.NoActionBar"></activity>
</application> </application>
</manifest> </manifest>

Binary file not shown.

View file

@ -17,6 +17,10 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
import cz.msebera.android.httpclient.Header; import cz.msebera.android.httpclient.Header;
import cz.msebera.android.httpclient.HeaderElement; import cz.msebera.android.httpclient.HeaderElement;
@ -165,13 +169,17 @@ public class ApiRestClient {
try { try {
j.put("lvl_id", game.scenario.id); j.put("lvl_id", game.scenario.id);
j.put("score", game.score); j.put("score", game.score);
j.put("time", game.time); TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
df.setTimeZone(tz);
j.put("time", df.format(game.time));
JSONArray jHits = new JSONArray(); JSONArray jHits = new JSONArray();
j.put("hits", jHits); j.put("hits", jHits);
for(Hit hit: game.hits.values()) { for(Hit hit: game.hits.values()) {
JSONObject jHit = new JSONObject(); JSONObject jHit = new JSONObject();
jHit.put("id", hit.id);
jHit.put("target_index", hit.target.index); jHit.put("target_index", hit.target.index);
jHit.put("score", hit.score); jHit.put("score", hit.score);
jHit.put("glasses", hit.glasses); jHit.put("glasses", hit.glasses);
@ -241,6 +249,11 @@ public class ApiRestClient {
handleOnFailure(statusCode, headers, responseString, throwable); handleOnFailure(statusCode, headers, responseString, throwable);
} }
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject response) {
onFailure(statusCode, headers, response.toString(), throwable);
}
}); });
} }
@ -253,6 +266,12 @@ public class ApiRestClient {
Log.e("API", "\t" + header.getName() + ": " + header.getValue()); Log.e("API", "\t" + header.getName() + ": " + header.getValue());
} }
Log.e("API", "Response:"); Log.e("API", "Response:");
Log.e("API", responseString); int maxLogSize = 1000;
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

@ -201,24 +201,8 @@ public class GameOpenHelper extends SQLiteOpenHelper {
} }
public Game[] getGamesForLevel(int lvl_id) { public Game[] getGamesForLevel(int lvl_id) {
SQLiteDatabase db = getReadableDatabase(); Scenario scenario = new Scenario(lvl_id, null);
return getGamesForScenario(scenario);
String selection = "lvl_id = ?";
String[] selectionArgs = { Integer.toString(lvl_id) };
String sortOrder = "score DESC";
Cursor c = db.query(
GAME_TABLE_NAME, // The table to query
GAME_PROJECTION, // The columns to return
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder, // The sort order
null // no limit!
);
return cursorToGames(c, null);
} }
public Game[] getGamesForScenario(Scenario s) { public Game[] getGamesForScenario(Scenario s) {
@ -249,7 +233,7 @@ public class GameOpenHelper extends SQLiteOpenHelper {
c.moveToFirst(); c.moveToFirst();
while (!c.isAfterLast()) { while (!c.isAfterLast()) {
Scenario scenario = s == null ? new Scenario(c.getInt(1), null) : s; Scenario scenario = s == null ? new Scenario(c.getInt(1), null) : s;
Game game = new Game(c.getLong(0), scenario, c.getFloat(2), new Date(c.getInt(3)), c.getString(4)); Game game = new Game(c.getLong(0), scenario, c.getFloat(2), new Date(c.getLong(3)), c.getString(4));
games[i] = game; games[i] = game;
this.getHitsForGame(game); // hits are appended to game object this.getHitsForGame(game); // hits are appended to game object
i++; i++;

View file

@ -396,9 +396,15 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
GameOpenHelper gameHelper = new GameOpenHelper(getApplicationContext()); GameOpenHelper gameHelper = new GameOpenHelper(getApplicationContext());
gameHelper.insertGame(currentScenario.game); gameHelper.insertGame(currentScenario.game);
Intent intent = new Intent(this, HighscoreActivity.class);
intent.putExtra(HighscoreActivity.INTENT_EXTRA_SCORE_ID, score.id.toString()); Intent intent = new Intent(this, ReviewActivity.class);
intent.putExtra(HighscoreActivity.INTENT_EXTRA_GAME_ID, currentScenario.game.id.toString()); intent.putExtra(ReviewActivity.INTENT_EXTRA_GAME_ID, currentScenario.game.id);
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

@ -27,6 +27,8 @@ import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.ocpsoft.prettytime.PrettyTime;
import java.util.UUID; import java.util.UUID;
public class HighscoreActivity extends AppCompatActivity { public class HighscoreActivity extends AppCompatActivity {
@ -58,6 +60,7 @@ public class HighscoreActivity extends AppCompatActivity {
* with the given score highligted * with the given score highligted
*/ */
Score score; Score score;
Game game;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -67,15 +70,17 @@ public class HighscoreActivity extends AppCompatActivity {
player = Player.getInstance(getApplicationContext()); player = Player.getInstance(getApplicationContext());
String scoreIdString = getIntent().getStringExtra(INTENT_EXTRA_SCORE_ID); // // get score from Intent
// String scoreIdString = getIntent().getStringExtra(INTENT_EXTRA_SCORE_ID);
// if(scoreIdString != null) {
// UUID score_id = UUID.fromString(scoreIdString);
// score = player.getPlayerInfo().getScore(score_id);
// if(score == null) {
// Log.e("Highscore", "CANNOT FIND SCORE!! " + scoreIdString);
// }
// }
// get game from Intent
String gameIdString = getIntent().getStringExtra(INTENT_EXTRA_GAME_ID); String gameIdString = getIntent().getStringExtra(INTENT_EXTRA_GAME_ID);
if(scoreIdString != null) {
UUID score_id = UUID.fromString(scoreIdString);
score = player.getPlayerInfo().getScore(score_id);
if(score == null) {
Log.e("Highscore", "CANNOT FIND SCORE!! " + scoreIdString);
}
}
if(gameIdString != null) { if(gameIdString != null) {
long gameId = Long.valueOf(gameIdString); long gameId = Long.valueOf(gameIdString);
Game game = player.getGameOpenHelper().getGameByid(gameId); Game game = player.getGameOpenHelper().getGameByid(gameId);
@ -102,9 +107,9 @@ public class HighscoreActivity extends AppCompatActivity {
mViewPager = (ViewPager) findViewById(R.id.container); mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setAdapter(mSectionsPagerAdapter);
// if score is set, set current page. // if game is set, set current page.
if(score != null) { if(game != null) {
int levelpage = Scenario.SCENARIOS.indexOf(score.lvl_id); int levelpage = Scenario.SCENARIOS.indexOf(game.scenario.id);
mViewPager.setCurrentItem(levelpage); mViewPager.setCurrentItem(levelpage);
} }
@ -140,7 +145,7 @@ public class HighscoreActivity extends AppCompatActivity {
* fragment. * fragment.
*/ */
private static final String ARG_LVL_ID = "LVL_ID"; private static final String ARG_LVL_ID = "LVL_ID";
private static final String ARG_SCORE_ID = "SCORE_ID"; private static final String ARG_GAME_ID = "GAME_ID";
public HighscoreFragment() { public HighscoreFragment() {
} }
@ -149,11 +154,13 @@ public class HighscoreActivity extends AppCompatActivity {
* Returns a new instance of this fragment for the given section * Returns a new instance of this fragment for the given section
* number. * number.
*/ */
public static HighscoreFragment newInstance(int lvl_id, String scoreIdString) { public static HighscoreFragment newInstance(int lvl_id, Long gameId) {
HighscoreFragment fragment = new HighscoreFragment(); HighscoreFragment fragment = new HighscoreFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putInt(ARG_LVL_ID, lvl_id); args.putInt(ARG_LVL_ID, lvl_id);
args.putString(ARG_SCORE_ID, scoreIdString); if(gameId != null) {
args.putLong(ARG_GAME_ID, gameId);
}
fragment.setArguments(args); fragment.setArguments(args);
return fragment; return fragment;
} }
@ -170,28 +177,28 @@ public class HighscoreActivity extends AppCompatActivity {
int lvl_id = getArguments().getInt(ARG_LVL_ID); int lvl_id = getArguments().getInt(ARG_LVL_ID);
Score score = null; Game currentGame = null;
String scoreIdString = getArguments().getString(ARG_SCORE_ID); long gameId= getArguments().getLong(ARG_GAME_ID);
final Scenario scenario = new Scenario(lvl_id, null); final Scenario scenario = new Scenario(lvl_id, null);
Player player = Player.getInstance(getContext()); Player player = Player.getInstance(getContext());
ScoreList scores = player.getPlayerInfo().getScoresForLevel(lvl_id); GameOpenHelper gameOpenHelper = player.getGameOpenHelper();
if(scoreIdString != null) { Game[] games = gameOpenHelper.getGamesForScenario(scenario);
UUID scoreId = UUID.fromString(scoreIdString);
score = player.getPlayerInfo().getScore(scoreId); if(gameId != 0) {
Log.d("Highscore", "Request game: " + gameId);
currentGame = gameOpenHelper.getGameByid(gameId);
} }
TextView levelName = (TextView) rootView.findViewById(R.id.levelName); TextView levelName = (TextView) rootView.findViewById(R.id.levelName);
levelName.setText(scenario.toString()); levelName.setText("\""+scenario.toString()+"\"");
ScoreList topscores = scores.getTopN(5);
LinearLayout topscoreList = (LinearLayout) rootView.findViewById(R.id.topscoreList); LinearLayout topscoreList = (LinearLayout) rootView.findViewById(R.id.topscoreList);
if(topscores.size() == 0) { if(games.length == 0) {
// TextView noScoreItemText = new TextView(getContext(), null, R.style.AppTheme); // TextView noScoreItemText = new TextView(getContext(), null, R.style.AppTheme);
TextView noScoreItemText = new TextView(getContext()); TextView noScoreItemText = new TextView(getContext());
noScoreItemText.setText("No Scores"); noScoreItemText.setText("No Scores");
@ -201,40 +208,65 @@ public class HighscoreActivity extends AppCompatActivity {
topscoreList.addView(noScoreItemText); topscoreList.addView(noScoreItemText);
} }
PrettyTime prettyTime = new PrettyTime();
boolean foundScore = false; boolean foundScore = false;
int i = 0; int i = 0;
for(Score topscore: topscores) { for(Game game: games) {
final long itemGameId = game.id;
i++; i++;
String highscoreText = String.format("%1$d. %2$.2f", i, topscore.score); //make line by line elements String highscoreText = String.format("%1$d. %2$.3f", 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));
float multiplier = 1 + (5-i)/5f; scoreItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), ReviewActivity.class);
intent.putExtra(ReviewActivity.INTENT_EXTRA_GAME_ID, itemGameId);
startActivity(intent);
// don't finish.. keep previous button :-)
}
});
float multiplier = i <= 5 ? 1 + (5-i)/5f : 1f;
scoreItem.setTextSize(getResources().getDimension(R.dimen.highscore_textsize) * multiplier); scoreItem.setTextSize(getResources().getDimension(R.dimen.highscore_textsize) * multiplier);
scoreItem.setTypeface(Typeface.DEFAULT_BOLD); scoreItem.setTypeface(Typeface.DEFAULT_BOLD);
topscoreList.addView(scoreItem); topscoreList.addView(scoreItem);
if(score != null && topscore.id == score.id) { TextView dateItem = new TextView(getContext());
dateItem.setText(prettyTime.format(game.time));
dateItem.setTextColor(ContextCompat.getColor(getContext(), R.color.textSecondary));
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
llp.setMargins(0, -20, 0, 0); // llp.setMargins(left, top, right, bottom);
dateItem.setLayoutParams(llp);
dateItem.setTypeface(Typeface.DEFAULT);
topscoreList.addView(dateItem);
if(currentGame != null && currentGame.id == game.id) {
foundScore = true; foundScore = true;
setBlinking(scoreItem); setBlinking(scoreItem);
topscoreList.requestChildFocus(scoreItem, scoreItem); // scroll to item??
} }
} }
// if score is set.. but not a highscore... // we now display all scores :-)
if(score != null && foundScore == false) { // // if score is set.. but not a highscore...
String highscoreText = String.format("\n... %1$.2f", score.score); //make line by line elements // if(score != null && foundScore == false) {
TextView scoreItem = new TextView(getContext()); // String highscoreText = String.format("\n... %1$.2f", score.score); //make line by line elements
scoreItem.setText(highscoreText); // TextView scoreItem = new TextView(getContext());
scoreItem.setTextColor(ContextCompat.getColor(getContext(), R.color.highscore)); // scoreItem.setText(highscoreText);
scoreItem.setTextSize(getResources().getDimension(R.dimen.highscore_textsize)); // scoreItem.setTextColor(ContextCompat.getColor(getContext(), R.color.highscore));
scoreItem.setTypeface(Typeface.DEFAULT_BOLD); // scoreItem.setTextSize(getResources().getDimension(R.dimen.highscore_textsize));
topscoreList.addView(scoreItem); // scoreItem.setTypeface(Typeface.DEFAULT_BOLD);
setBlinking(scoreItem); // topscoreList.addView(scoreItem);
} // setBlinking(scoreItem);
// }
if(player.getPlayerInfo().hasAccessToLevel(lvl_id)) { if(player.getPlayerInfo().hasAccessToLevel(lvl_id)) {
if(score != null) { // if we come from the level itself.. show retry! if(currentGame != null) { // if we come from the level itself.. show retry!
startLvlButton.setText("Retry"); startLvlButton.setText("Retry");
} }
startLvlButton.setOnClickListener(new View.OnClickListener() { startLvlButton.setOnClickListener(new View.OnClickListener() {
@ -294,11 +326,11 @@ public class HighscoreActivity extends AppCompatActivity {
// Return a HighscoreFragment (defined as a static inner class below). // Return a HighscoreFragment (defined as a static inner class below).
// position is the used to get lvl_id. // position is the used to get lvl_id.
int lvl_id = getLevelIdForPosition(position); int lvl_id = getLevelIdForPosition(position);
String scoreString = null; Long gameId = null;
if(score != null && lvl_id == score.lvl_id) { if(game != null && lvl_id == game.scenario.id) {
scoreString = score.id.toString(); gameId = game.id;
} }
return HighscoreFragment.newInstance(lvl_id, scoreString); return HighscoreFragment.newInstance(lvl_id, gameId);
} }
public int getLevelIdForPosition(int position) { public int getLevelIdForPosition(int position) {

View file

@ -0,0 +1,105 @@
package com.rubenvandeven.emotionhero;
import android.content.Intent;
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.TextView;
import org.ocpsoft.prettytime.PrettyTime;
public class ReviewActivity extends AppCompatActivity {
public final static String INTENT_EXTRA_GAME_ID = "com.rubenvandeven.emotionhero.GAME_ID";
public final static String INTENT_EXTRA_FROM_GAME = "com.rubenvandeven.emotionhero.FROM_GAME";
protected Player player;
protected Game game;
/**
* Whether this activity is loaded from the game (else from highscores)
*/
protected boolean fromGame;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_review);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Score");
player = Player.getInstance(getApplicationContext());
// get game from Intent
long gameId = getIntent().getLongExtra(INTENT_EXTRA_GAME_ID, 0);
fromGame = getIntent().getBooleanExtra(INTENT_EXTRA_FROM_GAME, false);
Log.d("Review", "gameid:" + gameId);
if(gameId != 0) {
game = player.getGameOpenHelper().getGameByid(gameId);
if(game == null) {
Log.e("Highscore", "CANNOT FIND GAME!! " + gameId);
throw new RuntimeException("Cannot find specified game");
} else {
Log.i("Highscore", "FOUND GAME" + game.id + " " + game.score);
Log.i("Highscore", "RANK " + player.getGameOpenHelper().getLocalRankOfGame(game));
player.api.syncGame(game); // sync game if that is not already done
}
} else {
// no game specified??? SHould not be possible so finish
finish();
}
TextView lvlNameText = (TextView) findViewById(R.id.lvlNameText);
TextView dateText = (TextView) findViewById(R.id.dateText);
TextView scoreText= (TextView) findViewById(R.id.scoreText);
TextView overallScorePercText= (TextView) findViewById(R.id.overallScorePercText);
TextView improveArrow = (TextView) findViewById(R.id.improveArrow);
TextView retryArrow = (TextView) findViewById(R.id.retryArrow);
Typeface font = Typeface.createFromAsset(getAssets(), "unifont-9.0.02.ttf");
lvlNameText.setTypeface(font);
overallScorePercText.setTypeface(font);
retryArrow.setTypeface(font);
improveArrow.setTypeface(font);
lvlNameText.setText("\""+game.scenario.toString()+"\"");
PrettyTime p = new PrettyTime();
dateText.setText(p.format(game.time));
scoreText.setText(String.format("%1$.3f", game.score));
overallScorePercText.setText(String.format("%1$.0f%%", 30f));
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem)
{
switch (menuItem.getItemId()) {
case android.R.id.home:
if(fromGame) {
Intent intent = new Intent(getApplicationContext(), HighscoreActivity.class);
intent.putExtra(HighscoreActivity.INTENT_EXTRA_GAME_ID, game.id);
finish();
startActivity(intent);
} else {
onBackPressed();
}
return true;
default:
return super.onOptionsItemSelected(menuItem);
}
}
}

View file

@ -136,7 +136,7 @@ public class Scenario {
if(target.timestamp <= runningTime) { if(target.timestamp <= runningTime) {
float scored_value = target.emotion.getValueFromFace(currentFace); float scored_value = target.emotion.getValueFromFace(currentFace);
float required_value = target.value; float required_value = target.value;
float score = Math.round(100 - Math.abs(scored_value-required_value)); float score = 100 - Math.abs(scored_value-required_value);
Hit hit = new Hit(target, game, currentFace, score); Hit hit = new Hit(target, game, currentFace, score);
// //

View file

@ -198,7 +198,7 @@ public class ScenarioView extends SurfaceView implements SurfaceHolder.Callback
if(target.isHit) { if(target.isHit) {
Hit hit = _scenario.getHitForTarget(target); Hit hit = _scenario.getHitForTarget(target);
canvas.drawText(Float.toString(hit.score), cx, cy, emoPaints.get(target.emotion)); canvas.drawText(Integer.toString(Math.round(hit.score)), cx, cy, emoPaints.get(target.emotion));
canvas.drawCircle(cx, cy, max_ball_radius * hit.score/100, emoScoredPaints.get(target.emotion)); canvas.drawCircle(cx, cy, max_ball_radius * hit.score/100, emoScoredPaints.get(target.emotion));
// TODO: Use target.hit.face to set Rect src. // TODO: Use target.hit.face to set Rect src.

View file

@ -6,6 +6,8 @@ import java.util.UUID;
/** /**
* Created by ruben on 19/08/16. * Created by ruben on 19/08/16.
*
* @deprecated
*/ */
public class Score { public class Score {

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View file

@ -41,7 +41,9 @@
\n\nThis project is produced as part of the Summer Sessions Network for Talent Development in a co-production of Arquivo 237 and V2_ Institute for the Unstable Media.\n \n\nThis project is produced as part of the Summer Sessions Network for Talent Development in a co-production of Arquivo 237 and V2_ Institute for the Unstable Media.\n
\n\nEmotional intelligence powered by Affectiva." \n\nEmotional intelligence powered by Affectiva.
\n\n Font used:\n - Unifont CSUR - GPL"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/textView" /> android:id="@+id/textView" />

View file

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/activity_review"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.rubenvandeven.emotionhero.ReviewActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/appbar_padding_top"
android:theme="@style/AppTheme.AppBarOverlay"
android:layout_marginBottom="10dp"
>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:titleTextColor="@color/textHighlight">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<TextView
android:layout_width="match_parent"
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:layout_below="@+id/appbar"
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="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_height="wrap_content"
android:id="@+id/improveText"
android:layout_toLeftOf="@+id/improveArrow"
android:layout_centerInParent="true"
android:textColor="@color/textHighlight" />
<TextView
android:text=">"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/improveArrow"
android:textColor="@color/textHighlight"
android:textSize="36sp"
android:layout_centerInParent="true" />
</RelativeLayout>
<TextView
android:text="BEAT IT!"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/retryTitle"
android:fontFamily="sans-serif"
android:textColor="@color/textPrimary"
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>
<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>

View file

@ -13,16 +13,20 @@
<!--android:layout_width="wrap_content"--> <!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content" />--> <!--android:layout_height="wrap_content" />-->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/highscoreActions">
<LinearLayout <LinearLayout
android:id="@+id/topscoreList" android:id="@+id/topscoreList"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" android:layout_alignParentStart="true">
android:layout_above="@+id/highscoreActions">
<TextView <TextView
android:text="..." android:text="..."
@ -35,6 +39,8 @@
</LinearLayout> </LinearLayout>
</ScrollView>
<LinearLayout <LinearLayout
android:orientation="horizontal" android:orientation="horizontal"

View file

@ -16,4 +16,7 @@
<color name="emotion_joy">#ff00ff</color> <color name="emotion_joy">#ff00ff</color>
<color name="emotion_sadness">#ff8c00</color> <color name="emotion_sadness">#ff8c00</color>
<color name="emotion_surprise">#00aaff</color> <color name="emotion_surprise">#00aaff</color>
<color name="textPrimary">#ffffff</color>
<color name="textSecondary">#999999</color>
<color name="textHighlight">#ffff00</color>
</resources> </resources>

View file

@ -44,4 +44,8 @@
<item name="android:color">@color/highscore</item> <item name="android:color">@color/highscore</item>
</style> </style>
<style name="reviewToolbarTitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textStyle">bold</item>
</style>
</resources> </resources>