diff --git a/app/src/main/java/com/rubenvandeven/emotionhero/GamingActivity.java b/app/src/main/java/com/rubenvandeven/emotionhero/GamingActivity.java index cdf7940..069dd48 100644 --- a/app/src/main/java/com/rubenvandeven/emotionhero/GamingActivity.java +++ b/app/src/main/java/com/rubenvandeven/emotionhero/GamingActivity.java @@ -345,10 +345,10 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL public void finishLevel() { setText("LEVEL ENDED"); stopDetector(); - restartButton.setVisibility(View.VISIBLE); - if(!currentScenario.isFinalLevel()) { - nextLvlButton.setVisibility(View.VISIBLE); - } +// restartButton.setVisibility(View.VISIBLE); +// if(!currentScenario.isFinalLevel()) { +// nextLvlButton.setVisibility(View.VISIBLE); +// } PlayerInfo playerInfo = player.getPlayerInfo(); ScoreList scores = playerInfo.getScoresForLevel(currentScenario.id); @@ -372,23 +372,28 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL // ... used by 'continue' button in main menu Scenario nextScenario = new Scenario(currentScenario.getNextLevelId(), this); if(nextScenario.isHigherThen(playerInfo.reachedLevelId)) { - playerInfo.reachedLevelId = currentScenario.id; + playerInfo.reachedLevelId = nextScenario.id; } scores.add(score); player.savePlayerInfo(playerInfo); - String highscoreText = "TOPSCORES\n"; +// 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); - 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(); + Intent intent = new Intent(this, HighscoreActivity.class); + intent.putExtra(HighscoreActivity.INTENT_EXTRA_SCORE_ID, score.id.toString()); + startActivity(intent); } } diff --git a/app/src/main/java/com/rubenvandeven/emotionhero/HighscoreActivity.java b/app/src/main/java/com/rubenvandeven/emotionhero/HighscoreActivity.java index 461779e..8f6cba8 100644 --- a/app/src/main/java/com/rubenvandeven/emotionhero/HighscoreActivity.java +++ b/app/src/main/java/com/rubenvandeven/emotionhero/HighscoreActivity.java @@ -14,17 +14,26 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; +import java.util.UUID; + public class HighscoreActivity extends AppCompatActivity { + + public final static String INTENT_EXTRA_SCORE_ID = "com.rubenvandeven.emotionhero.SCORE_ID"; + /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a @@ -42,6 +51,13 @@ public class HighscoreActivity extends AppCompatActivity { Player player; + + /** + * If the intent is loaded from the game, it should show a specific highscorelist + * with the given score highligted + */ + Score score; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -50,6 +66,18 @@ public class HighscoreActivity extends AppCompatActivity { player = Player.getInstance(getApplicationContext()); + 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); + } + } + + Log.i("Highscore", ""+player.getPlayerInfo().reachedLevelId); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -62,25 +90,32 @@ public class HighscoreActivity extends AppCompatActivity { mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); + // if score is set, set current page. + if(score != null) { + int levelpage = Scenario.SCENARIOS.indexOf(score.lvl_id); + mViewPager.setCurrentItem(levelpage); + } + + // start the current level when pressing the big red button // ... but only if having access. - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - int lvl_id = mSectionsPagerAdapter.getLevelIdForPosition(mViewPager.getCurrentItem()); - if(!player.getPlayerInfo().hasAccessToLevel(lvl_id)) { - Snackbar.make(view, "No access to this level yet... complete the other levels first" , Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - } else { - Intent intent = new Intent(HighscoreActivity.this, GamingActivity.class); - intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, lvl_id); - finish(); - startActivity(intent); - } - } - }); +// FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); +// fab.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// int lvl_id = mSectionsPagerAdapter.getLevelIdForPosition(mViewPager.getCurrentItem()); +// if(!player.getPlayerInfo().hasAccessToLevel(lvl_id)) { +// Snackbar.make(view, "No access to this level yet... complete the other levels first" , Snackbar.LENGTH_LONG) +// .setAction("Action", null).show(); +// } else { +// Intent intent = new Intent(HighscoreActivity.this, GamingActivity.class); +// intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, lvl_id); +// finish(); +// startActivity(intent); +// } +// } +// }); } @@ -93,6 +128,7 @@ public class HighscoreActivity extends AppCompatActivity { * fragment. */ private static final String ARG_LVL_ID = "LVL_ID"; + private static final String ARG_SCORE_ID = "SCORE_ID"; public HighscoreFragment() { } @@ -101,10 +137,11 @@ public class HighscoreActivity extends AppCompatActivity { * Returns a new instance of this fragment for the given section * number. */ - public static HighscoreFragment newInstance(int lvl_id) { + public static HighscoreFragment newInstance(int lvl_id, String scoreIdString) { HighscoreFragment fragment = new HighscoreFragment(); Bundle args = new Bundle(); args.putInt(ARG_LVL_ID, lvl_id); + args.putString(ARG_SCORE_ID, scoreIdString); fragment.setArguments(args); return fragment; } @@ -112,14 +149,33 @@ public class HighscoreActivity extends AppCompatActivity { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_highscore, container, false); -// TextView textView = (TextView) rootView.findViewById(R.id.section_label); + + + Button startLvlButton = (Button) rootView.findViewById(R.id.startLvlButton); + Button nextLvlButton = (Button) rootView.findViewById(R.id.nextLvlButton); + + int lvl_id = getArguments().getInt(ARG_LVL_ID); + + Score score = null; + String scoreIdString = getArguments().getString(ARG_SCORE_ID); + + final Scenario scenario = new Scenario(lvl_id, null); + Player player = Player.getInstance(getContext()); - ScoreList scores = player.getPlayerInfo().getScoresForLevel(getArguments().getInt(ARG_LVL_ID)); + ScoreList scores = player.getPlayerInfo().getScoresForLevel(lvl_id); -// String highscoreText = ""; + if(scoreIdString != null) { + UUID scoreId = UUID.fromString(scoreIdString); + score = player.getPlayerInfo().getScore(scoreId); + } - ScoreList topscores = scores.getTopN(8); // TODO: only highscores for current lEVEL!!!!!!! + + TextView levelName = (TextView) rootView.findViewById(R.id.levelName); + levelName.setText(scenario.toString()); + + ScoreList topscores = scores.getTopN(5); LinearLayout topscoreList = (LinearLayout) rootView.findViewById(R.id.topscoreList); @@ -133,21 +189,81 @@ public class HighscoreActivity extends AppCompatActivity { topscoreList.addView(noScoreItemText); } + boolean foundScore = false; int i = 0; for(Score topscore: topscores) { i++; - String highscoreText = String.format("%1$d. %2$.2f\n", i, topscore.score); //make line by line elements + String highscoreText = String.format("%1$d. %2$.2f", i, topscore.score); //make line by line elements + TextView scoreItem = new TextView(getContext()); + scoreItem.setText(highscoreText); + scoreItem.setTextColor(ContextCompat.getColor(getContext(), R.color.highscore)); + float multiplier = 1 + (5-i)/5f; + scoreItem.setTextSize(getResources().getDimension(R.dimen.highscore_textsize) * multiplier); + scoreItem.setTypeface(Typeface.DEFAULT_BOLD); + topscoreList.addView(scoreItem); + + if(score != null && topscore.id == score.id) { + foundScore = true; + setBlinking(scoreItem); + } + } + + // if score is set.. but not a highscore... + if(score != null && foundScore == false) { + String highscoreText = String.format("\n... %1$.2f", score.score); //make line by line elements TextView scoreItem = new TextView(getContext()); scoreItem.setText(highscoreText); scoreItem.setTextColor(ContextCompat.getColor(getContext(), R.color.highscore)); scoreItem.setTextSize(getResources().getDimension(R.dimen.highscore_textsize)); scoreItem.setTypeface(Typeface.DEFAULT_BOLD); topscoreList.addView(scoreItem); + setBlinking(scoreItem); } + + + if(player.getPlayerInfo().hasAccessToLevel(lvl_id)) { + if(score != null) { // if we come from the level itself.. show retry! + startLvlButton.setText("Retry"); + } + startLvlButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getContext(), GamingActivity.class); + intent.putExtra(GamingActivity.INTENT_EXTRA_SCENARIO, scenario.id); + getActivity().finish(); + startActivity(intent); + } + }); + } else { + startLvlButton.setVisibility(View.INVISIBLE); + } + + if(scenario.isFinalLevel()) { + nextLvlButton.setVisibility(View.INVISIBLE); + } else { + nextLvlButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int next_lvl_id = scenario.getNextLevelId(); + int next_page_id = Scenario.SCENARIOS.indexOf(next_lvl_id); + ((HighscoreActivity)getActivity()).getViewPager().setCurrentItem(next_page_id, true); + } + }); + } + // textView.setText(highscoreText); // textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_LVL_ID))); return rootView; } + + public static void setBlinking(View viewToBlink) { + Animation anim = new AlphaAnimation(1.0f, 0.0f); + anim.setDuration(500); //You can manage the blinking time with this parameter +// anim.setStartOffset(20); + anim.setRepeatMode(Animation.REVERSE); + anim.setRepeatCount(Animation.INFINITE); + viewToBlink.startAnimation(anim); + } } /** @@ -165,7 +281,12 @@ public class HighscoreActivity extends AppCompatActivity { // getItem is called to instantiate the fragment for the given page. // Return a HighscoreFragment (defined as a static inner class below). // position is the used to get lvl_id. - return HighscoreFragment.newInstance(getLevelIdForPosition(position)); + int lvl_id = getLevelIdForPosition(position); + String scoreString = null; + if(score != null && lvl_id == score.lvl_id) { + scoreString = score.id.toString(); + } + return HighscoreFragment.newInstance(lvl_id, scoreString); } public int getLevelIdForPosition(int position) { @@ -191,4 +312,16 @@ public class HighscoreActivity extends AppCompatActivity { return null; } } + + + /** + * A little hack: http://stackoverflow.com/a/14777003 + */ + public ViewPager getViewPager() { + if (null == mViewPager) { + mViewPager = (ViewPager) findViewById(R.id.container); + } + return mViewPager; + } + } diff --git a/app/src/main/java/com/rubenvandeven/emotionhero/PlayerInfo.java b/app/src/main/java/com/rubenvandeven/emotionhero/PlayerInfo.java index 62038c1..711501f 100644 --- a/app/src/main/java/com/rubenvandeven/emotionhero/PlayerInfo.java +++ b/app/src/main/java/com/rubenvandeven/emotionhero/PlayerInfo.java @@ -10,6 +10,9 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.UUID; + +import static com.google.gson.internal.bind.TypeAdapters.UUID; /** * Created by ruben on 20/08/16. @@ -76,4 +79,15 @@ public class PlayerInfo { return Scenario.isHigherLevel(reachedLevelId, lvl_id); } + public Score getScore(UUID score_id) { + for(ScoreList scores: levelScores.values()) { + for(Score score: scores) { + if(score.id != null && score.id.equals(score_id)) { + return score; + } + } + } + return null; + } + } diff --git a/app/src/main/java/com/rubenvandeven/emotionhero/Scenario.java b/app/src/main/java/com/rubenvandeven/emotionhero/Scenario.java index 749074c..8ebd231 100644 --- a/app/src/main/java/com/rubenvandeven/emotionhero/Scenario.java +++ b/app/src/main/java/com/rubenvandeven/emotionhero/Scenario.java @@ -356,4 +356,19 @@ public class Scenario { return SCENARIOS.indexOf(lvl_id) > SCENARIOS.indexOf(then_lvl_id); } + public String toString() { + + switch(id) { + case LVL_ANGER: + return "I am sooo ANGRY"; + case LVL_JOY: + return "Let's be joyfull!"; + case LVL_SURPRISE: + return "What a surprise"; + case LVL_SADDNESS: + return "Please, don't cry..."; + } + return "..."; + } + } diff --git a/app/src/main/java/com/rubenvandeven/emotionhero/Score.java b/app/src/main/java/com/rubenvandeven/emotionhero/Score.java index c3c486b..d816371 100644 --- a/app/src/main/java/com/rubenvandeven/emotionhero/Score.java +++ b/app/src/main/java/com/rubenvandeven/emotionhero/Score.java @@ -2,13 +2,14 @@ package com.rubenvandeven.emotionhero; import java.util.ArrayList; import java.util.Date; +import java.util.UUID; /** * Created by ruben on 19/08/16. */ public class Score { - public int id; + public UUID id = UUID.randomUUID(); public int lvl_id; public float score; public Date time; diff --git a/app/src/main/java/com/rubenvandeven/emotionhero/ScoreList.java b/app/src/main/java/com/rubenvandeven/emotionhero/ScoreList.java index 27262d3..bd59e4e 100644 --- a/app/src/main/java/com/rubenvandeven/emotionhero/ScoreList.java +++ b/app/src/main/java/com/rubenvandeven/emotionhero/ScoreList.java @@ -10,13 +10,6 @@ import java.util.Comparator; public class ScoreList extends ArrayList{ - public boolean add(Score score) { - boolean ret = super.add(score); - int id = super.indexOf(score); - score.id = id; - return ret; - } - /** * Check if given highscore is highest hit in this set. * @param score diff --git a/app/src/main/res/layout/activity_highscore.xml b/app/src/main/res/layout/activity_highscore.xml index d9042a1..f9d96c7 100644 --- a/app/src/main/res/layout/activity_highscore.xml +++ b/app/src/main/res/layout/activity_highscore.xml @@ -8,12 +8,18 @@ android:fitsSystemWindows="true" tools:context="com.rubenvandeven.emotionhero.HighscoreActivity"> + + + android:theme="@style/AppTheme.AppBarOverlay" + > + android:background="@color/colorPrimary" + android:layout_below="@+id/appbar" /> - + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_highscore.xml b/app/src/main/res/layout/fragment_highscore.xml index 186ef27..87ac5ee 100644 --- a/app/src/main/res/layout/fragment_highscore.xml +++ b/app/src/main/res/layout/fragment_highscore.xml @@ -18,8 +18,46 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" + + android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" - android:layout_alignParentBottom="true"> + android:layout_above="@+id/highscoreActions"> + + + + + + + + +