/**
* Copyright (C) 2013 Gundog Studios LLC.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.godsandtowers.graphics.menu.layouts;
import java.text.NumberFormat;
import java.util.HashMap;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ClipDrawable;
import android.text.format.DateUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.godsandtowers.R;
import com.godsandtowers.achievements.Achievement;
import com.godsandtowers.core.PlayerStats;
import com.godsandtowers.graphics.game.BitmapCache;
import com.godsandtowers.sprites.Races;
import com.godsandtowers.util.ADS;
import com.godsandtowers.util.ResourceUtilities;
import com.godsandtowers.util.TDWPreferences;
import com.gundogstudios.modules.Modules;
import com.gundogstudios.util.FastMath;
public class AchievementsLayout implements ILayout {
private static final float NOT_COMPLETED_ALPHA = .5f;
private LinearLayout achievementLayout;
private LinearLayout achievementsLayout;
private PlayerStats stats;
private Activity activity;
private ProgressBar progressBar;
private TextView currentLevel;
private TextView nextLevel;
private TextView currentXP;
private TextView wins;
private TextView losses;
private TextView longestGame;
private TextView shortestGame;
private TextView highestLevelBeaten;
private TextView highestScore;
private TextView bronze;
private TextView silver;
private TextView gold;
private TextView platinum;
private int widthPadding;
private HashMap<String, String> raceNames;
public AchievementsLayout(Activity activity, PlayerStats stats) {
this.activity = activity;
this.stats = stats;
raceNames = new HashMap<String, String>();
for (String race : Races.ALL_RACES_STRINGS) {
String name = ResourceUtilities.getString("race_" + race.toLowerCase());
raceNames.put(race, name);
}
}
private TextView generateView(Activity activity, int id) {
LinearLayout insideLayout = new LinearLayout(activity);
insideLayout.setOrientation(LinearLayout.HORIZONTAL);
insideLayout.setGravity(Gravity.CENTER_VERTICAL);
ImageView image = new ImageView(activity);
Bitmap bitmap = BitmapCache.getBitmap(id);
image.setImageBitmap(bitmap);
image.setPadding(0, 0, widthPadding, 0);
insideLayout.addView(image);
TextView textView = new TextView(activity);
textView.setTypeface((Typeface) Modules.PREFERENCES.get(TDWPreferences.TEXT_FONT, Typeface.DEFAULT));
textView.setTextColor(Color.WHITE);
insideLayout.addView(textView);
achievementLayout.addView(insideLayout);
return textView;
}
public LinearLayout getLayout() {
if (achievementLayout == null) {
this.widthPadding = Modules.PREFERENCES.get(TDWPreferences.PADDING, 0);
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
achievementLayout = (LinearLayout) inflater.inflate(R.layout.achievementlayout, null);
Typeface typeFace = (Typeface) Modules.PREFERENCES.get(TDWPreferences.TEXT_FONT, Typeface.DEFAULT);
currentLevel = (TextView) achievementLayout.findViewById(R.id.currentLevel);
currentLevel.setTypeface(typeFace);
nextLevel = (TextView) achievementLayout.findViewById(R.id.nextLevel);
nextLevel.setTypeface(typeFace);
currentXP = (TextView) achievementLayout.findViewById(R.id.currentXP);
currentXP.setTypeface(typeFace);
progressBar = (ProgressBar) achievementLayout.findViewById(R.id.progressBar);
BitmapDrawable full = new BitmapDrawable(activity.getResources(),
BitmapCache.getBitmap(R.drawable.achievement_progressbar_filled));
ClipDrawable progress = new ClipDrawable(full, Gravity.LEFT, ClipDrawable.HORIZONTAL);
progressBar.setProgressDrawable(progress);
progressBar.setMax(100);
progressBar.setClickable(false);
wins = generateView(activity, R.drawable.achievement_wins);
losses = generateView(activity, R.drawable.achievement_losses);
longestGame = generateView(activity, R.drawable.achievement_longest_game);
shortestGame = generateView(activity, R.drawable.achievement_quickest_game);
highestLevelBeaten = generateView(activity, R.drawable.achievement_highest_level_beaten);
highestScore = generateView(activity, R.drawable.achievement_high_score);
bronze = generateView(activity, R.drawable.trophy_bronze);
silver = generateView(activity, R.drawable.trophy_silver);
gold = generateView(activity, R.drawable.trophy_gold);
platinum = generateView(activity, R.drawable.trophy_platinum);
ImageView seperator = new ImageView(activity);
seperator.setImageBitmap(BitmapCache.getBitmap(R.drawable.menu_seperator));
achievementLayout.addView(seperator);
achievementsLayout = new LinearLayout(activity);
achievementsLayout.setOrientation(LinearLayout.VERTICAL);
achievementLayout.addView(achievementsLayout);
refresh();
ADS.placeADMobAd(achievementLayout);
}
return achievementLayout;
}
@Override
public void attach(LinearLayout baseLayout) {
baseLayout.addView(getLayout());
}
public void refresh() {
if (achievementLayout == null)
return;
Resources resources = activity.getResources();
currentLevel.setText("" + stats.getCurrentLevel());
nextLevel.setText("" + (stats.getCurrentLevel() + 1));
long xpToNextLevel = stats.getTotalXP() - PlayerStats.getLevelXP(stats.getCurrentLevel());
long xpNeeded = PlayerStats.getLevelXP(stats.getCurrentLevel() + 1)
- PlayerStats.getLevelXP(stats.getCurrentLevel());
float progress = (float) xpToNextLevel / (float) xpNeeded * 100f;
progressBar.setProgress(FastMath.round(progress));
currentXP.setText(stats.getTotalXP() + " " + resources.getString(R.string.achievements_XP));
wins.setText(resources.getString(R.string.achievements_wins) + ": " + stats.getWins());
losses.setText(resources.getString(R.string.achievements_losses) + ": " + stats.getLosses());
longestGame.setText(resources.getString(R.string.achievements_longestGame) + ": "
+ DateUtils.formatElapsedTime(stats.getLongestGame() / 1000));
shortestGame.setText(resources.getString(R.string.achievements_shortestGame)
+ ": "
+ ((stats.getShortestGame() == Long.MAX_VALUE) ? 0 : DateUtils.formatElapsedTime(stats
.getShortestGame() / 1000)));
highestLevelBeaten.setText(resources.getString(R.string.achievements_highestLevelBeaten) + ": "
+ stats.getHighestLevelBeaten());
highestScore.setText(resources.getString(R.string.achievements_highestScore) + ": " + stats.getHighestScore());
updateTrophyText(bronze, Achievement.BRONZE);
updateTrophyText(silver, Achievement.SILVER);
updateTrophyText(gold, Achievement.GOLD);
updateTrophyText(platinum, Achievement.PLATINUM);
updateAchievementLayout();
}
private void updateTrophyText(TextView view, int level) {
int completed = 0;
int total = 0;
for (Achievement achievement : stats.getAchievements()) {
if (level == achievement.getAchievementLevel()) {
total++;
if (achievement.isCompleted())
completed++;
}
}
view.setText(completed + "/" + total);
}
private void updateAchievementLayout() {
achievementsLayout.removeAllViews();
for (Achievement achievement : stats.getAchievements()) {
LinearLayout layout = new LinearLayout(activity);
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setGravity(Gravity.CENTER_VERTICAL);
ImageView image = new ImageView(activity);
Bitmap bitmap = BitmapCache.getBitmap(getTrophyIcon(achievement.getAchievementLevel()));
image.setImageBitmap(bitmap);
image.setPadding(0, 0, widthPadding / 2, 0);
layout.addView(image);
if (!achievement.isCompleted()) {
image.setAlpha(NOT_COMPLETED_ALPHA);
NumberFormat formatter = NumberFormat.getInstance();
formatter.setMaximumFractionDigits(0);
TextView textView = new TextView(activity);
textView.setText(formatter.format(achievement.getPercentComplete(stats) * 100f) + "%");
textView.setTypeface((Typeface) Modules.PREFERENCES.get(TDWPreferences.TEXT_FONT, Typeface.DEFAULT));
textView.setTextColor(Color.WHITE);
textView.setPadding(0, 0, widthPadding / 2, 0);
layout.addView(textView);
}
TextView textView = new TextView(activity);
textView.setText(ResourceUtilities.getAchievementInfo(achievement));
textView.setTypeface((Typeface) Modules.PREFERENCES.get(TDWPreferences.TEXT_FONT, Typeface.DEFAULT));
textView.setTextColor(Color.WHITE);
layout.addView(textView);
achievementsLayout.addView(layout);
}
}
private int getTrophyIcon(int level) {
switch (level) {
case Achievement.BRONZE:
return R.drawable.trophy_bronze;
case Achievement.SILVER:
return R.drawable.trophy_silver;
case Achievement.GOLD:
return R.drawable.trophy_gold;
case Achievement.PLATINUM:
return R.drawable.trophy_platinum;
default:
throw new RuntimeException("Unknown trophy type in Achievements Layout: " + level);
}
}
}