Final
1
app/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/build
|
||||
43
app/build.gradle
Normal file
@@ -0,0 +1,43 @@
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk 32
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.example.tictactoeapplut"
|
||||
minSdk 21
|
||||
targetSdk 32
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
buildFeatures {
|
||||
viewBinding true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
implementation 'androidx.appcompat:appcompat:1.3.0'
|
||||
implementation 'com.google.android.material:material:1.4.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
implementation 'androidx.navigation:navigation-fragment:2.3.5'
|
||||
implementation 'androidx.navigation:navigation-ui:2.3.5'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
}
|
||||
21
app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ExampleInstrumentedTest {
|
||||
@Test
|
||||
public void useAppContext() {
|
||||
// Context of the app under test.
|
||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||
assertEquals("com.example.tictactoeapplut", appContext.getPackageName());
|
||||
}
|
||||
}
|
||||
34
app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.example.tictactoeapplut" >
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||
android:fullBackupContent="@xml/backup_rules"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.TicTacToeAppLUT"
|
||||
tools:targetApi="31" >
|
||||
<activity
|
||||
android:name=".Game"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".Prepare"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name=".ListDataActivity"></activity>
|
||||
<activity android:name=".EditDataActivity"></activity>
|
||||
</application>
|
||||
</manifest>
|
||||
BIN
app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
197
app/src/main/java/com/example/tictactoeapplut/Board.java
Normal file
@@ -0,0 +1,197 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public class Board extends View {
|
||||
|
||||
private final int boardColor;
|
||||
private final int XColor;
|
||||
private final int OColor;
|
||||
private final int winColor;
|
||||
private int cellSize = getWidth()/3;
|
||||
private final Paint paint = new Paint();
|
||||
private final Move game;
|
||||
private boolean winLine = false;
|
||||
|
||||
public Board(Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
game = new Move(context);
|
||||
|
||||
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Board,0,0);
|
||||
|
||||
try {
|
||||
boardColor = a.getInteger(R.styleable.Board_boardColor, 0);
|
||||
XColor = a.getInteger(R.styleable.Board_XColor, 0);
|
||||
OColor = a.getInteger(R.styleable.Board_OColor, 0);
|
||||
winColor = a.getInteger(R.styleable.Board_winColor, 0);
|
||||
|
||||
} finally {
|
||||
a.recycle();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int width, int height) {
|
||||
super.onMeasure(width, height);
|
||||
|
||||
int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
|
||||
cellSize = size/3;
|
||||
|
||||
setMeasuredDimension(size, size);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
paint.setStyle(Paint.Style.STROKE);
|
||||
paint.setAntiAlias(true);
|
||||
|
||||
drawBoard(canvas);
|
||||
drawMove(canvas);
|
||||
|
||||
if (winLine) {
|
||||
paint.setColor(winColor);
|
||||
drawWinLine(canvas);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
float x = event.getX();
|
||||
float y = event.getY();
|
||||
|
||||
int action = event.getAction();
|
||||
if (action == MotionEvent.ACTION_DOWN) {
|
||||
int row = (int) Math.ceil(y/cellSize);
|
||||
int column = (int) Math.ceil(x/cellSize);
|
||||
if (!winLine) {
|
||||
if (game.updateBoard(row, column)) {
|
||||
invalidate();
|
||||
if (game.winCheck()) {
|
||||
winLine = true;
|
||||
invalidate();
|
||||
}
|
||||
if (game.getPlayer() % 2 == 0) {
|
||||
game.setPlayer(game.getPlayer() - 1);
|
||||
} else {
|
||||
game.setPlayer(game.getPlayer() + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
invalidate();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void drawBoard(Canvas canvas) {
|
||||
paint.setColor(boardColor);
|
||||
paint.setStrokeWidth(16);
|
||||
for (int x=1; x<3; x++) {
|
||||
canvas.drawLine(cellSize*x, 0, cellSize*x, canvas.getWidth(), paint);
|
||||
}
|
||||
|
||||
for (int y=1; y<3; y++) {
|
||||
canvas.drawLine(0, cellSize*y, canvas.getWidth(), cellSize*y, paint);
|
||||
}
|
||||
paint.setStrokeWidth(32);
|
||||
canvas.drawLine(0,0,cellSize*3,0,paint);
|
||||
paint.setStrokeWidth(32);
|
||||
canvas.drawLine(0,cellSize*3,cellSize*3,cellSize*3,paint);
|
||||
paint.setStrokeWidth(16);
|
||||
canvas.drawLine(0,0,0,cellSize*3,paint);
|
||||
paint.setStrokeWidth(16);
|
||||
canvas.drawLine(cellSize*3,0,cellSize*3,cellSize*3,paint);
|
||||
}
|
||||
|
||||
private void drawMove(Canvas canvas) {
|
||||
for (int r=0; r<3; r++) {
|
||||
for (int c=0; c<3; c++) {
|
||||
if (game.getBoard()[r][c]!=0) {
|
||||
if (game.getBoard()[r][c]==1) {
|
||||
drawX(canvas, r, c);
|
||||
} else {
|
||||
drawO(canvas, r, c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void drawX(Canvas canvas, int row, int column) {
|
||||
paint.setColor(XColor);
|
||||
canvas.drawLine((float)((column+1)*cellSize - cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint);
|
||||
canvas.drawLine((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)((column+1)*cellSize-cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint);
|
||||
|
||||
}
|
||||
|
||||
private void drawO(Canvas canvas, int row, int column) {
|
||||
paint.setColor(OColor);
|
||||
canvas.drawOval((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize-cellSize*0.1), (float)(row*cellSize+cellSize-cellSize*0.1), paint);
|
||||
}
|
||||
|
||||
private void drawHorizontal(Canvas canvas, int row, int column) {
|
||||
canvas.drawLine(column, row*cellSize + cellSize/2, cellSize*3, row*cellSize+cellSize/2,paint);
|
||||
}
|
||||
|
||||
private void drawVertical(Canvas canvas, int row, int column) {
|
||||
canvas.drawLine(column*cellSize+cellSize/2, row, column*cellSize+cellSize/2, cellSize*3,paint);
|
||||
}
|
||||
|
||||
private void drawSlopeUp(Canvas canvas) {
|
||||
canvas.drawLine(0, cellSize*3, cellSize*3, 0 ,paint);
|
||||
}
|
||||
|
||||
private void drawSlopeDown(Canvas canvas) {
|
||||
canvas.drawLine(0, 0, cellSize*3, cellSize*3 ,paint);
|
||||
}
|
||||
|
||||
private void drawWinLine(Canvas canvas) {
|
||||
int row = game.getWinType()[0];
|
||||
int column = game.getWinType()[1];
|
||||
|
||||
switch (game.getWinType()[2]) {
|
||||
case 1:
|
||||
drawHorizontal(canvas, row, column);
|
||||
break;
|
||||
case 2:
|
||||
drawVertical(canvas, row, column);
|
||||
break;
|
||||
case 3:
|
||||
drawSlopeDown(canvas);
|
||||
break;
|
||||
case 4:
|
||||
drawSlopeUp(canvas);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void setUp(Button again, Button home, TextView display, String[] names) {
|
||||
game.setAgain(again);
|
||||
game.setHome(home);
|
||||
game.setTurn(display);
|
||||
if (!names[0].equals("") && !names[1].equals("")){
|
||||
game.setNames(names);
|
||||
}
|
||||
}
|
||||
|
||||
public void resetGame() {
|
||||
game.resetBoard();
|
||||
winLine = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class CustomAdapter extends BaseAdapter {
|
||||
private static final String TAG = "CustomAdapter";
|
||||
Context context;
|
||||
ArrayList<String> name;
|
||||
ArrayList<String> winner;
|
||||
ArrayList<String> time;
|
||||
|
||||
public CustomAdapter(Context context, ArrayList<String> name, ArrayList<String> winner, ArrayList<String> time) {
|
||||
this.context = context;
|
||||
this.name = name;
|
||||
this.winner = winner;
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return name.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
convertView = inflater.inflate(R.layout.list_item,parent,false);
|
||||
TextView txtName, txtWin, txtTime;
|
||||
|
||||
txtName = convertView.findViewById(R.id.txt_name);
|
||||
txtWin = convertView.findViewById(R.id.txt_win);
|
||||
txtTime = convertView.findViewById(R.id.txt_time);
|
||||
txtName.setText(name.get(position));
|
||||
txtWin.setText(winner.get(position));
|
||||
txtTime.setText(time.get(position));
|
||||
convertView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent editScreenIntent = new Intent(context, EditDataActivity.class);
|
||||
editScreenIntent.putExtra("time",txtTime.getText().toString());
|
||||
editScreenIntent.putExtra("players", txtName.getText().toString());
|
||||
editScreenIntent.putExtra("winner", txtWin.getText().toString());
|
||||
context.startActivity(editScreenIntent);
|
||||
}
|
||||
});
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteOpenHelper;
|
||||
|
||||
public class DatabaseHelper extends SQLiteOpenHelper {
|
||||
|
||||
private static final String TABLE_NAME = "record";
|
||||
private static final String COL1 = "players";
|
||||
private static final String COL2 = "winner";
|
||||
private static final String COL3 = "time";
|
||||
|
||||
|
||||
public DatabaseHelper(Context context) {
|
||||
super(context, TABLE_NAME, null, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(SQLiteDatabase db) {
|
||||
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
|
||||
COL1 +" TEXT, " + COL2 + " TEXT, " + COL3 + " TEXT)";
|
||||
db.execSQL(createTable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
|
||||
db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
|
||||
onCreate(db);
|
||||
}
|
||||
|
||||
public boolean addData(String players, String winner, String time) {
|
||||
SQLiteDatabase db = this.getWritableDatabase();
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(COL1, players);
|
||||
contentValues.put(COL2, winner);
|
||||
contentValues.put(COL3, time);
|
||||
|
||||
long result = db.insert(TABLE_NAME, null, contentValues);
|
||||
|
||||
if (result == -1) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public Cursor getData(){
|
||||
SQLiteDatabase db = this.getWritableDatabase();
|
||||
String query = "SELECT * FROM " + TABLE_NAME;
|
||||
Cursor data = db.rawQuery(query, null);
|
||||
return data;
|
||||
}
|
||||
|
||||
public void deleteMatch(String time){
|
||||
SQLiteDatabase db = this.getWritableDatabase();
|
||||
String query = "DELETE FROM " + TABLE_NAME + " WHERE "
|
||||
+ COL3 + " = '" + time + "'";
|
||||
db.execSQL(query);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
public class EditDataActivity extends AppCompatActivity {
|
||||
|
||||
private Button btnDelete;
|
||||
private TextView txtPlayers, txtWinner, txtTime;
|
||||
|
||||
DatabaseHelper mDatabaseHelper;
|
||||
|
||||
private String selectedPlayers, selectedWinner, selectedTime;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.edit_data_layout);
|
||||
btnDelete = (Button) findViewById(R.id.btnDelete);
|
||||
txtPlayers = (TextView) findViewById(R.id.txtPlayers);
|
||||
txtWinner = (TextView) findViewById(R.id.txtWinner);
|
||||
txtTime = (TextView) findViewById(R.id.txtTime);
|
||||
mDatabaseHelper = new DatabaseHelper(this);
|
||||
|
||||
Intent receivedIntent = getIntent();
|
||||
|
||||
selectedPlayers = receivedIntent.getStringExtra("players");
|
||||
selectedWinner = receivedIntent.getStringExtra("winner");
|
||||
selectedTime = receivedIntent.getStringExtra("time");
|
||||
|
||||
txtPlayers.setText(selectedPlayers);
|
||||
txtWinner.setText(selectedWinner);
|
||||
txtTime.setText(selectedTime);
|
||||
|
||||
btnDelete.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mDatabaseHelper.deleteMatch(selectedTime);
|
||||
txtPlayers.setText("");
|
||||
txtWinner.setText("");
|
||||
txtTime.setText("");
|
||||
toaster();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
private void toaster(){
|
||||
Toast.makeText(this, "Match removed", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
46
app/src/main/java/com/example/tictactoeapplut/Game.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class Game extends AppCompatActivity {
|
||||
private Board board;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_game);
|
||||
Button again = findViewById(R.id.button6);
|
||||
Button home = findViewById(R.id.button5);
|
||||
TextView turn = findViewById(R.id.textView5);
|
||||
again.setVisibility(View.GONE);
|
||||
home.setVisibility(View.GONE);
|
||||
String[] names = getIntent().getStringArrayExtra("PLAYERS");
|
||||
assert names != null;
|
||||
if (names[0].equals("")){
|
||||
|
||||
turn.setText((String)("Player 1's turn"));
|
||||
}else{
|
||||
turn.setText((String)(names[0] + "'s turn"));
|
||||
}
|
||||
board = findViewById(R.id.board);
|
||||
|
||||
board.setUp(again, home, turn, names);
|
||||
}
|
||||
|
||||
public void againClick(View view) {
|
||||
board.resetGame();
|
||||
board.invalidate();
|
||||
}
|
||||
|
||||
public void homeClick(View view) {
|
||||
Intent intent = new Intent(this, MainActivity.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.database.Cursor;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ListDataActivity extends AppCompatActivity {
|
||||
|
||||
private static final String TAG = "ListDataActivity";
|
||||
|
||||
DatabaseHelper mDatabaseHelper;
|
||||
|
||||
private ListView mListView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.list_layout);
|
||||
mListView = (ListView) findViewById(R.id.listView);
|
||||
mDatabaseHelper = new DatabaseHelper(this);
|
||||
|
||||
populateListView();
|
||||
}
|
||||
|
||||
private void populateListView() {
|
||||
Log.d(TAG, "populateListView: Displaying data in the ListView.");
|
||||
|
||||
Cursor data = mDatabaseHelper.getData();
|
||||
ArrayList<String> listPlayers = new ArrayList<>();
|
||||
ArrayList<String> listWinner = new ArrayList<>();
|
||||
ArrayList<String> listTime = new ArrayList<>();
|
||||
while(data.moveToNext()){
|
||||
|
||||
listPlayers.add(data.getString(1));
|
||||
listWinner.add(data.getString(2));
|
||||
listTime.add(data.getString(3));
|
||||
}
|
||||
CustomAdapter adapter = new CustomAdapter(this, listPlayers, listWinner, listTime);
|
||||
mListView.setAdapter(adapter);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
TextView description = (TextView) findViewById(R.id.textView2);
|
||||
TextView link = (TextView) findViewById(R.id.textView3);
|
||||
description.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Uri lut = Uri.parse((String)"https://www.lut.fi/en");
|
||||
Intent toLUT = new Intent(Intent.ACTION_VIEW, lut);
|
||||
if (toLUT.resolveActivity(getPackageManager()) != null) {
|
||||
startActivity(toLUT);
|
||||
}
|
||||
}
|
||||
});
|
||||
link.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Uri github = Uri.parse((String)"https://github.com/AndrewTrieu/tictactoeapp");
|
||||
Intent toGitHub = new Intent(Intent.ACTION_VIEW, github);
|
||||
if (toGitHub.resolveActivity(getPackageManager()) != null) {
|
||||
startActivity(toGitHub);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void startClick(View view){
|
||||
Intent intent = new Intent(this, Prepare.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
public void recordClick(View view){
|
||||
Intent intent = new Intent(this, ListDataActivity.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
147
app/src/main/java/com/example/tictactoeapplut/Move.java
Normal file
@@ -0,0 +1,147 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
public class Move {
|
||||
private int[][] board;
|
||||
private String[] names = {"Player 1", "Player 2"};
|
||||
private int[] winType = {-1, -1, -1};
|
||||
private Button again;
|
||||
private Button home;
|
||||
private TextView turn;
|
||||
private int player = 1;
|
||||
private static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy");
|
||||
|
||||
DatabaseHelper databaseHelper;
|
||||
|
||||
Move(Context context) {
|
||||
databaseHelper = new DatabaseHelper(context);
|
||||
board = new int[3][3];
|
||||
for (int r=0; r<3; r++) {
|
||||
for (int c=0; c<3; c++) {
|
||||
board[r][c] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean updateBoard(int row, int column) {
|
||||
if (board[row-1][column-1]==0) {
|
||||
board[row-1][column-1] = player;
|
||||
if (player == 1) {
|
||||
turn.setText((String)(names[1]+"'s turn"));
|
||||
} else {
|
||||
turn.setText((String)(names[0]+"'s turn"));
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean winCheck() {
|
||||
boolean won = false;
|
||||
|
||||
for (int r = 0; r < 3; r++) {
|
||||
if (board[r][0] == board[r][1] && board[r][0] == board[r][2] && board[r][0] != 0) {
|
||||
winType = new int[] {r, 0, 1};
|
||||
won = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int c = 0; c < 3; c++) {
|
||||
if (board[0][c] == board[1][c] && board[0][c] == board[2][c] && board[0][c] != 0) {
|
||||
winType = new int[] {0, c, 2};
|
||||
won = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (board[0][0]==board[1][1] && board[0][0]==board[2][2] && board[0][0]!=0) {
|
||||
winType = new int[] {0, 2, 3};
|
||||
won = true;
|
||||
}
|
||||
if (board[2][0]==board[1][1] && board[2][0]==board[0][2] && board[2][0]!=0) {
|
||||
winType = new int[] {2, 2, 4};
|
||||
won = true;
|
||||
}
|
||||
|
||||
int boardFilled = 0;
|
||||
for (int r=0; r<3; r++) {
|
||||
for (int c=0; c<3; c++) {
|
||||
if (board[r][c]!=0){
|
||||
boardFilled+=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (won) {
|
||||
again.setVisibility(View.VISIBLE);
|
||||
home.setVisibility(View.VISIBLE);
|
||||
turn.setText((String)(names[player-1]+" won!"));
|
||||
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
|
||||
databaseHelper.addData(names[0]+" vs "+names[1], names[player-1], sdf.format(timestamp));
|
||||
return true;
|
||||
} else if(boardFilled==9){
|
||||
again.setVisibility(View.VISIBLE);
|
||||
home.setVisibility(View.VISIBLE);
|
||||
turn.setText((String)("Tie game!"));
|
||||
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
|
||||
databaseHelper.addData(names[0]+" vs "+names[1], "Tie", sdf.format(timestamp));
|
||||
return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void resetBoard() {
|
||||
for (int r=0; r<3; r++) {
|
||||
for (int c=0; c<3; c++) {
|
||||
board[r][c] = 0;
|
||||
}
|
||||
}
|
||||
player = 1;
|
||||
again.setVisibility(View.GONE);
|
||||
home.setVisibility(View.GONE);
|
||||
turn.setText((String)(names[0]+"'s turn"));
|
||||
}
|
||||
|
||||
public void setAgain(Button again) {
|
||||
this.again = again;
|
||||
}
|
||||
|
||||
public void setHome(Button home) {
|
||||
this.home = home;
|
||||
}
|
||||
|
||||
public void setTurn(TextView turn) {
|
||||
this.turn = turn;
|
||||
}
|
||||
|
||||
public void setNames(String[] names) {
|
||||
this.names = names;
|
||||
}
|
||||
|
||||
public int[][] getBoard() {
|
||||
return board;
|
||||
}
|
||||
|
||||
public void setPlayer(int player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public int getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public int[] getWinType() {
|
||||
return winType;
|
||||
}
|
||||
|
||||
}
|
||||
29
app/src/main/java/com/example/tictactoeapplut/Prepare.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
|
||||
public class Prepare extends AppCompatActivity {
|
||||
private EditText player1;
|
||||
private EditText player2;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_prepare);
|
||||
player1 = findViewById(R.id.editTextTextPersonName4);
|
||||
player2 = findViewById(R.id.editTextTextPersonName3);
|
||||
}
|
||||
public void playClick(View view) {
|
||||
String player1Name = player1.getText().toString();
|
||||
String player2Name = player2.getText().toString();
|
||||
|
||||
Intent intent = new Intent(this, Game.class);
|
||||
intent.putExtra("PLAYERS", new String[] {player1Name, player2Name});
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Normal file
@@ -0,0 +1,30 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="85.84757"
|
||||
android:endY="92.4963"
|
||||
android:startX="42.9492"
|
||||
android:startY="49.59793"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#44000000"
|
||||
android:offset="0.0" />
|
||||
<item
|
||||
android:color="#00000000"
|
||||
android:offset="1.0" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
11
app/src/main/res/drawable/blue.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#36AE7C"/>
|
||||
<corners android:radius="100dp"/>
|
||||
<stroke android:color="@color/black" android:width="1dp"/>
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
11
app/src/main/res/drawable/button.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#92B4EC"/>
|
||||
<corners android:radius="100dp"/>
|
||||
<stroke android:color="@color/black" android:width="1dp"/>
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
170
app/src/main/res/drawable/ic_launcher_background.xml
Normal file
@@ -0,0 +1,170 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path
|
||||
android:fillColor="#3DDC84"
|
||||
android:pathData="M0,0h108v108h-108z" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M9,0L9,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,0L19,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M29,0L29,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M39,0L39,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M49,0L49,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M59,0L59,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M69,0L69,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M79,0L79,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M89,0L89,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M99,0L99,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,9L108,9"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,19L108,19"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,29L108,29"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,39L108,39"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,49L108,49"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,59L108,59"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,69L108,69"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,79L108,79"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,89L108,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,99L108,99"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,29L89,29"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,39L89,39"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,49L89,49"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,59L89,59"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,69L89,69"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,79L89,79"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M29,19L29,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M39,19L39,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M49,19L49,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M59,19L59,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M69,19L69,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M79,19L79,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
</vector>
|
||||
BIN
app/src/main/res/drawable/logo.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
11
app/src/main/res/drawable/red.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#cc0000"/>
|
||||
<corners android:radius="100dp"/>
|
||||
<stroke android:color="@color/black" android:width="1dp"/>
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
11
app/src/main/res/drawable/yellow.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#FFD24C"/>
|
||||
<corners android:radius="100dp"/>
|
||||
<stroke android:color="@color/black" android:width="1dp"/>
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
75
app/src/main/res/layout/activity_game.xml
Normal file
@@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:custom="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".Game"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView5"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="84dp"
|
||||
android:fontFamily="monospace"
|
||||
android:text="@string/name"
|
||||
android:textColor="#000000"
|
||||
android:textSize="24sp"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/constraintLayout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="60dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.493"
|
||||
app:layout_constraintStart_toStartOf="parent">
|
||||
|
||||
<Button
|
||||
android:id="@+id/button5"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="30dp"
|
||||
android:background="@drawable/yellow"
|
||||
android:onClick="homeClick"
|
||||
android:text="@string/again"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/button6"
|
||||
app:layout_constraintHorizontal_bias="1.0"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.0" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button6"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/blue"
|
||||
android:onClick="againClick"
|
||||
android:text="@string/more"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<com.example.tictactoeapplut.Board
|
||||
android:id="@+id/board"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
custom:boardColor="#000000"
|
||||
custom:XColor="#DD2C00"
|
||||
custom:OColor="#3F51B5"
|
||||
custom:winColor="#fc00fc"/>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
97
app/src/main/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,97 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="84dp"
|
||||
android:fontFamily="casual"
|
||||
android:text="@string/home"
|
||||
android:textAlignment="center"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
|
||||
android:textColor="#EF6C00"
|
||||
android:textSize="48sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_marginTop="252dp"
|
||||
android:background="@drawable/button"
|
||||
android:fontFamily="sans-serif-light"
|
||||
android:onClick="startClick"
|
||||
android:text="@string/start"
|
||||
android:textAllCaps="false"
|
||||
android:textSize="20sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.498"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button3"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:background="@drawable/button"
|
||||
android:fontFamily="sans-serif-light"
|
||||
android:onClick="recordClick"
|
||||
android:text="@string/record"
|
||||
android:textAllCaps="false"
|
||||
android:textSize="20sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.498"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/button" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="104dp"
|
||||
android:text="@string/author"
|
||||
android:textAlignment="center"
|
||||
android:textColor="#757575"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.492"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/button" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:text="@string/github"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imageView3"
|
||||
android:layout_width="353dp"
|
||||
android:layout_height="347dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView"
|
||||
app:layout_constraintVertical_bias="0.617"
|
||||
app:srcCompat="@drawable/logo" />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
91
app/src/main/res/layout/activity_prepare.xml
Normal file
@@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".Prepare"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="160dp"
|
||||
android:fontFamily="casual"
|
||||
android:text="@string/players"
|
||||
android:textColor="#EF6C00"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.498"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="56dp"
|
||||
android:background="@drawable/button"
|
||||
android:fontFamily="sans-serif-light"
|
||||
android:onClick="playClick"
|
||||
android:text="@string/play"
|
||||
android:textSize="20sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.498"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName3" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView7"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/player2"
|
||||
android:textColor="#3F51B5"
|
||||
app:layout_constraintBottom_toTopOf="@+id/editTextTextPersonName3"
|
||||
app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName3" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextTextPersonName3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="52dp"
|
||||
android:autofillHints=""
|
||||
android:ems="10"
|
||||
android:hint="@string/name"
|
||||
android:inputType="textPersonName"
|
||||
android:minHeight="48dp"
|
||||
android:textColor="#757575"
|
||||
android:textColorHint="#757575"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName4"
|
||||
tools:ignore="DuplicateSpeakableTextCheck" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView8"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/player1"
|
||||
android:textColor="#DD2C00"
|
||||
app:layout_constraintBottom_toTopOf="@+id/editTextTextPersonName4"
|
||||
app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName4" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextTextPersonName4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="68dp"
|
||||
android:autofillHints=""
|
||||
android:ems="10"
|
||||
android:hint="@string/name"
|
||||
android:inputType="textPersonName"
|
||||
android:minHeight="48dp"
|
||||
android:textColor="#757575"
|
||||
android:textColorHint="#757575"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView4" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
96
app/src/main/res/layout/edit_data_layout.xml
Normal file
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
<Button
|
||||
android:id="@+id/btnDelete"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="230dp"
|
||||
android:background="@drawable/red"
|
||||
android:text="@string/delete"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.514"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView8" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txtPlayers"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="60dp"
|
||||
android:text="@string/temp"
|
||||
android:textSize="20sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.501"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView8" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView8"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="80dp"
|
||||
android:fontFamily="casual"
|
||||
android:text="@string/details"
|
||||
android:textColor="#EF6C00"
|
||||
android:textSize="24sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.498"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="150dp"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView8">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/time"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txtTime"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/temp"
|
||||
android:textSize="16sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="100dp"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textView8">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/winner"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txtWinner"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/temp"
|
||||
android:textSize="20sp" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
65
app/src/main/res/layout/list_item.xml
Normal file
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity"
|
||||
android:orientation="vertical"
|
||||
android:padding="10dp"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txt_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/players"
|
||||
android:textColor="#000000"
|
||||
android:textSize="30sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:layout_editor_absoluteY="131dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/winner"
|
||||
android:textColor="#000000"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txt_win"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/temp"
|
||||
android:textSize="20sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/time"
|
||||
android:textColor="#000000"
|
||||
android:textSize="20sp" />
|
||||
<TextView
|
||||
android:id="@+id/txt_time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/temp"
|
||||
android:textSize="20sp"/>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
16
app/src/main/res/layout/list_layout.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
|
||||
<ListView
|
||||
android:id="@+id/listView"
|
||||
android:layout_width="409dp"
|
||||
android:layout_height="729dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
3
app/src/main/res/values-land/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
||||
16
app/src/main/res/values-night/themes.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.TicTacToeAppLUT" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_200</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorOnPrimary">@color/black</item>
|
||||
<!-- Secondary brand color. -->
|
||||
<item name="colorSecondary">@color/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_200</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<!-- Status bar color. -->
|
||||
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
</resources>
|
||||
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">200dp</dimen>
|
||||
</resources>
|
||||
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
||||
9
app/src/main/res/values/attrs.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<declare-styleable name="Board">
|
||||
<attr name="boardColor" format="color"/>
|
||||
<attr name="XColor" format="color"/>
|
||||
<attr name="OColor" format="color"/>
|
||||
<attr name="winColor" format="color"/>
|
||||
</declare-styleable>
|
||||
</resources>
|
||||
10
app/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="purple_200">#FFBB86FC</color>
|
||||
<color name="purple_500">#FF6200EE</color>
|
||||
<color name="purple_700">#FF3700B3</color>
|
||||
<color name="teal_200">#FF03DAC5</color>
|
||||
<color name="teal_700">#FF018786</color>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="white">#FFFFFFFF</color>
|
||||
</resources>
|
||||
3
app/src/main/res/values/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">16dp</dimen>
|
||||
</resources>
|
||||
4
app/src/main/res/values/ic_launcher_background.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FFFFFF</color>
|
||||
</resources>
|
||||
24
app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<resources>
|
||||
<string name="app_name">Tic-Tac-Toe</string>
|
||||
<string name="home">TIC-TAC-TOE</string>
|
||||
<string name="author">Developed by Andrew Trieu for the course CT70A9120 at LUT University</string>
|
||||
<string name="github">https://github.com/AndrewTrieu/tictactoeapp</string>
|
||||
<string name="start">START</string>
|
||||
<string name="logo">Logo</string>
|
||||
<string name="players">Players</string>
|
||||
<string name="player1">Player 1 - X</string>
|
||||
<string name="player2">Player 2 - O</string>
|
||||
<string name="play">Play</string>
|
||||
<string name="name">Player\'s name</string>
|
||||
<string name="again">Home</string>
|
||||
<string name="more">Reset</string>
|
||||
<string name="record">RECORD</string>
|
||||
<string name="title_activity_record">Record</string>
|
||||
<string name="empty">History is empty</string>
|
||||
<string name="suggest">Maybe play some games first?</string>
|
||||
<string name="temp"> </string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="details">Match details</string>
|
||||
<string name="time">Time:\u0020</string>
|
||||
<string name="winner">Winner:\u0020</string>
|
||||
</resources>
|
||||
25
app/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.TicTacToeAppLUT" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_500</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorOnPrimary">@color/white</item>
|
||||
<!-- Secondary brand color. -->
|
||||
<item name="colorSecondary">@color/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<!-- Status bar color. -->
|
||||
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
|
||||
<style name="Theme.TicTacToeAppLUT.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.TicTacToeAppLUT.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
|
||||
|
||||
<style name="Theme.TicTacToeAppLUT.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
|
||||
</resources>
|
||||
13
app/src/main/res/xml/backup_rules.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Sample backup rules file; uncomment and customize as necessary.
|
||||
See https://developer.android.com/guide/topics/data/autobackup
|
||||
for details.
|
||||
Note: This file is ignored for devices older that API 31
|
||||
See https://developer.android.com/about/versions/12/backup-restore
|
||||
-->
|
||||
<full-backup-content>
|
||||
<!--
|
||||
<include domain="sharedpref" path="."/>
|
||||
<exclude domain="sharedpref" path="device.xml"/>
|
||||
-->
|
||||
</full-backup-content>
|
||||
19
app/src/main/res/xml/data_extraction_rules.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Sample data extraction rules file; uncomment and customize as necessary.
|
||||
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
|
||||
for details.
|
||||
-->
|
||||
<data-extraction-rules>
|
||||
<cloud-backup>
|
||||
<!-- TODO: Use <include> and <exclude> to control what is backed up.
|
||||
<include .../>
|
||||
<exclude .../>
|
||||
-->
|
||||
</cloud-backup>
|
||||
<!--
|
||||
<device-transfer>
|
||||
<include .../>
|
||||
<exclude .../>
|
||||
</device-transfer>
|
||||
-->
|
||||
</data-extraction-rules>
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.example.tictactoeapplut;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
public class ExampleUnitTest {
|
||||
@Test
|
||||
public void addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2);
|
||||
}
|
||||
}
|
||||