Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/src/main/java/org/secuso/privacyfriendlysudoku/ui/GameActivity.java
This commit is contained in:
Gongxter 2016-01-31 14:24:53 +01:00
commit 06dd3fa9fa
15 changed files with 1206 additions and 205 deletions

View file

@ -3,11 +3,15 @@ package org.secuso.privacyfriendlysudoku.controller;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
import org.secuso.privacyfriendlysudoku.controller.helper.GameInfoContainer;
import org.secuso.privacyfriendlysudoku.game.CellConflict;
@ -26,7 +30,7 @@ import org.secuso.privacyfriendlysudoku.game.listener.ITimerListener;
/**
* Created by Chris on 06.11.2015.
*/
public class GameController implements IModelChangedListener {
public class GameController implements IModelChangedListener, Parcelable {
// General
private SharedPreferences settings;
@ -50,7 +54,7 @@ public class GameController implements IModelChangedListener {
private int sectionWidth;
private int usedHints = 0;
private GameBoard gameBoard;
private int[] solution;
private int[] solution = new int[0];
private GameType gameType;
private GameDifficulty difficulty;
private CellConflictList errorList = new CellConflictList();
@ -63,11 +67,12 @@ public class GameController implements IModelChangedListener {
// Timer
private int time = 0;
private boolean timerRunning = false;
private AtomicBoolean timerRunning = new AtomicBoolean(false);
private LinkedList<ITimerListener> timerListeners = new LinkedList<>();
private Handler timerHandler = new Handler();
private Timer timer = new Timer();
private TimerTask timerTask;
private boolean noteStatus = false;
// Constructors
@ -155,7 +160,7 @@ public class GameController implements IModelChangedListener {
public int[] solve() {
if(solution == null) {
if(solution == null || solution.length == 0) {
solution = qqWingController.solve(gameBoard);
}
return solution;
@ -464,7 +469,7 @@ public class GameController implements IModelChangedListener {
}
public void deleteSelectedCellsValue() {
if(isValidCellSelected() && getSelectedCellsValue() != 0) {
if(isValidCellSelected()) {
deleteValue(selectedRow, selectedCol);
// add state to undo
undoRedoManager.addState(gameBoard);
@ -584,31 +589,40 @@ public class GameController implements IModelChangedListener {
return usedHints;
}
private void initTimer() {
public void initTimer() {
deleteTimer();
timerTask = new TimerTask() {
@Override
public void run() {
timerHandler.post(new Runnable() {
@Override
public void run() {
if(timerRunning) {
if(timerRunning.get()) {
notifyTimerListener(time++);
//Log.d("Timer", "calling notifyTimerListener(" + time + ");");
}
}
});
}
};
timer = new Timer();
timer.scheduleAtFixedRate(timerTask,0,1000);
timer.scheduleAtFixedRate(timerTask, 0, 1000);
}
public void deleteTimer() {
pauseTimer();
timer.cancel();
timer.purge();
}
public void startTimer() {
timerRunning = true;
timerRunning.set(true);
notifyHighlightChangedListeners();
}
public void pauseTimer(){
timerRunning = false;
timerRunning.set(false);
}
public void ReDo() {
@ -665,4 +679,92 @@ public class GameController implements IModelChangedListener {
}, 0);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
// get the gamecontroller a new context
out.writeInt(selectedRow);
out.writeInt(selectedCol);
out.writeInt(selectedValue);
out.writeInt(highlightValue);
out.writeInt(gameID);
out.writeInt(size);
out.writeInt(sectionHeight);
out.writeInt(sectionWidth);
out.writeInt(usedHints);
out.writeInt(time);
out.writeInt(solution.length);
out.writeIntArray(solution);
out.writeInt(noteStatus ? 1 : 0);
out.writeInt(notifiedOnSolvedListeners ? 1 : 0);
out.writeParcelable(gameType, 0);
out.writeParcelable(difficulty, 0);
out.writeParcelable(gameBoard, 0);
out.writeParcelable(undoRedoManager, 0);
// delete lists, in case we get the same object back from Parcel
removeAllListeners();
}
public static final Parcelable.Creator<GameController> CREATOR = new Parcelable.Creator<GameController>() {
public GameController createFromParcel(Parcel in) {
return new GameController(in);
}
public GameController[] newArray(int size) {
return new GameController[size];
}
};
/** recreate object from parcel */
private GameController(Parcel in) {
selectedRow = in.readInt();
selectedCol = in.readInt();
selectedValue = in.readInt();
highlightValue = in.readInt();
gameID = in.readInt();
size = in.readInt();
sectionHeight = in.readInt();
sectionWidth = in.readInt();
usedHints = in.readInt();
time = in.readInt();
solution = new int[in.readInt()];
in.readIntArray(solution);
noteStatus = in.readInt() == 1;
notifiedOnSolvedListeners = in.readInt() == 1;
gameType = in.readParcelable(GameType.class.getClassLoader());
difficulty = in.readParcelable(GameDifficulty.class.getClassLoader());
gameBoard = in.readParcelable(GameBoard.class.getClassLoader());
undoRedoManager = in.readParcelable(UndoRedoManager.class.getClassLoader());
removeAllListeners();
gameBoard.removeAllListeners();
gameBoard.registerOnModelChangeListener(this);
}
public void removeAllListeners() {
highlightListeners = new LinkedList<>();
solvedListeners = new LinkedList<>();
hintListener = new LinkedList<>();
timerListeners = new LinkedList<>();
}
public void setContextAndSettings(Context applicationContext, SharedPreferences sharedPref) {
context = applicationContext;
setSettings(sharedPref);
}
}

View file

@ -1,5 +1,6 @@
package org.secuso.privacyfriendlysudoku.controller;
import android.os.Parcelable;
import android.util.Log;
import java.util.LinkedList;

View file

@ -1,5 +1,8 @@
package org.secuso.privacyfriendlysudoku.controller;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.LinkedList;
import org.secuso.privacyfriendlysudoku.game.GameBoard;
@ -7,7 +10,7 @@ import org.secuso.privacyfriendlysudoku.game.GameBoard;
/**
* Created by Chris on 24.11.2015.
*/
public class UndoRedoManager {
public class UndoRedoManager implements Parcelable {
private int activeState;
private LinkedList<GameBoard> states = new LinkedList<>();
@ -78,4 +81,33 @@ public class UndoRedoManager {
e.printStackTrace();
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(activeState);
out.writeTypedList(states);
}
public static final Parcelable.Creator<UndoRedoManager> CREATOR
= new Parcelable.Creator<UndoRedoManager>() {
public UndoRedoManager createFromParcel(Parcel in) {
return new UndoRedoManager(in);
}
public UndoRedoManager[] newArray(int size) {
return new UndoRedoManager[size];
}
};
/** recreate object from parcel */
private UndoRedoManager(Parcel in) {
activeState = in.readInt();
in.readTypedList(states, GameBoard.CREATOR);
}
}

View file

@ -1,5 +1,8 @@
package org.secuso.privacyfriendlysudoku.game;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.LinkedList;
import java.util.List;
@ -8,7 +11,7 @@ import org.secuso.privacyfriendlysudoku.game.listener.IModelChangedListener;
/**
* Created by Christopher Beckmann on 06.11.2015.
*/
public class GameBoard implements Cloneable {
public class GameBoard implements Cloneable, Parcelable {
//private int id;
private GameType gameType;
@ -17,7 +20,6 @@ public class GameBoard implements Cloneable {
//private List additionalSections
private int size;
private GameCell[][] field;
private List<IModelChangedListener> modelChangedListeners = new LinkedList<>();
public GameBoard(GameType gameType) {
this.gameType = gameType;
@ -220,7 +222,6 @@ public class GameBoard implements Cloneable {
}
public void registerOnModelChangeListener(final IModelChangedListener listener) {
if(!modelChangedListeners.contains(listener)) {
actionOnCells(new ICellAction<Boolean>() {
@Override
public Boolean action(GameCell gc, Boolean existing) {
@ -228,22 +229,6 @@ public class GameBoard implements Cloneable {
return existing;
}
}, false);
modelChangedListeners.add(listener);
}
}
public void deleteOnModelChangeListener(final IModelChangedListener listener) {
if(modelChangedListeners.contains(listener)) {
actionOnCells(new ICellAction<Boolean>() {
@Override
public Boolean action(GameCell gc, Boolean existing) {
gc.removeOnModelChangeListener(listener);
return existing;
}
}, false);
modelChangedListeners.remove(listener);
}
}
@Override
@ -272,4 +257,58 @@ public class GameBoard implements Cloneable {
}
return false;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(gameType, 0);
dest.writeInt(sectionHeight);
dest.writeInt(sectionWidth);
dest.writeInt(size);
for(int i = 0; i < field.length; i++) {
dest.writeTypedArray(field[i], 0);
}
}
public static final Parcelable.Creator<GameBoard> CREATOR
= new Parcelable.Creator<GameBoard>() {
public GameBoard createFromParcel(Parcel in) {
return new GameBoard(in);
}
public GameBoard[] newArray(int size) {
return new GameBoard[size];
}
};
/** recreate object from parcel */
private GameBoard(Parcel in) {
//private int id;
gameType = in.readParcelable(GameType.class.getClassLoader());
sectionHeight = in.readInt();
sectionWidth = in.readInt();
size = in.readInt();
field = new GameCell[size][size];
for(int i = 0; i < field.length; i++) {
field[i] = in.createTypedArray(GameCell.CREATOR);
}
}
public void removeAllListeners() {
actionOnCells(new ICellAction<Boolean>() {
@Override
public Boolean action(GameCell gc, Boolean existing) {
gc.removeAllListeners();
return existing;
}
}, false);
}
}

View file

@ -1,15 +1,22 @@
package org.secuso.privacyfriendlysudoku.game;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import org.secuso.privacyfriendlysudoku.game.listener.IModelChangedListener;
/**
* Created by Chris on 06.11.2015.
*/
public class GameCell implements Cloneable {
public class GameCell implements Cloneable, Parcelable {
private int row = 0;
private int col = 0;
@ -199,4 +206,49 @@ public class GameCell implements Cloneable {
m.onModelChange(this);
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(row);
dest.writeInt(col);
dest.writeInt(value);
dest.writeInt(size);
dest.writeInt(fixed ? 1 : 0);
dest.writeInt(noteCount);
dest.writeBooleanArray(notes);
}
public static final Parcelable.Creator<GameCell> CREATOR
= new Parcelable.Creator<GameCell>() {
public GameCell createFromParcel(Parcel in) {
return new GameCell(in);
}
public GameCell[] newArray(int size) {
return new GameCell[size];
}
};
/** recreate object from parcel */
private GameCell(Parcel in) {
row = in.readInt();
col = in.readInt();
value = in.readInt();
size = in.readInt();
fixed = in.readInt() == 1;
noteCount = in.readInt();
notes = new boolean[size];
in.readBooleanArray(notes);
removeAllListeners();
}
public void removeAllListeners() {
modelChangedListeners = new LinkedList<>();
}
}

View file

@ -1,5 +1,7 @@
package org.secuso.privacyfriendlysudoku.game;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.StringRes;
import java.util.LinkedList;
@ -9,7 +11,7 @@ import org.secuso.privacyfriendlysudoku.ui.view.R;
/**
* Created by Chris on 18.11.2015.
*/
public enum GameDifficulty {
public enum GameDifficulty implements Parcelable {
Unspecified(R.string.gametype_unspecified),
Easy(R.string.difficulty_easy),
@ -35,4 +37,28 @@ public enum GameDifficulty {
return validList;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
dest.writeInt(resID);
}
public static final Parcelable.Creator<GameDifficulty> CREATOR
= new Parcelable.Creator<GameDifficulty>() {
public GameDifficulty createFromParcel(Parcel in) {
GameDifficulty g = GameDifficulty.values()[in.readInt()];
g.resID = in.readInt();
return g;
}
public GameDifficulty[] newArray(int size) {
return new GameDifficulty[size];
}
};
}

View file

@ -1,5 +1,8 @@
package org.secuso.privacyfriendlysudoku.game;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.LinkedList;
import org.secuso.privacyfriendlysudoku.ui.view.R;
@ -7,14 +10,15 @@ import org.secuso.privacyfriendlysudoku.ui.view.R;
/**
* Created by Chris on 09.11.2015.
*/
public enum GameType {
public enum GameType implements Parcelable{
Unspecified(1,1,1,R.string.gametype_unspecified,R.drawable.icon_default_6x6),
Default_9x9(9,3,3,R.string.gametype_default_9x9,R.drawable.icon_default_9x9),
Default_12x12(12,3,4,R.string.gametype_default_12x12,R.drawable.icon_default_12x12),
Default_6x6(6,2,3,R.string.gametype_default_6x6,R.drawable.icon_default_6x6),
X_9x9(9,3,3,R.string.gametype_x_9x9,R.drawable.icon_default_9x9),
Hyper_9x9(9,3,3,R.string.gametype_hyper_9x9,R.drawable.icon_default_9x9);
//TODO: change pictures for unsepc x9x9 and hyper 9x9 as soon as available
// change pictures for unsepc x9x9 and hyper 9x9 as soon as available
int resIDString;
int sectionWidth;
int sectionHeight;
@ -53,4 +57,34 @@ public enum GameType {
return resIDString;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
dest.writeInt(resIDString);
dest.writeInt(sectionWidth);
dest.writeInt(sectionHeight);
dest.writeInt(size);
dest.writeInt(resIDImage);
}
public static final Parcelable.Creator<GameType> CREATOR = new Parcelable.Creator<GameType>() {
public GameType createFromParcel(Parcel in) {
GameType g = GameType.values()[in.readInt()];
g.resIDString = in.readInt();
g.sectionWidth = in.readInt();
g.sectionHeight = in.readInt();
g.size = in.readInt();
g.resIDImage = in.readInt();
return g;
}
public GameType[] newArray(int size) {
return new GameType[size];
}
};
}

View file

@ -8,8 +8,10 @@ import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Parcelable;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.support.design.widget.NavigationView;
@ -24,6 +26,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
@ -66,25 +69,48 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
GameType gameType = GameType.Unspecified;
GameDifficulty gameDifficulty = GameDifficulty.Unspecified;
int loadLevelID = 0;
boolean loadLevel = false;
Bundle extras = getIntent().getExtras();
if (extras != null) {
Object o = extras.get("gameType");
if(o instanceof GameType) {
gameType = (GameType)extras.get("gameType");
if(savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if (extras != null) {
Object o = extras.get("gameType");
if (o instanceof GameType) {
gameType = (GameType) extras.get("gameType");
}
gameDifficulty = (GameDifficulty) (extras.get("gameDifficulty"));
loadLevel = extras.getBoolean("loadLevel", false);
if (loadLevel) {
loadLevelID = extras.getInt("loadLevelID");
}
}
gameDifficulty = (GameDifficulty)(extras.get("gameDifficulty"));
loadLevel = extras.getBoolean("loadLevel", false);
if(loadLevel) {
loadLevelID = extras.getInt("loadLevelID");
gameController = new GameController(sharedPref, getApplicationContext());
List<GameInfoContainer> loadableGames = GameStateManager.getLoadableGameList();
if (loadLevel && loadableGames.size() > loadLevelID) {
// load level from GameStateManager
gameController.loadLevel(loadableGames.get(loadLevelID));
} else {
// load a new level
gameController.loadNewLevel(gameType, gameDifficulty);
}
} else {
gameController = savedInstanceState.getParcelable("gameController");
// in case we get the same object back
// because parceling the Object does not always parcel it. Only if needed.
gameController.removeAllListeners();
gameController.setContextAndSettings(getApplicationContext(), sharedPref);
gameSolved = savedInstanceState.getInt("gameSolved") == 1;
}
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
setContentView(R.layout.activity_game_view);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
@ -93,19 +119,9 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
//Create new GameField
layout = (SudokuFieldLayout)findViewById(R.id.sudokuLayout);
gameController = new GameController(sharedPref, getApplicationContext());
gameController.registerGameSolvedListener(this);
gameController.registerTimerListener(this);
statistics.setGameController(gameController);
List<GameInfoContainer> loadableGames = GameStateManager.getLoadableGameList();
if(loadLevel && loadableGames.size() > loadLevelID) {
// load level from GameStateManager
gameController.loadLevel(loadableGames.get(loadLevelID));
} else {
// load a new level
gameController.loadNewLevel(gameType, gameDifficulty);
}
layout.setSettingsAndGame(sharedPref, gameController);
@ -118,13 +134,16 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
Point p = new Point();
getWindowManager().getDefaultDisplay().getSize(p);
//int width = p.x;
keyboard.setKeyBoard(gameController.getSize(), p.x,layout.getHeight()-p.y);
// set keyboard orientation
int orientation = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ?
LinearLayout.HORIZONTAL : LinearLayout.VERTICAL;
keyboard.setKeyBoard(gameController.getSize(), p.x,layout.getHeight()-p.y, orientation);
//set Special keys
specialButtonLayout = (SudokuSpecialButtonLayout) findViewById(R.id.sudokuSpecialLayout);
specialButtonLayout.setButtons(p.x, gameController, keyboard, getFragmentManager());
specialButtonLayout.setButtons(p.x, gameController, keyboard, getFragmentManager(), orientation);
//set TimerView
timerView = (TextView)findViewById(R.id.timerView);
@ -134,7 +153,6 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
viewName = (TextView) findViewById(R.id.gameModeText);
viewName.setText(getString(gameController.getGameType().getStringResID()));
//set Rating bar
List<GameDifficulty> difficutyList = GameDifficulty.getValidDifficultyList();
int numberOfStarts = difficutyList.size();
@ -154,8 +172,16 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
// start the game
gameController.startTimer();
if(gameSolved) {
layout.setEnabled(false);
keyboard.setButtonsEnabled(false);
specialButtonLayout.setButtonsEnabled(false);
gameController.pauseTimer();
} else {
// start the game
gameController.startTimer();
}
onTick(gameController.getTime());
}
@Override
@ -163,12 +189,14 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
super.onPause();
if(!gameSolved) {
gameController.saveGame(this);
gameController.pauseTimer();
}
gameController.deleteTimer();
}
@Override
public void onResume(){
super.onResume();
gameController.initTimer();
if(!gameSolved) {
gameController.startTimer();
}
@ -308,6 +336,10 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
specialButtonLayout.setButtonsEnabled(false);
}
@Override
public void onTick(int time) {
//do something not so awesome
public String timeToString(int time) {
int seconds = time % 60;
int minutes = ((time -seconds)/60)%60 ;
@ -326,6 +358,7 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
//do something not so awesome
timerView.setText(timeToString(time));
if(gameSolved) return;
// save time
gameController.saveGame(this);
}
@ -378,4 +411,21 @@ public class GameActivity extends AppCompatActivity implements NavigationView.On
return builder.create();
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putParcelable("gameController", gameController);
savedInstanceState.putInt("gameSolved", gameSolved ? 1 : 0);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
//super.onRestoreInstanceState(savedInstanceState);
}
}

View file

@ -31,6 +31,7 @@ import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
@ -176,8 +177,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
// send everything to game activity
i = new Intent(this, GameActivity.class);
i.putExtra("gameType", gameType);
i.putExtra("gameDifficulty", gameDifficulty);
i.putExtra("gameType", (Serializable)gameType);
i.putExtra("gameDifficulty", (Serializable)gameDifficulty);
} else {
newLevelManager.checkAndRestock();
Toast t = Toast.makeText(getApplicationContext(), R.string.generating, Toast.LENGTH_SHORT);

View file

@ -1,5 +1,6 @@
package org.secuso.privacyfriendlysudoku.ui.view;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
@ -52,7 +53,7 @@ public class SudokuKeyboardLayout extends LinearLayout implements IHighlightChan
}
}
public void setKeyBoard(int size,int width, int height) {
public void setKeyBoard(int size,int width, int height, int orientation) {
LayoutParams p;
int number = 0;
int numberOfButtonsPerRow = (size % 2 == 0) ? size/2 :(size+1)/2;
@ -60,16 +61,19 @@ public class SudokuKeyboardLayout extends LinearLayout implements IHighlightChan
buttons = new SudokuButton[numberOfButtons];
//set layout parameters and init Layouts
for (int i = 0; i < 2; i++) {
p = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,0,1);
if(orientation == LinearLayout.HORIZONTAL) {
p = new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1);
} else {
p = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
}
//if (i == 0) p.bottomMargin=10; else p.topMargin=10;
p.setMargins(0,5,0,5);
layouts[i] = new LinearLayout(getContext(),null);
layouts[i].setLayoutParams(p);
layouts[i].setWeightSum(numberOfButtonsPerRow);
layouts[i].setOrientation(LinearLayout.HORIZONTAL);
layouts[i].setOrientation(orientation);
addView(layouts[i]);
}
@ -81,7 +85,11 @@ public class SudokuKeyboardLayout extends LinearLayout implements IHighlightChan
for (int i = 0; i < numberOfButtonsPerRow; i++){
int buttonIndex = i + layoutNumber * numberOfButtonsPerRow;
buttons[buttonIndex] = new SudokuButton(getContext(),null);
p = new LayoutParams(0, LayoutParams.MATCH_PARENT,1);
if(orientation == LinearLayout.HORIZONTAL) {
p = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
} else {
p = new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1);
}
p.setMargins(5,5,5,5);
buttons[buttonIndex].setLayoutParams(p);
/* removed GridLayout because of bad scaling will use now a Linearlayout

View file

@ -58,17 +58,7 @@ public class SudokuSpecialButtonLayout extends LinearLayout implements IHighligh
// rotates the Drawable
gameController.setNoteStatus(!gameController.getNoteStatus());
keyboard.updateNotesEnabled();
bitMap = BitmapFactory.decodeResource(getResources(), btn.getType().getResID());
bitResult = Bitmap.createBitmap(bitMap.getWidth(), bitMap.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitResult);
canvas.rotate(gameController.getNoteStatus() ? 45.0f : 0.0f, bitMap.getWidth()/2, bitMap.getHeight()/2);
canvas.drawBitmap(bitMap, 0, 0, null);
btn.setImageBitmap(bitResult);
btn.setBackgroundResource(gameController.getNoteStatus() ? R.drawable.numpad_highlighted_three : R.drawable.numpad_highlighted_four);
onHighlightChanged();
break;
case Do:
gameController.ReDo();
@ -113,12 +103,12 @@ public class SudokuSpecialButtonLayout extends LinearLayout implements IHighligh
}
}
public void setButtons(int width, GameController gc, SudokuKeyboardLayout key, FragmentManager fm) {
public void setButtons(int width, GameController gc, SudokuKeyboardLayout key, FragmentManager fm, int orientation) {
fragmentManager = fm;
keyboard=key;
gameController = gc;
if(gc != null) {
gc.registerHighlightChangedListener(this);
if(gameController != null) {
gameController.registerHighlightChangedListener(this);
}
fixedButtons = new SudokuSpecialButton[fixedButtonsCount];
LayoutParams p;
@ -126,7 +116,12 @@ public class SudokuSpecialButtonLayout extends LinearLayout implements IHighligh
//ArrayList<SudokuButtonType> type = (ArrayList<SudokuButtonType>) SudokuButtonType.getSpecialButtons();
for (SudokuButtonType t : getSpecialButtons()){
fixedButtons[i] = new SudokuSpecialButton(getContext(),null);
p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,1);
if(orientation == LinearLayout.HORIZONTAL) {
p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
} else {
p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
fixedButtons[i].setPadding(25, 0, 25, 0);
}
p.setMargins(5, 5, 5, 5);
//int width2 =width/(fixedButtonsCount);
@ -166,6 +161,17 @@ public class SudokuSpecialButtonLayout extends LinearLayout implements IHighligh
fixedButtons[i].setBackgroundResource(gameController.isRedoAvailable() ?
R.drawable.numpad_highlighted_four : R.drawable.inactive_button);
break;
case NoteToggle:
bitMap = BitmapFactory.decodeResource(getResources(), fixedButtons[i].getType().getResID());
bitResult = Bitmap.createBitmap(bitMap.getWidth(), bitMap.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitResult);
canvas.rotate(gameController.getNoteStatus() ? 45.0f : 0.0f, bitMap.getWidth()/2, bitMap.getHeight()/2);
canvas.drawBitmap(bitMap, 0, 0, null);
fixedButtons[i].setImageBitmap(bitResult);
fixedButtons[i].setBackgroundResource(gameController.getNoteStatus() ? R.drawable.numpad_highlighted_three : R.drawable.numpad_highlighted_four);
break;
default:
break;
}

View file

@ -11,40 +11,42 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="tu_darmstadt.sudoku.activity.GameActivity">
<org.secuso.privacyfriendlysudoku.ui.view.SudokuFieldLayout
android:id="@+id/sudokuLayout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clickable="true"
android:gravity="center" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentRight="@+id/sudokuLayout"
android:layout_alignParentEnd="@+id/sudokuLayout"
android:orientation="horizontal"
android:weightSum="3">
<org.secuso.privacyfriendlysudoku.ui.view.SudokuKeyboardLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/sudokuKeyboardLayout"
android:orientation="horizontal"
android:layout_weight="2"
android:weightSum="2">
</org.secuso.privacyfriendlysudoku.ui.view.SudokuKeyboardLayout>
<org.secuso.privacyfriendlysudoku.ui.view.SudokuSpecialButtonLayout
android:id="@+id/sudokuSpecialLayout"
android:layout_width="0dp"
android:layout_width="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:layout_marginRight="30dp"
android:layout_marginEnd="30dp"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_weight="1">
android:gravity="center"/>
</org.secuso.privacyfriendlysudoku.ui.view.SudokuSpecialButtonLayout>
<org.secuso.privacyfriendlysudoku.ui.view.SudokuFieldLayout
android:id="@+id/sudokuLayout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@+id/sudokuSpecialLayout"
android:layout_toEndOf="@+id/sudokuSpecialLayout"
android:minWidth="100dp"
android:clickable="true"
android:gravity="center" />
</LinearLayout>
<org.secuso.privacyfriendlysudoku.ui.view.SudokuKeyboardLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="30dp"
android:layout_marginStart="30dp"
android:layout_marginRight="15dp"
android:layout_marginEnd="15dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_toRightOf="@+id/sudokuLayout"
android:layout_toEndOf="@+id/sudokuLayout"
android:id="@+id/sudokuKeyboardLayout"
android:orientation="horizontal"
android:weightSum="2"/>
</RelativeLayout>

View file

@ -1,20 +1,104 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:weightSum="10"
android:weightSum="5"
android:orientation="vertical"
tools:context="tu_darmstadt.sudoku.ui.StatsActivity$PlaceholderFragment">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0px"
android:layout_weight="1"
android:orientation="horizontal"
android:gravity="center"
android:weightSum="3">
<LinearLayout
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_hints"
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_games"
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/total_of_time"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_time"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:weightSum="5">
android:layout_weight="0.5">
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_gravity="center_vertical"
android:foregroundGravity="center_vertical"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@color/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="3.5"
android:weightSum="9"
android:orientation="horizontal">
<ImageView
android:layout_weight="2"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_gravity="center"
@ -37,82 +121,20 @@
android:layout_marginBottom="@dimen/activity_horizontal_margin"/>
</RelativeLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:weightSum="6"
android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="@dimen/activity_horizontal_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/total_of_time"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_time"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_gravity="center_vertical"
android:foregroundGravity="center_vertical"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@color/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:weightSum="3"
android:orientation="vertical">
<!-- ### first row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_weight="5.5"
android:weightSum="3">
<!-- ### first row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:weightSum="3">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
@ -173,8 +195,8 @@
</RelativeLayout>
</LinearLayout>
<!-- ### second row -->
<LinearLayout
<!-- ### second row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
@ -238,16 +260,11 @@
android:layout_below="@+id/second_min_text"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<!-- ### third row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<RelativeLayout
android:layout_width="0dp"
@ -306,11 +323,10 @@
android:gravity="center_vertical"
android:layout_below="@+id/third_min_text"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View file

@ -0,0 +1,316 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:weightSum="10"
android:orientation="vertical"
tools:context="tu_darmstadt.sudoku.ui.StatsActivity$PlaceholderFragment">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:weightSum="5">
<ImageView
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:id="@+id/statistic_image"
android:src="@drawable/icon_default_9x9"
android:adjustViewBounds="true"/>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:foregroundGravity="center_vertical"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@color/colorPrimary"
android:layout_marginTop="@dimen/activity_horizontal_margin"
android:layout_marginBottom="@dimen/activity_horizontal_margin"/>
</RelativeLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:weightSum="6"
android:layout_weight="2"
android:orientation="vertical"
android:paddingTop="@dimen/activity_horizontal_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/total_of_time"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_time"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_gravity="center_vertical"
android:foregroundGravity="center_vertical"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@color/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:weightSum="3"
android:orientation="vertical">
<!-- ### first row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:weightSum="3">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="3"
android:layout_gravity="center"
android:id="@+id/first_diff_bar"
android:layout_below="@+id/first_diff_text"
style="?android:attr/ratingBarStyleSmall"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="diffi"
android:id="@+id/first_diff_text"
android:gravity="center_vertical"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/average_time"
android:id="@+id/first_av_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/first_ava_time"
android:gravity="center_vertical"
android:layout_below="@+id/first_av_text"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/min_time"
android:id="@+id/first_min_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/first_min_time"
android:gravity="center_vertical"
android:layout_below="@+id/first_min_text"/>
</RelativeLayout>
</LinearLayout>
<!-- ### second row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:weightSum="3">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="3"
android:layout_gravity="center"
android:id="@+id/second_diff_bar"
android:layout_below="@+id/second_diff_text"
style="?android:attr/ratingBarStyleSmall"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="diffi"
android:id="@+id/second_diff_text"
android:gravity="center_vertical"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/average_time"
android:id="@+id/second_av_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/second_ava_time"
android:gravity="center_vertical"
android:layout_below="@+id/second_av_text"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/min_time"
android:id="@+id/second_min_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/second_min_time"
android:gravity="center_vertical"
android:layout_below="@+id/second_min_text"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="3"
android:layout_gravity="center"
android:id="@+id/third_diff_bar"
android:layout_below="@+id/third_diff_text"
style="?android:attr/ratingBarStyleSmall"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="diffi"
android:id="@+id/third_diff_text"
android:gravity="center_vertical"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/average_time"
android:id="@+id/third_av_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/third_ava_time"
android:gravity="center_vertical"
android:layout_below="@+id/third_av_text"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/min_time"
android:id="@+id/third_min_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/third_min_time"
android:gravity="center_vertical"
android:layout_below="@+id/third_min_text"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View file

@ -0,0 +1,316 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:weightSum="10"
android:orientation="vertical"
tools:context="tu_darmstadt.sudoku.ui.StatsActivity$PlaceholderFragment">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:weightSum="5">
<ImageView
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:id="@+id/statistic_image"
android:src="@drawable/icon_default_9x9"
android:adjustViewBounds="true"/>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:foregroundGravity="center_vertical"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@color/colorPrimary"
android:layout_marginTop="@dimen/activity_horizontal_margin"
android:layout_marginBottom="@dimen/activity_horizontal_margin"/>
</RelativeLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:weightSum="6"
android:layout_weight="2"
android:orientation="vertical"
android:paddingTop="@dimen/activity_horizontal_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_hints"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/number_of_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_games"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/total_of_time"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:id="@+id/numb_of_total_time"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_gravity="center_vertical"
android:foregroundGravity="center_vertical"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:background="@color/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:weightSum="3"
android:orientation="vertical">
<!-- ### first row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:weightSum="3">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="3"
android:layout_gravity="center"
android:id="@+id/first_diff_bar"
android:layout_below="@+id/first_diff_text"
style="?android:attr/ratingBarStyleSmall"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="diffi"
android:id="@+id/first_diff_text"
android:gravity="center_vertical"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/average_time"
android:id="@+id/first_av_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/first_ava_time"
android:gravity="center_vertical"
android:layout_below="@+id/first_av_text"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/min_time"
android:id="@+id/first_min_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/first_min_time"
android:gravity="center_vertical"
android:layout_below="@+id/first_min_text"/>
</RelativeLayout>
</LinearLayout>
<!-- ### second row -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:weightSum="3">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="3"
android:layout_gravity="center"
android:id="@+id/second_diff_bar"
android:layout_below="@+id/second_diff_text"
style="?android:attr/ratingBarStyleSmall"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="diffi"
android:id="@+id/second_diff_text"
android:gravity="center_vertical"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/average_time"
android:id="@+id/second_av_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/second_ava_time"
android:gravity="center_vertical"
android:layout_below="@+id/second_av_text"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/min_time"
android:id="@+id/second_min_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/second_min_time"
android:gravity="center_vertical"
android:layout_below="@+id/second_min_text"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="3"
android:layout_gravity="center"
android:id="@+id/third_diff_bar"
android:layout_below="@+id/third_diff_text"
style="?android:attr/ratingBarStyleSmall"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="diffi"
android:id="@+id/third_diff_text"
android:gravity="center_vertical"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/average_time"
android:id="@+id/third_av_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/third_ava_time"
android:gravity="center_vertical"
android:layout_below="@+id/third_av_text"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/min_time"
android:id="@+id/third_min_text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/third_min_time"
android:gravity="center_vertical"
android:layout_below="@+id/third_min_text"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>