radian 2 жил өмнө
parent
commit
7328b1c96e

+ 1 - 1
.idea/vcs.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
   </component>
 </project>

+ 5 - 0
app/build.gradle

@@ -26,6 +26,9 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+    buildFeatures {
+        viewBinding true
+    }
 }
 
 dependencies {
@@ -33,6 +36,8 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.6.0'
     implementation 'com.google.android.material:material:1.7.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+    implementation 'androidx.navigation:navigation-fragment:2.4.1'
+    implementation 'androidx.navigation:navigation-ui:2.4.1'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.5'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

+ 23 - 12
app/src/main/AndroidManifest.xml

@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    xmlns:tools="http://schemas.android.com/tools" >
+
     <uses-permission android:name="android.permission.INTERNET" />
+
     <queries>
         <intent>
             <action android:name="android.intent.action.TTS_SERVICE" />
@@ -18,67 +20,76 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/Theme.TodayHan"
-        tools:targetApi="31"
-        android:usesCleartextTraffic="true">
+        android:usesCleartextTraffic="true"
+        tools:targetApi="31" >
+        <activity
+            android:name=".BasicActivity"
+            android:exported="false"
+            android:label="@string/title_activity_basic"
+            android:theme="@style/Theme.TodayHan.NoActionBar" >
+            <meta-data
+                android:name="android.app.lib_name"
+                android:value="" />
+        </activity>
         <activity
             android:name=".activity.HistoryActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.RetestActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.RestudyActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.StudyResultActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.TestActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.StudyActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.ConfigActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.MenuActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.MainActivity"
-            android:exported="true">
+            android:exported="true" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 

+ 1 - 2
app/src/main/assets/css/calendar.css

@@ -46,7 +46,7 @@ body{
     float: left;
     background: white;
     padding: 5px;
-    width: 11.5vw;
+    width: 11.2vw;
     height: 7vh;
     margin-right: 2vw;
     margin-top: 10px;
@@ -68,7 +68,6 @@ body{
     font-size: 22px;
     text-align:center;
     margin-left: 0px;
-    margin-bottom: 20px;
     padding: 10px;
     font-weight:900;
 }

+ 32 - 0
app/src/main/assets/css/study.css

@@ -232,6 +232,38 @@ section {
 }
 
 
+.hanBtn{
+  width:25vw;
+  height:12vh;
+  color:#dddddd;
+  font-size:4rem;
+  font-family: 'ChosunGs';
+  background-image: url('file:///android_asset/img/hanja-back.png');
+  background-size: 25vw 12vh ;
+  background-repeat:no-repeat;
+  margin:0 auto;
+  vertical-align:middle;
+  text-align:center;
+  padding-top:2vh;
+  display:inline-block;
+}
+
+#testMeaning{
+  width:70vw;
+  height:10vh;
+  color:#dddddd;
+  font-size:4rem;
+  font-family: 'ChosunGs';
+  background:#222;
+  margin:0 auto;
+  vertical-align:middle;
+  text-align:center;
+  padding-top:5vh;
+  opacity: 0.5;
+  border-radius:10px;
+}
+
+
 /* pushBtn Start*/
 /* 6 */
 .custom-btn {

+ 6 - 1
app/src/main/assets/html/result.html

@@ -38,6 +38,7 @@
     <div id='perpectBtn' style="display:none;">
          <div style="margin-top:2vh;text-align:center;" id='studyBtn' ><button class='custom-btn btn-3'  onclick="goToStudyPage()"><sapn><i class="axi axi-pencil"></i> 재학습</sapn></button></div>
          <div style="margin-top:2vh;text-align:center;" id='testBtn'  ><button class='custom-btn btn-3'  onclick="goToTestPage()"><sapn><i class="axi axi-bmg-checklist"></i> 재테스트</sapn></button></div>
+        <div style="margin-top:2vh;text-align:center;"  id='reverTestBtn'  ><button class='custom-btn btn-3'  onclick="goToReverseTestPage()"><sapn><i class="axi axi-translate"></i> 변경테스트</sapn></button></div>
          <div style="margin-top:2vh;text-align:center;" id='menuBtn'  ><button class='custom-btn btn-3'  onclick="goToMenuPage()"><sapn><i class="axi axi-menu2"></i> 메뉴</sapn></button></div>
     </div>
   </div>
@@ -132,7 +133,7 @@
       $("#perpect").show();
       $("#perpectBtn").show();
       $("#perpect").css({"margin":"0 auto"});
-      $("#perpect").append("<div style='margin:0 auto;font-size:10vh;font-wight:900;color:#fff;width:50vw;text-align:center;height:10vh;'>&nbsp;</div>");
+      $("#perpect").append("<div style='margin:0 auto;font-size:10vh;font-wight:900;color:#fff;width:50vw;text-align:center;height:6vh;'>&nbsp;</div>");
       $("#perpect").append("<div style='margin:0 auto;font-size:10vh;font-wight:900;color:#fff;width:50vw;text-align:center;'><i class='axi axi-birthday-cake'></i></div>");
       $("#perpect").append("<div style='margin:0 auto;font-size:3vh;font-wight:900;color:#fff;width:80vw;text-align:center;'>수고하셨습니다.!!!</div>");
       $("#perpect").append("<div style='margin:0 auto;font-size:3vh;font-wight:900;color:#fff;width:80vw;text-align:center;'>만점을 획득 하셨습니다.!!!</div>");
@@ -170,5 +171,9 @@
   function goToMenuPage(){
       window.connector.goToMenuPage();
   }
+  function goToReverseTestPage(){
+      window.connector.goToReverseTestPage();
+  }
+
 
 </script>

+ 160 - 0
app/src/main/assets/html/reverseTest.html

@@ -0,0 +1,160 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title>Menu Page</title>
+ <link rel="stylesheet" type="text/css" href="../axicon/axicon.min.css" />
+ <link rel="stylesheet" href="../css/study.css">
+ <script src="../js/jquery-3.6.1.min.js"></script>
+ <script src="../js/common.js"></script>
+</head>
+<body>
+<section class="headTitleBar">
+ <div class="headTitle">오늘 漢字 공부할까<font style='font-family:HanWang KaiBold-Gb5;'>?</font></div>
+ <div class="headIcon"><i class="axi axi-menu2"></i></div>
+</section>
+<section style="margin-top:3vh;">
+ <div class='answer'><span id="testNo"></span>아래의 "뜻음"의 漢字로 올바른 것을 선택해 주세요.</div>
+ <div>
+  <div id='testMeaning' ></div>
+ </div>
+ <div>
+  <div id='example' style="margin-top:10vh;">
+  </div>
+ </div>
+ <div style="margin-top:5vh;display:none;" id="resultBtn"><center><button class='custom-btn btn-3' onclick="goToResult()"><i class="axi axi-ion-clipboard"></i> 결과보기</button></center></div>
+</section>
+<input type="hidden" id="selDate" />
+<input type="hidden" id="currWord" value="" />
+<input type="hidden" id="currId"   value="" />
+</body>
+</html>
+<script>
+  var studyList = null;
+  var index  = 0;
+  var currId = 0;
+  $(function(){
+        $("#selDate").val("");
+        //window.connector.getWordContent("today");
+        window.connector.getSelectDate();
+        /*
+        $(".exam").bind('touchstart', function(e){
+           $(".exam").css("color","red");
+        });
+        $(".exam").bind('touchend', function(e){
+          $(".exam").css("color","blue");
+        });
+       */
+  });
+
+  function setSelectDate(selectDate){
+     $("#selDate").val(selectDate);
+     //console.log("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"+selectDate);
+     if(selectDate!=null && selectDate!="" && selectDate!=undefined){
+         //console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>> select Date >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
+         window.connector.getStudyDayContent(selectDate);
+     }else{
+         //console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>> Today >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
+         window.connector.getWordContent("today");
+     }
+  }
+
+  function setWordContent(list){
+    this.studyList = list;
+    startExam();
+  }
+  function goToResult(){
+    var selDate = $("#selDate").val();
+    if(selDate!=null && selDate!="" && selDate!=undefined){
+         window.connector.goToStudyResultPage(selDate);
+    }else{
+        window.connector.goToStudyResultPage();
+    }
+  }
+
+  function startExam(){
+    if( studyList.length-1 >= this.index){
+      $("#example").html("");
+    }
+    if( this.index > studyList.length-1){
+      $("#resultBtn").show();
+    }else{
+    /*
+      if( studyList[this.index].id =="1500" || studyList[this.index].id =="226" ){
+         $("#testWord").css("font-family","HanWang KaiBold-Gb5");
+         $("#testWord").css("padding-top","3vh");
+      }else{
+         $("#testWord").css("font-family","ChosunGs");
+         $("#testWord").css("padding-top","5vh");
+      }
+    */
+
+      $("#testNo").text((this.index+1)+". ");
+      $("#testMeaning").text(studyList[this.index].meaning);
+
+      $("#currWord").val(studyList[this.index].word);
+      $("#currId").val(studyList[this.index].id);
+
+      //setTimeout( function(){readKorean($("#currWord").val(), $("#currId").val());}, 700);
+
+      this.currId = studyList[this.index].id;
+
+      //console.log(" this  >>>>>>>>>>>>>>>>>>>>>>>>>"+ studyList[this.index].studyDate );
+
+      window.connector.getTestExample(studyList[this.index].studyDate , studyList[this.index].id);
+      this.index++;
+
+    }
+  }
+
+  function setTestExam(list){
+   //console.log(list);
+    let inContent ="";
+    for(var i=0; i< list.length ; i++){
+
+      if(i==0 || i==2  || i==4 ){
+            inContent  ="<div style='margin:0 auto;width:85vw;'>";
+            inContent +="    <div class='hanBtn' onclick='answerCheck("+list[i].id+")' ><span id='A"+list[i].id+"'>"+list[i].word+"</span></div>";
+      }else{
+           inContent  +="    <div class='hanBtn' onclick='answerCheck("+list[i].id+")' ><span id='A"+list[i].id+"'>"+list[i].word+"</span></div>";
+           inContent  +="</div>";
+      }
+
+      if(i%2==1 || i==(list.length-1)){
+            $("#example").append(inContent);
+        //  $("#example").append("<div style='height:1vh'>&nbsp;</div>");
+      }
+    }
+  }
+  function answerCheck(selectId){
+    if(selectId == this.currId){
+      //console.log("=-=-=-=-=-= ok =-=-=-=-=-=- selectId >>"+selectId +" ,  this.currId >> "+ this.currId);
+      window.connector.updateIncorrect("Y", this.currId);
+      $("#A"+this.currId).css("color" , "yellow");
+      $("#A"+this.currId).parent().css("text-shadow" , "0 0 5px #FFF, 0 0 10px #FFF, 0 0 20px #FFF, 0 0 30px #FFF, 0 0 40px #FFF, 0 0 55px #FFF, 0 0 75px #FFF");
+      answerTrue();
+    }else{
+    console.log("=-=-=-=-=-= fail =-=-=-=-=-=- selectId >> "+selectId +" ,  this.currId >> "+ this.currId);
+      $("#A"+selectId).css("text-decoration" , "line-through");
+      $("#A"+this.currId).css("color" , "yellow");
+      $("#A"+this.currId).parent().css("text-shadow" , "0 0 5px #FFF, 0 0 10px #FFF, 0 0 20px #FFF, 0 0 30px #FFF, 0 0 40px #FFF, 0 0 55px #FFF, 0 0 75px #FFF");
+      window.connector.updateIncorrect("N", this.currId);
+      answerFalse();
+    }
+    setTimeout("startExam()" ,"1000");
+
+  }
+
+  function answerFalse(){
+    var audio = new Audio('../sound/false.wav');
+    audio.play();
+  }
+  function answerTrue(){
+    var audio = new Audio('../sound/true.wav');
+    audio.play();
+  }
+
+  function readKorean(word, id){
+    window.connector.readText(word, id);
+  }
+</script>

+ 10 - 4
app/src/main/assets/html/study.html

@@ -127,10 +127,12 @@
    <!-- 하단버튼 끝 -->
  </section>
    <input type="hidden" id="selDate"  />
-   <input type="hidden" id="reviewGbn" />
+   <input type="hidden" id="reviewGbn" /> <!-- config. info -->
    <input type="hidden" id="twinkleCnt" />
    <input type="hidden" id="speedCnt" />
    <input type="hidden" id="reviewClickGbn" />
+   <input type="hidden" id="reviewIsGbn" /> <!-- 복습할 이력이 있는지 여부 -->
+   <input type="hidden" id="reviewActGbn" /> <!-- 복습할 했는지 여부 -->
  </body>
 </html>
 <script>
@@ -148,6 +150,7 @@
     $("#reNewBtn").hide();
     $("#selDate").val("");
     window.connector.getConfigJson();
+    window.connector.getStudyDayMaster(Util.getToday());
     window.connector.getActName();
   });
   function setConfigJson(list){
@@ -181,18 +184,21 @@
          if(actName.indexOf("Study") > 0){
 
              console.log(" #reviewGbn >>>> " + $("#reviewGbn").val());
+             console.log(" #reviewIsGbn >>>> " + $("#reviewIsGbn").val());
+             console.log(" #reviewActGbn >>>> " + $("#reviewActGbn").val());
 
-             if($("#reviewGbn").val() =="N" ){
+             if($("#reviewGbn").val() =="Y" && $("#reviewIsGbn").val() =="Y" && $("#reviewActGbn").val() =="N" ){
                  // 복습일 경우.. 복습할지 문의
                  $.confirm('이전 학습을 복습하시겠습니까?',{
                     title:'안내',
-                    callEvent:function(){window.connector.getWordContent("reStudy"); $("#reviewClickGbn").val("Y");},
-                    cancelEvent:function(){window.connector.getWordContent("today");},
+                    callEvent:function(){window.connector.getWordContent("reStudy"); $("#reviewClickGbn").val("Y"); window.connector.updateReviewActGbn( Util.getToday() , 'Y');},
+                    cancelEvent:function(){window.connector.getWordContent("today"); window.connector.updateReviewActGbn( Util.getToday() , 'N');},
                     confirmButton:'복습',
                     cancelButton:'학습'
                 });
              }else{
                  window.connector.getWordContent("today");
+                 window.connector.updateReviewActGbn( Util.getToday() , $("#reviewIsGbn").val());
              }
          }else{
              window.connector.getReWordContent("reStudy");

+ 2 - 2
app/src/main/assets/html/test.html

@@ -14,7 +14,7 @@
   <div class="headIcon"><i class="axi axi-menu2"></i></div>
  </section>
  <section style="margin-top:3vh;">
-  <div class='answer'><span id="testNo"></span>아래의 단어의 뜻으로 올바른 것을 선택해 주세요.</div>
+  <div class='answer'><span id="testNo"></span>아래의 漢字의 뜻으로 올바른 것을 선택해 주세요.</div>
   <div>
     <div id='testWord' id="wordArea"></div>
   </div>
@@ -109,7 +109,7 @@
    //console.log(list);
     for(var i=0; i< list.length ; i++){
       $("#example").append("<div style='margin:0 auto;width:85vw;'><button class='custom-btn btn-16' onclick='answerCheck("+list[i].id+")'  ><span id='A"+list[i].id+"'>"+list[i].meaning+"</span></button></div>");
-      $("#example").append("<div style='height:1vh'>&nbsp;</div>");
+      $("#example").append("<div style='height:2vh'>&nbsp;</div>");
     }
   }
   function answerCheck(selectId){

+ 26 - 7
app/src/main/assets/js/common.js

@@ -38,13 +38,15 @@ var Util ={
 		 * json의 Key값을 화면의 id를 찾아 넣어 준다.
 		 */
 		setPageData:function (json){
-		    $.each(json, function(key, value){
-		    	value=Util.nvl(value);
-		    	// 대상 객체가 존재하면..
-		    	if($("#"+key).length > 0){
-		    		$("#"+key).val(value);
-		    	}
-			});
+		   if(json!=null && json != undefined){
+                $.each(json, function(key, value){
+                    value=Util.nvl(value);
+                    // 대상 객체가 존재하면..
+                    if($("#"+key).length > 0){
+                        $("#"+key).val(value);
+                    }
+                });
+			}
 		},
         nvl:function(str){
             if(str==null){
@@ -66,5 +68,22 @@ var Util ={
                 confirmButton:'종료',
                 cancelButton:'취소'
             });
+       },
+       getToday:function(){
+           const date = new Date();
+
+           let curYear = date.getFullYear();
+           let curMon  = (date.getMonth()+1)+"";
+           let curDay  = (date.getDate())+"";
+
+           let today = curYear+"-"+Util.get2lenFormat(curMon)+"-"+Util.get2lenFormat(curDay);
+
+           return today;
+       },
+       get2lenFormat:function(str){
+          if( str.length ==1 ){
+            str="0"+str;
+          }
+          return str;
        }
 };

+ 7 - 2
app/src/main/java/kr/co/iyapp/todayhan/activity/TestActivity.java

@@ -50,13 +50,18 @@ public class TestActivity extends AppCompatActivity {
         webView = (WebView) findViewById(R.id.webView);
         webView.getSettings().setJavaScriptEnabled(true); //자바스크립트 허용
 
-        webView.loadUrl("file:///android_asset/html/test.html");
+
         webView.setWebChromeClient(new WebChromeClient());  // 새창 띄우지 않기
         webView.setWebViewClient(new WevViewClientClass());
 
         Intent intent = getIntent();
         String selectDate = intent.getStringExtra("selectDate") == null?"": intent.getStringExtra("selectDate");
-
+        String reverseGbn = intent.getStringExtra("reverseGbn") == null?"N": intent.getStringExtra("reverseGbn");
+        String url ="file:///android_asset/html/test.html";
+        if("Y".equals(reverseGbn)){
+            url ="file:///android_asset/html/reverseTest.html";
+        }
+        webView.loadUrl(url);
         webView.addJavascriptInterface(new HtmlBridge(webView, TestActivity.this, tts , selectDate), "connector");
 
     }

+ 61 - 17
app/src/main/java/kr/co/iyapp/todayhan/dao/TodayHanjaDAO.java

@@ -42,10 +42,7 @@ public class TodayHanjaDAO {
             selectSql.append("\n        thc_id,");
             selectSql.append("\n        keys,");
             selectSql.append("\n        label,");
-            selectSql.append("\n        case");
-            selectSql.append("\n             when keys == 'reviewGbn' then ( case when  (  select  count(1) as 'cnt'  from  study_content where study_date = (select max(study_date) from  study_content where study_date != date('now', 'localtime'))  ) > 0 then value else 'N'  end )");
-            selectSql.append("\n             else value");
-            selectSql.append("\n        end as value");
+            selectSql.append("\n        value");
             selectSql.append("\n  from study_config\n");
 
             Log.d(TAG, "selectSql >>> " + selectSql.toString());
@@ -105,14 +102,7 @@ public class TodayHanjaDAO {
             selectSql.append("\n        thc_id,");
             selectSql.append("\n        keys,");
             selectSql.append("\n        label,");
-            if(pageGbn.equals("config")) {
-                selectSql.append("\n      value");
-            }else{
-                selectSql.append("\n        case");
-                selectSql.append("\n             when keys == 'reviewGbn' then ( case when  (  select  review_act_gbn   from  study_day_master  where study_date = (select max(study_date) from  study_content where study_date != date('now', 'localtime'))  ) == 'N' then value else 'Y'  end )");
-                selectSql.append("\n             else value");
-                selectSql.append("\n        end as value");
-            }
+            selectSql.append("\n        value");
             selectSql.append("\n  from study_config\n");
 
             Log.d(TAG, "selectSql >>> " + selectSql.toString());
@@ -197,10 +187,10 @@ public class TodayHanjaDAO {
             }else if(todayGbn.equals("reStudy")){
                 // 구분자가 오늘이 아니면 즉 복습이면 오늘이 아닌 날중에 가장 마지막날(max(study_date)) 틀린거 상관 없이 학습
                 // incorrectSql 없어야 함
-                sql = "select * from  study_content where study_date = (select max(study_date) from  study_content where study_date != date('now', 'localtime') )";
+                sql = "select * from  study_content where study_date = (select max(study_date) from  study_content where study_date != date('now', 'localtime') ) order by random()" ;
             }else{
                 // renew 오답학습.. incorrectSql 있어야함
-                sql = "select * from  study_content where study_date = date('"+todayGbn+"')  "+incorrectSql;
+                sql = "select * from  study_content where study_date = date('"+todayGbn+"')  "+incorrectSql+" order by random()";
             }
 
             Log.d(TAG, "sql >>>> \n□□□□ " + sql);
@@ -259,7 +249,7 @@ public class TodayHanjaDAO {
             String sql = "";
 
             // 구분자가 오늘이 아니면 즉 복습이면 오늘이 아닌 날중에 가장 마지막날(max(study_date))
-            sql = "select * from  study_content where study_date = '"+date+"' ";
+            sql = "select * from  study_content where study_date = '"+date+"'  order by random() ";
 
             Log.d(TAG, "sql >>>> \n□□□□ " + sql);
 
@@ -343,7 +333,6 @@ public class TodayHanjaDAO {
 
             mDb.execSQL(updateSql);
 
-            mergeDayMaster(today, "N");
         } catch (SQLException mSQLException) {
             Log.e(TAG, "getTestData >>" + mSQLException);
         } finally {
@@ -456,7 +445,7 @@ public class TodayHanjaDAO {
                    sql  += " (select * from  study_content where id != '"+wordId+"' and study_date = date('"+date+"') order by random() limit 4)";
                    sql  += " union all ";
                    sql  += " select * from  study_content where  id = '"+wordId+"'  and study_date = date('"+date+"')";
-                   sql  += " ) order by id ";
+                   sql  += " ) order by random() ";
 
             Log.d(TAG, "sql >>>> \n□□□□ " + sql);
 
@@ -660,5 +649,60 @@ public class TodayHanjaDAO {
         }
     }// method end
 
+    public JSONObject getStudyDayMaster(String date) {
+        Cursor mCur = null;
+
+        JSONObject obj = new JSONObject();
+        try {
+            // DB connetion
+            mDb = dbutl.connetion();
+            String sql = "\n select " ;
+                   sql +="\n	   study_date";
+                   sql +="\n	,  review_act_gbn";
+                   sql +="\n	,  case";
+                   sql +="\n		   when cnt > 0 then 'Y' else 'N'";
+                   sql +="\n	  end as review_is_gbn";
+                   sql +="\nfrom";
+                   sql +="\n	(";
+                   sql +="\n	select";
+                   sql +="\n		study_date,";
+                   sql +="\n		upper(ifnull(review_act_gbn,'N')) as  review_act_gbn,";
+                   sql +="\n		(select	count(*) from study_day_master	where study_date != date('"+date+"') ) as cnt";
+                   sql +="\n	  from";
+                   sql +="\n		study_day_master";
+                   sql +="\n     where study_date =date('"+date+"')";
+                   sql +="\n    )";
+
+            Log.d(TAG, "sql >>>> \n□□□□ " + sql);
+
+            mCur = mDb.rawQuery( sql , null);
+
+            if (mCur != null) {
+                // 칼럼의 마지막까지
+                try{
+                    while (mCur.moveToNext()) {
+                        obj.put("studyDate"    , mCur.getString(0));
+                        obj.put("reviewActGbn" , mCur.getString(1));
+                        obj.put("reviewIsGbn"  , mCur.getString(2));
+                    }
+                }catch(JSONException j){
+                    Log.e(TAG, "getStudyDayMaster >>" + j.toString());
+                }
+            }
+            Log.d(TAG, "getStudyDayMaster >>" + obj);
+        } catch (Exception e) {
+            Log.e(TAG, "getStudyDayMaster >>" + e.toString());
+        } finally {
+            if (mCur != null) {
+                mCur.close();
+            }
+            if (mDb != null) {
+                mDb.close();
+            }
+        }
+        return obj;
+    }// method end
+
+
 
 }

+ 18 - 0
app/src/main/java/kr/co/iyapp/todayhan/util/HtmlBridge.java

@@ -222,6 +222,15 @@ public class HtmlBridge<context> {
         Intent intent = new Intent(this.context, TestActivity.class);
         context.startActivity(intent);
 //        Activity act = (Activity) this.context;
+//        act.finish();
+    }
+    @JavascriptInterface
+    public void goToReverseTestPage() {
+        //Toast.makeText( context, "settings in ...", Toast.LENGTH_LONG).show();
+        Intent intent = new Intent(this.context, TestActivity.class);
+        intent.putExtra("reverseGbn", "Y");
+        context.startActivity(intent);
+//        Activity act = (Activity) this.context;
 //        act.finish();
     }
     @JavascriptInterface
@@ -375,6 +384,15 @@ public class HtmlBridge<context> {
             }
         });
     }
+    @JavascriptInterface
+    public void getStudyDayMaster(String date){
+        JSONObject json = da.getStudyDayMaster(date);
+        handler.post(new Runnable() {
+            public void run() {
+                webView.loadUrl("javascript:Util.setPageData("+json+")");
+            }
+        });
+    }
 
     private void initTTS() {
         //Log.d(TAG , "tts...................."+tts.toString());

+ 28 - 0
app/src/main/res/navigation/nav_graph.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation 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:id="@+id/nav_graph"
+    app:startDestination="@id/FirstFragment">
+
+    <fragment
+        android:id="@+id/FirstFragment"
+        android:name="kr.co.iyapp.todayhan.activity.FirstFragment"
+        android:label="@string/first_fragment_label"
+        tools:layout="@layout/fragment_first" >
+
+        <action
+            android:id="@+id/action_FirstFragment_to_SecondFragment"
+            app:destination="@id/SecondFragment" />
+    </fragment>
+    <fragment
+        android:id="@+id/SecondFragment"
+        android:name="kr.co.iyapp.todayhan.activity.SecondFragment"
+        android:label="@string/second_fragment_label"
+        tools:layout="@layout/fragment_second" >
+
+        <action
+            android:id="@+id/action_SecondFragment_to_FirstFragment"
+            app:destination="@id/FirstFragment" />
+    </fragment>
+</navigation>

+ 3 - 0
app/src/main/res/values-land/dimens.xml

@@ -0,0 +1,3 @@
+<resources>
+      <dimen name="fab_margin">48dp</dimen>
+   </resources>

+ 3 - 0
app/src/main/res/values-w1240dp/dimens.xml

@@ -0,0 +1,3 @@
+<resources>
+      <dimen name="fab_margin">200dp</dimen>
+   </resources>

+ 3 - 0
app/src/main/res/values-w600dp/dimens.xml

@@ -0,0 +1,3 @@
+<resources>
+      <dimen name="fab_margin">48dp</dimen>
+   </resources>

+ 3 - 0
app/src/main/res/values/dimens.xml

@@ -0,0 +1,3 @@
+<resources>
+      <dimen name="fab_margin">16dp</dimen>
+   </resources>

+ 9 - 0
app/src/main/res/values/strings.xml

@@ -1,3 +1,12 @@
 <resources>
     <string name="app_name">오늘 한자 공부할까?</string>
+    <string name="title_activity_basic">BasicActivity</string>
+    <!-- Strings used for fragments for navigation -->
+    <string name="first_fragment_label">First Fragment</string>
+    <string name="second_fragment_label">Second Fragment</string>
+    <string name="next">Next</string>
+    <string name="previous">Previous</string>
+
+    <string name="hello_first_fragment">Hello first fragment</string>
+    <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
 </resources>

+ 6 - 0
app/src/main/res/values/themes.xml

@@ -15,4 +15,10 @@
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
     </style>
+    <style name="Theme.TodayHan.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+    </style>
+    <style name="Theme.TodayHan.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
+    <style name="Theme.TodayHan.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
 </resources>