From 465e417724151f500097d911391d2611031d996e Mon Sep 17 00:00:00 2001
From: fpeterfalvi <fpeterfalvi@gmail.com>
Date: Fri, 27 Apr 2018 00:42:30 +0200
Subject: [PATCH] Actual question database stored in Sugar ORM

Question database is persistent until a new question file is loaded.
---
 KvizServer/app/build.gradle                   |  1 +
 KvizServer/app/src/main/AndroidManifest.xml   |  9 +++-
 .../java/onlab/kvizserver/GameActivity.java   | 20 +-------
 .../kvizserver/KvizServerApplication.java     |  6 +++
 .../java/onlab/kvizserver/LobbyActivity.java  |  3 --
 .../java/onlab/kvizserver/MainActivity.java   | 51 ++++++++++++++++++-
 .../kvizserver/QuestionListFragment.java      | 29 +----------
 .../java/onlab/kvizserver/QuizUpActivity.java | 15 +-----
 .../java/onlab/kvizserver/model/Question.java | 41 +++++++++++----
 .../main/res/layout/fragment_game_control.xml |  4 +-
 .../app/src/main/res/values/strings.xml       |  1 +
 11 files changed, 103 insertions(+), 77 deletions(-)
 create mode 100644 KvizServer/app/src/main/java/onlab/kvizserver/KvizServerApplication.java

diff --git a/KvizServer/app/build.gradle b/KvizServer/app/build.gradle
index 73589af..f51e8f8 100644
--- a/KvizServer/app/build.gradle
+++ b/KvizServer/app/build.gradle
@@ -29,4 +29,5 @@ dependencies {
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
     implementation 'com.github.rustamg:file-dialogs:1.0'
     implementation 'com.google.code.gson:gson:2.8.2'
+    implementation 'com.github.satyan:sugar:1.4'
 }
diff --git a/KvizServer/app/src/main/AndroidManifest.xml b/KvizServer/app/src/main/AndroidManifest.xml
index ef887cb..6dc8422 100644
--- a/KvizServer/app/src/main/AndroidManifest.xml
+++ b/KvizServer/app/src/main/AndroidManifest.xml
@@ -19,7 +19,8 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:theme="@style/AppTheme">
+        android:theme="@style/AppTheme"
+        android:name=".KvizServerApplication">
         <activity
             android:name=".MainActivity"
             android:screenOrientation="portrait">
@@ -39,6 +40,12 @@
         <activity android:name=".QuizUpActivity"
             android:screenOrientation="portrait">
         </activity>
+
+        <meta-data android:name="DATABASE" android:value="questions.db" />
+        <meta-data android:name="VERSION" android:value="2" />
+        <meta-data android:name="QUERY_LOG" android:value="true" />
+        <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="onlab.kvizserver" />
+
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java
index d40f803..726d6db 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java
@@ -48,7 +48,6 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_game);
         Bundle extras = getIntent().getExtras();
-        String questionFileName = extras.getString("QUESTION_FILE_NAME", null);
 
         this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
 
@@ -59,7 +58,7 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
         numberOfPlayers = ClientHolder.size();
 
         gameControlFragment = GameControlFragment.newInstance(numberOfPlayers);
-        questionListFragment = QuestionListFragment.newInstance(questionFileName);
+        questionListFragment = QuestionListFragment.newInstance();
         ViewPager vpProfile = (ViewPager) findViewById(R.id.GameActivityViewPager);
         vpProfile.setAdapter(new GameActivityPagerAdapter(getSupportFragmentManager(), gameControlFragment, questionListFragment));
 
@@ -144,23 +143,6 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
         }
     }
 
-    public static List<Question> readQuestions(InputStream inputStream) {
-        List<Question> loadedQuestions = new ArrayList<>();
-        BufferedReader buffreader;
-        try {
-            buffreader = new BufferedReader(new InputStreamReader(inputStream));
-            String line;
-            while ((line = buffreader.readLine()) != null) {
-                String[] parts = line.split("\t");
-                Question question = new Question(parts);
-                loadedQuestions.add(question);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return loadedQuestions;
-    }
-
     private void calculateGuessQuestionWinner() {
         PlayerAnswer bestAnswer = playerAnswers[0];
         int indexOfBestAnswer = 0;
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/KvizServerApplication.java b/KvizServer/app/src/main/java/onlab/kvizserver/KvizServerApplication.java
new file mode 100644
index 0000000..a0d9b7a
--- /dev/null
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/KvizServerApplication.java
@@ -0,0 +1,6 @@
+package onlab.kvizserver;
+
+import com.orm.SugarApp;
+
+public class KvizServerApplication extends SugarApp {
+}
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java
index ee55f49..ccf5699 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java
@@ -54,7 +54,6 @@ public class LobbyActivity extends AppCompatActivity {
     private RecyclerView recyclerView;
     private ClientListAdapter adapter;
 
-    private String questionFileName;
     private String gameMode;
 
     private ArrayList<Thread> threads;
@@ -88,7 +87,6 @@ public class LobbyActivity extends AppCompatActivity {
                 HOSTNAME = "";
             } else {
                 HOSTNAME = extras.getString("STRING_HOSTNAME");
-                questionFileName = extras.getString("QUESTION_FILE_NAME", null);
                 gameMode = extras.getString("GAME_MODE");
                 Log.d("LobbyActivity", "The game mode is " + gameMode);
             }
@@ -119,7 +117,6 @@ public class LobbyActivity extends AppCompatActivity {
                     } else {
                         intent = new Intent(getApplicationContext(), QuizUpActivity.class);
                     }
-                    intent.putExtra("QUESTION_FILE_NAME", questionFileName);
                     startActivity(intent);
                 }
             }
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java
index 3fe8f19..ce3fc88 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java
@@ -1,6 +1,5 @@
 package onlab.kvizserver;
 
-import android.app.DialogFragment;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -16,8 +15,14 @@ import android.widget.TextView;
 import com.rustamg.filedialogs.FileDialog;
 import com.rustamg.filedialogs.OpenFileDialog;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import onlab.kvizserver.model.Question;
 
 public class MainActivity extends AppCompatActivity implements FileDialog.OnFileSelectedListener {
 
@@ -34,6 +39,17 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
         final EditText txtName = (EditText) findViewById(R.id.txtName);
         Button ChooseQuestionFileBtn = (Button) findViewById(R.id.ChooseQuestionFile);
 
+        SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
+        boolean firstRun = sharedPref.getBoolean(getString(R.string.first_run), true);
+
+        if (firstRun) {
+            Log.w("firstrun", "firstrun");
+            initializeDatabase();
+            SharedPreferences.Editor editor = sharedPref.edit();
+            editor.putBoolean(getString(R.string.first_run), false);
+            editor.commit();
+        }
+
         ChooseQuestionFileBtn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -44,10 +60,17 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
 
         StartLobbyBtn.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
+                if (fileCanonicalPath != null) {
+                    try {
+                        InputStream inputStream = new FileInputStream(new File(fileCanonicalPath));
+                        readQuestions(inputStream);
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
                 Intent intent = new Intent(getApplicationContext(), LobbyActivity.class);
                 String hname = txtName.getText().toString();
                 intent.putExtra("STRING_HOSTNAME", hname);
-                intent.putExtra("QUESTION_FILE_NAME", fileCanonicalPath);
                 intent.putExtra("GAME_MODE", gameMode);
 
                 startActivity(intent);
@@ -55,6 +78,30 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
         });
     }
 
+    private void initializeDatabase() {
+        try {
+            InputStream inputStream = getAssets().open("multiple.txt");
+            readQuestions(inputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void readQuestions(InputStream inputStream) {
+        Question.deleteAll(Question.class);
+        try {
+            BufferedReader buffreader = new BufferedReader(new InputStreamReader(inputStream));
+            String line;
+            while ((line = buffreader.readLine()) != null) {
+                String[] parts = line.split("\t");
+                Question question = new Question(parts);
+                question.save();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
     @Override
     public void onFileSelected(FileDialog dialog, File file) {
         try {
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java
index a299409..f0130e0 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java
@@ -11,20 +11,11 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.List;
 
 import onlab.kvizserver.model.Question;
 
-import static onlab.kvizserver.GameActivity.readQuestions;
-
 public class QuestionListFragment extends Fragment {
-    private static final String QUESTION_FILE_NAME = "QUESTION_FILE_NAME";
-
-    private String questionFileName;
 
     private OnFragmentInteractionListener mListener;
 
@@ -37,10 +28,9 @@ public class QuestionListFragment extends Fragment {
         // Required empty public constructor
     }
 
-    public static QuestionListFragment newInstance(String questionFileName) {
+    public static QuestionListFragment newInstance() {
         QuestionListFragment fragment = new QuestionListFragment();
         Bundle args = new Bundle();
-        args.putString(QUESTION_FILE_NAME, questionFileName);
         fragment.setArguments(args);
         return fragment;
     }
@@ -48,9 +38,6 @@ public class QuestionListFragment extends Fragment {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (getArguments() != null) {
-            questionFileName = getArguments().getString(QUESTION_FILE_NAME);
-        }
     }
 
     @Override
@@ -63,19 +50,7 @@ public class QuestionListFragment extends Fragment {
     @Override
     public void onActivityCreated(@Nullable Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-
-        InputStream inputStream = null;
-        try {
-            if (questionFileName == null) {
-                inputStream = getContext().getAssets().open("multiple.txt");
-            } else {
-                inputStream = new FileInputStream(new File(questionFileName));
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        questions = readQuestions(inputStream);
-
+        questions = Question.listAll(Question.class);
         initRecyclerView();
     }
 
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/QuizUpActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/QuizUpActivity.java
index 3bf440c..c6ee36d 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/QuizUpActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/QuizUpActivity.java
@@ -35,11 +35,9 @@ public class QuizUpActivity extends AppCompatActivity {
     private int round = 0;
     private int numberOfPlayers;
     private final List<String> answers = new ArrayList<>();
-    //private int[] playerAnswerValues;
     private int correctAnswer;
     private String questionString;
     private int[] playerScores;
-    //private String[] playerNames;
     private PlayerAnswer[] playerAnswers;
 
     private List<BufferedReader> inputs = new ArrayList<>();
@@ -61,23 +59,12 @@ public class QuizUpActivity extends AppCompatActivity {
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
         Bundle extras = getIntent().getExtras();
-        String questionFileName = extras.getString("QUESTION_FILE_NAME", null);
 
         gson = new Gson();
 
         updateConversationHandler = new Handler();
 
-        InputStream inputStream = null;
-        try {
-            if (questionFileName == null) {
-                inputStream = getAssets().open("multiple.txt");
-            } else {
-                inputStream = new FileInputStream(new File(questionFileName));
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        questions = GameActivity.readQuestions(inputStream);
+        questions = Question.listAll(Question.class);
 
         //nem feleletválasztós kérdések eltávolítása
         Iterator<Question> it = questions.iterator();
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java b/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java
index 2f5109b..60f102f 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java
@@ -1,25 +1,38 @@
 package onlab.kvizserver.model;
 
+import com.orm.SugarRecord;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class Question {
+public class Question extends SugarRecord {
     private String topic;
     private String questionText;
     private String correctAnswer;
-    private List<String> otherAnswers = new ArrayList<>();
+    private String wrongAnswer1 = null;
+    private String wrongAnswer2 = null;
+    private String wrongAnswer3 = null;
     private boolean enabled;
 
     public static final int MULTIPLE_CHOICE = 0;
     public static final int GUESS = 1;
 
+    public Question() {
+    }
+
     public Question(String[] data) {
         topic = data[0];
         questionText = data[1];
         correctAnswer = data[2];
-        for (int i=3;i<data.length-1;i++) {
-            otherAnswers.add(data[i]);
+        if (data.length >= 5) {
+            wrongAnswer1 = data[3];
+        }
+        if (data.length >= 6) {
+            wrongAnswer2 = data[4];
+        }
+        if (data.length >= 7) {
+            wrongAnswer3 = data[5];
         }
         enabled = data[data.length-1].equals("enabled");
     }
@@ -35,12 +48,24 @@ public class Question {
     public List<String> getAnswers() {
         List<String> list = new ArrayList<>();
         list.add(correctAnswer);
-        list.addAll(otherAnswers);
+        if (wrongAnswer1 != null)
+            list.add(wrongAnswer1);
+        if (wrongAnswer2 != null)
+            list.add(wrongAnswer2);
+        if (wrongAnswer3 != null)
+            list.add(wrongAnswer3);
         Collections.shuffle(list);
         return list;
     }
 
     public List<String> getOtherAnswers() {
+        List<String> otherAnswers = new ArrayList<>();
+        if (wrongAnswer1 != null)
+            otherAnswers.add(wrongAnswer1);
+        if (wrongAnswer2 != null)
+            otherAnswers.add(wrongAnswer2);
+        if (wrongAnswer3 != null)
+            otherAnswers.add(wrongAnswer3);
         return otherAnswers;
     }
 
@@ -57,12 +82,10 @@ public class Question {
     }
 
     public int getType() {
-        if (otherAnswers.size() == 3) {
+        if (wrongAnswer1 != null) {
             return MULTIPLE_CHOICE;
-        } else if (otherAnswers.size() == 0) {
-            return GUESS;
         } else {
-            return -1;
+            return GUESS;
         }
     }
 
diff --git a/KvizServer/app/src/main/res/layout/fragment_game_control.xml b/KvizServer/app/src/main/res/layout/fragment_game_control.xml
index f265c30..fad518a 100644
--- a/KvizServer/app/src/main/res/layout/fragment_game_control.xml
+++ b/KvizServer/app/src/main/res/layout/fragment_game_control.xml
@@ -58,7 +58,7 @@
         <Button
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="Next Question"
+            android:text="Send next question"
             android:id="@+id/NextQuestion"
             android:enabled="false"
             android:textSize="20sp" />
@@ -66,7 +66,7 @@
         <Button
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="Show correct answer to players"
+            android:text="Send correct answer"
             android:id="@+id/CorrectAnswer"
             android:enabled="false"
             android:textSize="20sp" />
diff --git a/KvizServer/app/src/main/res/values/strings.xml b/KvizServer/app/src/main/res/values/strings.xml
index 1f7660e..bc2de53 100644
--- a/KvizServer/app/src/main/res/values/strings.xml
+++ b/KvizServer/app/src/main/res/values/strings.xml
@@ -4,4 +4,5 @@
 
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>
+    <string name="first_run">first run</string>
 </resources>
-- 
GitLab