/* * Copyright 2015 Daniel Dittmar * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package dan.dit.whatsthat.riddle.achievement.holders; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import dan.dit.whatsthat.achievement.Achievement; import dan.dit.whatsthat.achievement.AchievementManager; import dan.dit.whatsthat.riddle.achievement.AchievementPropertiesMapped; import dan.dit.whatsthat.riddle.types.PracticalRiddleType; import dan.dit.whatsthat.util.general.ObserverController; /** * Created by daniel on 21.05.15. */ public class TestSubjectAchievementHolder implements AchievementHolder { private final Map<PracticalRiddleType, TypeAchievementHolder> mHolders = new HashMap<>(); private MiscAchievementHolder mMiscHolder; private DailyAchievementsHolder mDailyHolder; private final List<AchievementHolder> mAllHolders = new ArrayList<>(); private ObserverController<UnclaimedAchievementsCountListener, Void> mUnclaimedObserverController = new ObserverController<>(); public boolean refresh() { return mDailyHolder.refresh(); } /** * The interface for listening to the amount of unclaimed achievements. The event parameter * passed is null. */ public interface UnclaimedAchievementsCountListener extends ObserverController .Observer<Void> { // for naming and simplification only, no more methods required } public TestSubjectAchievementHolder(AchievementManager manager) { makeAchievements(manager); manager.addAchievementChangedListener(new AchievementManager.OnAchievementChangedListener() { @Override public void onDataEvent(AchievementManager.AchievementChangeEvent changeEvent) { switch (changeEvent.getChangedHint()) { case AchievementManager.CHANGED_GOT_CLAIMED: // fall through case AchievementManager.CHANGED_TO_RESET: // fall through case AchievementManager.CHANGED_TO_ACHIEVED_AND_UNCLAIMED: mUnclaimedObserverController.notifyObservers(null); } } }); } private boolean manageHolder(AchievementManager manager, AchievementHolder holder) { if (holder == null) { return false; } mAllHolders.add(holder); holder.makeAchievements(manager); return true; } public TypeAchievementHolder getTypeAchievementHolder(PracticalRiddleType type) { return mHolders.get(type); } public AchievementHolder getMiscAchievementHolder() { return mMiscHolder; } public AchievementHolder getDailyAchievementHolder() { return mDailyHolder; } public AchievementPropertiesMapped<String> getMiscData() { return mMiscHolder == null ? null : mMiscHolder.getData(); } @Override public void makeAchievements(AchievementManager manager) { mMiscHolder = new MiscAchievementHolder(); manageHolder(manager, mMiscHolder); for (PracticalRiddleType type : PracticalRiddleType.getAll()) { TypeAchievementHolder holder = type.getAchievementHolder(); if (manageHolder(manager, holder)) { mHolders.put(type, holder); } } mDailyHolder = new DailyAchievementsHolder(); manageHolder(manager, mDailyHolder); } @Override public void addDependencies() { for (AchievementHolder holder : mAllHolders) { holder.addDependencies(); } } @Override public void initAchievements() { for (AchievementHolder holder : mAllHolders) { holder.initAchievements(); } } @Override public List<Achievement> getAchievements() { List<Achievement> achievements = new ArrayList<>(); for (AchievementHolder holder : mAllHolders) { achievements.addAll(holder.getAchievements()); } return achievements; } @Override public int getExpectableTestSubjectScore(int testSubjectLevel) { int expectedResult = 0; for (AchievementHolder holder : mAllHolders) { expectedResult += holder.getExpectableTestSubjectScore(testSubjectLevel); } return expectedResult; } public List<AchievementHolder> getHolders() { return mAllHolders; } public void addUnclaimedAchievementsCountListener(UnclaimedAchievementsCountListener listener) { mUnclaimedObserverController.addObserver(listener); } public int getUnclaimedAchievementsCount() { int unclaimed = 0; for (AchievementHolder holder : mAllHolders) { for (Achievement achievement : holder.getAchievements()) { if (achievement.isRewardClaimable()) { unclaimed++; } } } return unclaimed; } public void removeUnclaimedAchievementsCountListener(UnclaimedAchievementsCountListener listener) { mUnclaimedObserverController.removeObserver(listener); } }