package com.mediamonks.googleflip.data.models; import android.content.ContentValues; import android.content.Context; import android.util.Log; import com.mediamonks.googleflip.data.constants.LevelColor; import com.mediamonks.googleflip.data.constants.LevelResult; import com.mediamonks.googleflip.data.constants.PrefKeys; import com.mediamonks.googleflip.data.vo.LevelResultVO; import com.mediamonks.googleflip.data.vo.LevelVO; import com.pixplicity.easyprefs.library.Prefs; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static nl.qbusict.cupboard.CupboardFactory.cupboard; /** * Model for storing user related data */ public class UserModel { private static final String TAG = UserModel.class.getSimpleName(); private Long _selectedLevelId = 0L; private int _tutorialLevel = 0; private List<LevelResultVO> _levelResults; private ArrayList<LevelColor> _backgroundColors; private LevelColor _currentBackgroundColor; private LevelColor _nextBackgroundColor; private Context _context; private List<LevelVO> _levels; private int _selectedLevelIndex = 0; private boolean _isDataLoaded; public UserModel(Context context) { _context = context; } public void setLevels(List<LevelVO> levels) { _levels = levels; } public void setLevelResults(List<LevelResultVO> results) { _levelResults = results; } public void selectLevelById(Long selectedLevelId) { _selectedLevelId = selectedLevelId; int index = 0; for (LevelVO levelVO : _levels) { if (levelVO.id.equals(selectedLevelId)) { _selectedLevelIndex = index; break; } index++; } } public void selectLevelByIndex (int index) { _selectedLevelIndex = index; _selectedLevelId = _levels.get(index).id; } public int getTutorialLevel() { return _tutorialLevel; } public void setTutorialLevel(int tutorialLevel) { _tutorialLevel = tutorialLevel; } public void selectNextLockedLevel() { _selectedLevelIndex = 0; for (LevelVO levelVO : _levels) { if (!levelVO.unlocked) { _selectedLevelId = levelVO.id; return; } _selectedLevelIndex++; } } public boolean hasNextLevel () { return _levels != null && _selectedLevelIndex < _levels.size() - 1; } public void selectNextLevel() { selectLevelByIndex(_selectedLevelIndex + 1); } public Long getSelectedLevelId() { return _selectedLevelId; } public int getSelectedLevelIndex() { return _selectedLevelIndex; } public LevelVO getSelectedLevel() { return getLevelById(_selectedLevelId); } /** * @return true if the result was an improvement over the previous result for this level */ public LevelResult updateLevelResult(LevelResultVO newResultVO) { LevelResult levelResult; if (newResultVO.success && hasNextLevel()) { // unlock next level int index = _selectedLevelIndex + 1; unlockLevel(index); } LevelResultVO currentResultVO = getLevelResultById(newResultVO.id); assert currentResultVO != null; if (!currentResultVO.success) { levelResult = LevelResult.NEW; } else { levelResult = (newResultVO.seconds < currentResultVO.seconds) ? LevelResult.BETTER : LevelResult.WORSE; } // store new result if improved if (!currentResultVO.success || (newResultVO.seconds < currentResultVO.seconds)) { // update memory storage currentResultVO.copyFrom(newResultVO); // update database cupboard().withContext(_context).put(LevelResultVO.URI, LevelResultVO.class, currentResultVO); } return levelResult; } public void unlockLevel(int index) { LevelVO levelVO = _levels.get(index); levelVO.unlocked = true; ContentValues contentValues = new ContentValues(); contentValues.put(LevelVO.FIELD_UNLOCKED, true); cupboard().withContext(_context).update(LevelVO.URI, contentValues, LevelVO.FIELD_ID + "='" + levelVO.id + "'"); } private LevelVO getLevelById(Long levelId) { for (LevelVO levelVO : _levels) { if (levelVO.id.equals(levelId)) { return levelVO; } } return null; } private LevelResultVO getLevelResultById(Long levelId) { for (LevelResultVO levelResultVO : _levelResults) { if (levelResultVO.id.equals(levelId)) { return levelResultVO; } } return null; } public LevelResultVO getResultForLevel(Long levelId) { for (LevelResultVO resultVO : _levelResults) { if (resultVO.id.equals(levelId)) { return resultVO; } } return null; } public List<LevelResultVO> getLevelResults() { return _levelResults; } public LevelColor randomizeBackgroundColor() { if (_backgroundColors == null) { _backgroundColors = new ArrayList<>(); _nextBackgroundColor = LevelColor.BLUE; } if (_backgroundColors.size() == 0) { _backgroundColors.clear(); _backgroundColors.add(LevelColor.BLUE); _backgroundColors.add(LevelColor.CYAN); _backgroundColors.add(LevelColor.PURPLE); _backgroundColors.add(LevelColor.PINK); do { Collections.shuffle(_backgroundColors); } while (_backgroundColors.get(0).equals(_nextBackgroundColor)); } _currentBackgroundColor = _nextBackgroundColor; _nextBackgroundColor = _backgroundColors.remove(0); return _currentBackgroundColor; } public LevelColor getCurrentBackgroundColor() { if (_currentBackgroundColor == null) { randomizeBackgroundColor(); } return _currentBackgroundColor; } public LevelColor getNextBackgroundColor() { return _nextBackgroundColor; } public List<LevelVO> getLevels() { return _levels; } public boolean isDataLoaded() { return _isDataLoaded; } public void setIsDataLoaded(boolean isDataLoaded) { _isDataLoaded = isDataLoaded; } }