Commit 3b4c9b45dcee48059eab3d343ebc378cc4642e9c

Authored by xujie
0 parents
Exists in master

create the project of LianHanZi

Showing 93 changed files with 3686 additions and 0 deletions   Show diff stats
MiaohongEntry/.gitignore
File was created 1 *.iml
2 .gradle
3 /local.properties
4 /.idea/workspace.xml
5 /.idea/libraries
6 .DS_Store
7 /build
8 /captures
9 .externalNativeBuild
10
MiaohongEntry/.idea/compiler.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4">
3 <component name="CompilerConfiguration">
4 <resourceExtensions />
5 <wildcardResourcePatterns>
6 <entry name="!?*.java" />
7 <entry name="!?*.form" />
8 <entry name="!?*.class" />
9 <entry name="!?*.groovy" />
10 <entry name="!?*.scala" />
11 <entry name="!?*.flex" />
12 <entry name="!?*.kt" />
13 <entry name="!?*.clj" />
14 <entry name="!?*.aj" />
15 </wildcardResourcePatterns>
16 <annotationProcessing>
17 <profile default="true" name="Default" enabled="false">
18 <processorPath useClasspath="true" />
19 </profile>
20 </annotationProcessing>
21 </component>
22 </project>
MiaohongEntry/.idea/copyright/profiles_settings.xml
File was created 1 <component name="CopyrightManager">
2 <settings default="" />
3 </component>
MiaohongEntry/.idea/gradle.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4">
3 <component name="GradleSettings">
4 <option name="linkedExternalProjectsSettings">
5 <GradleProjectSettings>
6 <option name="distributionType" value="DEFAULT_WRAPPED" />
7 <option name="externalProjectPath" value="$PROJECT_DIR$" />
8 <option name="modules">
9 <set>
10 <option value="$PROJECT_DIR$" />
11 <option value="$PROJECT_DIR$/app" />
12 </set>
13 </option>
14 <option name="resolveModulePerSourceSet" value="false" />
15 </GradleProjectSettings>
16 </option>
17 </component>
18 </project>
MiaohongEntry/.idea/misc.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4">
3 <component name="EntryPointsManager">
4 <entry_points version="2.0" />
5 </component>
6 <component name="NullableNotNullManager">
7 <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
8 <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
9 <option name="myNullables">
10 <value>
11 <list size="4">
12 <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
13 <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
14 <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
15 <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
16 </list>
17 </value>
18 </option>
19 <option name="myNotNulls">
20 <value>
21 <list size="4">
22 <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
23 <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
24 <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
25 <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
26 </list>
27 </value>
28 </option>
29 </component>
30 <component name="ProjectLevelVcsManager" settingsEditedManually="false">
31 <OptionsSetting value="true" id="Add" />
32 <OptionsSetting value="true" id="Remove" />
33 <OptionsSetting value="true" id="Checkout" />
34 <OptionsSetting value="true" id="Update" />
35 <OptionsSetting value="true" id="Status" />
36 <OptionsSetting value="true" id="Edit" />
37 <ConfirmationsSetting value="0" id="Add" />
38 <ConfirmationsSetting value="0" id="Remove" />
39 </component>
40 <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
41 <output url="file://$PROJECT_DIR$/build/classes" />
42 </component>
43 <component name="ProjectType">
44 <option name="id" value="Android" />
45 </component>
46 </project>
MiaohongEntry/.idea/modules.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4">
3 <component name="ProjectModuleManager">
4 <modules>
5 <module fileurl="file://$PROJECT_DIR$/MiaohongEntry.iml" filepath="$PROJECT_DIR$/MiaohongEntry.iml" />
6 <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
7 </modules>
8 </component>
9 </project>
MiaohongEntry/.idea/runConfigurations.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4">
3 <component name="RunConfigurationProducerService">
4 <option name="ignoredProducers">
5 <set>
6 <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
7 <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
8 <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
9 </set>
10 </option>
11 </component>
12 </project>
MiaohongEntry/app/.gitignore
File was created 1 /build
2
MiaohongEntry/app/build.gradle
File was created 1 apply plugin: 'com.android.application'
2
3 android {
4 compileSdkVersion 26
5 buildToolsVersion "26.0.2"
6 defaultConfig {
7 applicationId "com.hjx.miaohongentry"
8 minSdkVersion 17
9 targetSdkVersion 26
10 versionCode 2
11 versionName "1.0.1"
12 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 }
14 buildTypes {
15 release {
16 minifyEnabled false
17 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 }
19 }
20 }
21
22 dependencies {
23 compile fileTree(include: ['*.jar'], dir: 'libs')
24 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
25 exclude group: 'com.android.support', module: 'support-annotations'
26 })
27 compile files('src/main/libs/pinyin4j-2.5.0.jar')
28 compile 'com.android.support:appcompat-v7:26.+'
29 compile 'com.android.support.constraint:constraint-layout:1.0.2'
30 compile 'com.android.support:support-v4:26.+'
31 compile 'com.tencent.bugly:crashreport:latest.release'
32 testCompile 'junit:junit:4.12'
33 }
34
MiaohongEntry/app/proguard-rules.pro
File was created 1 # Add project specific ProGuard rules here.
2 # By default, the flags in this file are appended to flags specified
3 # in C:\Users\l\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
4 # You can edit the include path and order by changing the proguardFiles
5 # directive in build.gradle.
6 #
7 # For more details, see
8 # http://developer.android.com/guide/developing/tools/proguard.html
9
10 # Add any project specific keep options here:
11
12 # If your project uses WebView with JS, uncomment the following
13 # and specify the fully qualified class name to the JavaScript interface
14 # class:
15 #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 # public *;
17 #}
18
19 # Uncomment this to preserve the line number information for
20 # debugging stack traces.
21 #-keepattributes SourceFile,LineNumberTable
22
23 # If you keep the line number information, uncomment this to
24 # hide the original source file name.
25 #-renamesourcefileattribute SourceFile
26
MiaohongEntry/app/src/androidTest/java/com/hjx/miaohongentry/ExampleInstrumentedTest.java
File was created 1 package com.hjx.miaohongentry;
2
3 import android.content.Context;
4 import android.support.test.InstrumentationRegistry;
5 import android.support.test.runner.AndroidJUnit4;
6
7 import org.junit.Test;
8 import org.junit.runner.RunWith;
9
10 import static org.junit.Assert.*;
11
12 /**
13 * Instrumentation test, which will execute on an Android device.
14 *
15 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
16 */
17 @RunWith(AndroidJUnit4.class)
18 public class ExampleInstrumentedTest {
19 @Test
20 public void useAppContext() throws Exception {
21 // Context of the app under test.
22 Context appContext = InstrumentationRegistry.getTargetContext();
23
24 assertEquals("com.hjx.miaohongentry", appContext.getPackageName());
25 }
26 }
27
MiaohongEntry/app/src/main/AndroidManifest.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.hjx.miaohongentry">
4
5 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
6 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
7 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
8 <uses-permission android:name="android.permission.INTERNET" />
9
10 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
11 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
12 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
13 <uses-permission android:name="android.permission.READ_LOGS" />
14
15 <application
16 android:allowBackup="true"
17 android:icon="@mipmap/ic_launcher"
18 android:label="@string/app_name"
19 android:roundIcon="@mipmap/ic_launcher_round"
20 android:supportsRtl="true"
21 android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen">
22 <activity
23 android:name=".activity.MainActivity"
24 android:screenOrientation="landscape">
25 <intent-filter>
26 <action android:name="android.intent.action.MAIN" />
27
28 <category android:name="android.intent.category.LAUNCHER" />
29 </intent-filter>
30 </activity>
31 <activity
32 android:name=".activity.ChooseBookActivity"
33 android:configChanges="orientation|keyboardHidden|screenSize"
34 android:screenOrientation="landscape"
35 android:theme="@style/translucent">
36
37 </activity>
38
39 <activity android:name=".activity.WordActivity"
40 android:windowSoftInputMode="adjustUnspecified|stateHidden"
41 android:configChanges="orientation|keyboardHidden|screenSize">
42
43 </activity>
44 <service
45 android:name=".update.DownloadService"
46 android:enabled="true">
47 </service>
48 </application>
49
50 </manifest>
MiaohongEntry/app/src/main/assets/mh.db
No preview for this file type
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/ChooseBookActivity.java
File was created 1 package com.hjx.miaohongentry.activity;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.view.WindowManager;
8 import android.widget.AdapterView;
9 import android.widget.Button;
10 import android.widget.ListView;
11
12 import com.hjx.miaohongentry.R;
13 import com.hjx.miaohongentry.adapter.BookListAdapter;
14 import com.hjx.miaohongentry.bean.BookInfo;
15 import com.hjx.miaohongentry.db.MHDataManager;
16 import com.hjx.miaohongentry.util.Constants;
17
18 import java.util.ArrayList;
19
20 /**
21 * An example full-screen activity that shows and hides the system UI (i.e.
22 * status bar and navigation/system bar) with user interaction.
23 */
24 public class ChooseBookActivity extends Activity {
25
26
27 private ListView listView;
28 private BookListAdapter adapter;
29 private ArrayList<BookInfo> bookList;
30 private int curIndex;
31 private Button okBtn;
32 public static final int RESULT_CODE_CHOOSE_SECCESS = 0x01;
33
34 @Override
35 protected void onCreate(Bundle savedInstanceState) {
36 super.onCreate(savedInstanceState);
37 getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
38 setContentView(R.layout.activity_choose_book);
39 curIndex = getIntent().getIntExtra("idx",0);
40 okBtn = (Button)findViewById(R.id.btn_ok);
41 listView = (ListView) findViewById(R.id.lv_book_list);
42 bookList = MHDataManager.getList(Constants.MH_DATABASE_PATH);
43 adapter = new BookListAdapter(this,bookList);
44 adapter.setSelectItem(curIndex);
45 listView.setAdapter(adapter);
46 listView.setSelection(curIndex);
47 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
48 @Override
49 public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
50 curIndex = i;
51 adapter.setSelectItem(curIndex);
52 }
53 });
54 okBtn.setOnClickListener(new View.OnClickListener() {
55 @Override
56 public void onClick(View view) {
57 BookInfo bookInfo = bookList.get(curIndex);
58 Intent mIntent = new Intent();
59 mIntent.putExtra("id",bookInfo.get_id());
60 mIntent.putExtra("press", bookInfo.getPress());
61 mIntent.putExtra("reactos", bookInfo.getReactOS());
62 mIntent.putExtra("grade", bookInfo.getGrade());
63 // ่ฎพ็ฝฎ็ป“ๆžœ๏ผŒๅนถ่ฟ›่กŒไผ ้€
64 setResult(RESULT_CODE_CHOOSE_SECCESS, mIntent);
65 finish();
66 }
67 });
68 }
69
70
71
72
73 }
74
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/InitCallback.java
File was created 1 package com.hjx.miaohongentry.activity;
2
3 import java.io.IOException;
4
5 /**
6 * Created by l on 2018/2/6.
7 */
8
9 public interface InitCallback {
10 void onError(IOException e);
11 void onSucess();
12 }
13
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/MainActivity.java
File was created 1 package com.hjx.miaohongentry.activity;
2
3 import android.Manifest;
4 import android.app.Activity;
5 import android.content.Intent;
6 import android.content.pm.PackageManager;
7 import android.media.MediaPlayer;
8 import android.os.Environment;
9 import android.support.v4.app.ActivityCompat;
10 import android.os.Bundle;
11 import android.view.View;
12 import android.widget.Button;
13 import android.widget.ImageButton;
14 import android.widget.TextView;
15
16 import com.hjx.miaohongentry.R;
17 import com.hjx.miaohongentry.db.MHDataManager;
18 import com.hjx.miaohongentry.update.UpdateChecker;
19 import com.hjx.miaohongentry.util.Constants;
20 import com.hjx.miaohongentry.util.SpUtils;
21 import com.hjx.miaohongentry.util.StatisUtils;
22 import com.tencent.bugly.crashreport.CrashReport;
23
24 import java.io.File;
25 import java.io.FileDescriptor;
26 import java.io.IOException;
27 import java.io.RandomAccessFile;
28
29 public class MainActivity extends Activity {
30
31 private static final int REQUEST_EXTERNAL_STORAGE = 0x99;
32 private Button startBtn;
33 private ImageButton chooseBtn;
34 private final int REQUEST_CODE_CHOOSE_BOOK = 0x01;
35 private TextView bookTextView;
36 private String bookInfo;
37 private TextView tv_write_time;
38 private TextView tv_today_num;
39 private TextView tv_total_num;
40
41 private static String[] PERMISSIONS_STORAGE = {
42 Manifest.permission.READ_EXTERNAL_STORAGE,
43 Manifest.permission.WRITE_EXTERNAL_STORAGE};
44
45 public static void verifyStoragePermissions(Activity activity) {
46 // Check if we have write permission
47 int permission = ActivityCompat.checkSelfPermission(activity,
48 Manifest.permission.WRITE_EXTERNAL_STORAGE);
49
50 if (permission != PackageManager.PERMISSION_GRANTED) {
51 // We don't have permission so prompt the user
52 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
53 REQUEST_EXTERNAL_STORAGE);
54 }
55 }
56
57 private void initView(){
58 startBtn = (Button) findViewById(R.id.btn_start);
59 startBtn.setOnClickListener(new View.OnClickListener() {
60 @Override
61 public void onClick(View view) {
62 Intent intent = new Intent(MainActivity.this, WordActivity.class);
63 intent.putExtra("bookInfo",bookInfo);
64 startActivity(intent);
65 }
66 });
67 chooseBtn = (ImageButton)findViewById(R.id.btn_choose);
68 chooseBtn.setOnClickListener(new View.OnClickListener() {
69 @Override
70 public void onClick(View view) {
71 int idx = SpUtils.getInt(MainActivity.this,Constants.SP_BOOK_CHOSEN_ID,0);
72 Intent intent = new Intent(MainActivity.this, ChooseBookActivity.class);
73 intent.putExtra("idx",idx);
74 startActivityForResult(intent,REQUEST_CODE_CHOOSE_BOOK);
75 }
76 });
77 bookTextView = (TextView)findViewById(R.id.tv_publish_name);
78 bookInfo = SpUtils.getString(this,Constants.SP_BOOK_CHOSEN_INFO,"ไบบๆฐ‘ๆ•™่‚ฒๅ‡บ็‰ˆ็คพ#ไธ€ๅนด็บง#ไธŠๅ†Œ");
79 if(!bookInfo.isEmpty()){
80 String info[] = bookInfo.split("#");
81 if(info.length == 3){
82 String bookStr = info[1] + info[2] + " " + info[0];
83 bookTextView.setText(bookStr);
84 }
85 }
86
87 tv_write_time = findViewById(R.id.write_time);
88 tv_today_num = findViewById(R.id.today_num);
89 tv_total_num = findViewById(R.id.total_num);
90 showStatisView();
91 }
92
93 private void showStatisView(){
94 if(!StatisUtils.isToday(this)){
95 StatisUtils.setTodayNum(this,0);
96 StatisUtils.setTodayTime(this,0);
97 StatisUtils.setToday(this);
98 }
99 tv_total_num.setText(""+ StatisUtils.getTotalNum(this));
100 tv_today_num.setText(""+ StatisUtils.getTodayNum(this));
101 long mills = StatisUtils.getTodayTime(this);
102 long min = mills / (1000 * 60);
103 long sec = (mills - ( min * 60 * 1000)) / 1000;
104 tv_write_time.setText(min + "ๅˆ†" + sec + "็ง’");
105
106 }
107
108 private void testSound(){
109 MediaPlayer mPlayer = new MediaPlayer();
110 try {
111 RandomAccessFile mRandomAccessFile = new RandomAccessFile(
112 Environment.getExternalStorageDirectory().getPath() + File.separator
113 // + "1.mp3",
114 + "DICTSOUND.BIN", "r");
115 FileDescriptor mFileDescriptor = null;
116 mFileDescriptor = mRandomAccessFile.getFD();
117 mPlayer.reset();
118 mPlayer.setDataSource(mFileDescriptor, 122295042, 3027/*mRandomAccessFile.length()*/);
119 mPlayer.prepare();
120 mPlayer.start();
121 mRandomAccessFile.close();
122 } catch (IOException e) {
123 e.printStackTrace();
124 }
125 }
126
127 @Override
128 protected void onCreate(Bundle savedInstanceState) {
129 super.onCreate(savedInstanceState);
130 verifyStoragePermissions(this);
131 CrashReport.initCrashReport(getApplicationContext(), "9c92cf01b2", false);
132 setContentView(R.layout.activity_main);
133 initView();
134 MHDataManager.initDB(this, new InitCallback() {
135 @Override
136 public void onError(IOException e) {
137
138 }
139
140 @Override
141 public void onSucess() {
142
143 }
144 });
145 updateVersion();
146 }
147
148 private void saveBookInfo( String bookStr){
149 SpUtils.putString(MainActivity.this, Constants.SP_BOOK_CHOSEN_INFO,bookStr);
150 }
151
152 private void saveBookIdx(String id ){
153 try {
154 int idx = Integer.parseInt(id);
155 SpUtils.putInt(MainActivity.this, Constants.SP_BOOK_CHOSEN_ID,idx);
156 } catch (NumberFormatException e) {
157 e.printStackTrace();
158 }
159 }
160
161 @Override
162 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
163
164 switch (requestCode) {
165 case REQUEST_CODE_CHOOSE_BOOK:
166 if(resultCode == ChooseBookActivity.RESULT_CODE_CHOOSE_SECCESS){
167 String id = data.getStringExtra("id");
168 String press = data.getStringExtra("press");
169 String grade = data.getStringExtra("grade");
170 String reactos = data.getStringExtra("reactos");
171 String bookStr = grade + reactos + " " + press;
172 bookTextView.setText(bookStr);
173 bookInfo = press + "#" + grade + "#" + reactos;
174 saveBookInfo(bookInfo);
175 saveBookIdx(id);
176 }
177 break;
178 default:
179 break;
180 }
181 }
182
183 @Override
184 protected void onResume(){
185 super.onResume();
186 showStatisView();
187 }
188
189 private void updateVersion(){
190 UpdateChecker checker = new UpdateChecker(this);
191 checker.checkForUpdates();
192 }
193
194
195
196 }
197
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/WordActivity.java
File was created 1 package com.hjx.miaohongentry.activity;
2
3 import android.app.Activity;
4 import android.app.ProgressDialog;
5 import android.content.Intent;
6 import android.os.Bundle;
7 import android.os.Handler;
8 import android.os.Message;
9 import android.support.annotation.IdRes;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.Button;
14 import android.widget.EditText;
15 import android.widget.ImageButton;
16 import android.widget.LinearLayout;
17 import android.widget.ListAdapter;
18 import android.widget.ListView;
19 import android.widget.RadioButton;
20 import android.widget.RadioGroup;
21 import android.widget.RelativeLayout;
22 import android.widget.TextView;
23
24 import com.hjx.miaohongentry.R;
25 import com.hjx.miaohongentry.adapter.RowWordListAdapter;
26 import com.hjx.miaohongentry.bean.BookInfo;
27 import com.hjx.miaohongentry.bean.RowWord;
28 import com.hjx.miaohongentry.bean.TitleWord;
29 import com.hjx.miaohongentry.db.MHDataManager;
30 import com.hjx.miaohongentry.util.DeviceUtils;
31 import com.hjx.miaohongentry.util.SpanTextViewUtils;
32 import com.hjx.miaohongentry.util.StatisUtils;
33
34 import java.util.List;
35
36 public class WordActivity extends Activity {
37
38 private RelativeLayout rl_two_type;
39 private Button btn_one_type;
40 private BookInfo bookInfo;
41 private List<String> tableTypes;
42 private RadioGroup radioGroup;
43 private RadioButton rb_left;
44 private RadioButton rb_right;
45 private LinearLayout ll_word_group;
46 private ImageButton backBtn;
47 private EditText et_search;
48 private ImageButton btn_search;
49
50 private List<TitleWord> titleWords_left;
51 private List<TitleWord> titleWords_right;
52 private final static int GET_TITLE_WORD_FINISH = 1;
53 protected ProgressDialog progressDialog = null;
54 public static final int REQUEST_CODE_MIAO_HONG = 0x01;
55
56 private Handler handler = new Handler() {
57 public void handleMessage(android.os.Message msg) {
58 super.handleMessage(msg);
59 switch (msg.what) {
60 case GET_TITLE_WORD_FINISH:
61 updateTableTypeView();
62 showWordGroup(titleWords_left);
63 dismissProgressDialog();
64 break;
65 }
66 }
67 };
68
69 @Override
70 protected void onCreate(Bundle savedInstanceState) {
71 super.onCreate(savedInstanceState);
72 setContentView(R.layout.activity_word);
73 initData();
74 initView();
75 showProgressDialog("ๆญฃๅœจๅŠ ่ฝฝ...");
76 }
77
78 private void initData(){
79
80 String infoStr = getIntent().getStringExtra("bookInfo");
81 String info[] = infoStr.split("#");
82 bookInfo = new BookInfo("0",info[0],info[1],info[2]);
83 new Thread() {
84 public void run() {
85
86 tableTypes = MHDataManager.getTableTypes(bookInfo.getPress(),bookInfo.getGrade(),bookInfo.getReactOS());
87 titleWords_left = MHDataManager.getTitleWords(bookInfo.getPress(),bookInfo.getGrade(),bookInfo.getReactOS(),tableTypes.get(0));
88 for(TitleWord titleWord : titleWords_left){
89 List<RowWord> rowWords = MHDataManager.getRowWords(bookInfo,tableTypes.get(0),titleWord);
90 titleWord.setRowWordList(rowWords);
91 }
92 if(tableTypes.size() > 1){
93 titleWords_right = MHDataManager.getTitleWords(bookInfo.getPress(),bookInfo.getGrade(),bookInfo.getReactOS(),tableTypes.get(1));
94 for(TitleWord titleWord : titleWords_right){
95 List<RowWord> rowWords = MHDataManager.getRowWords(bookInfo,tableTypes.get(1),titleWord);
96 titleWord.setRowWordList(rowWords);
97 }
98 }
99 Message msg = new Message();
100 msg.what = GET_TITLE_WORD_FINISH;
101 handler.sendMessage(msg);
102 }
103 }.start();
104
105 }
106
107
108 private void initView(){
109 backBtn = findViewById(R.id.btn_back);
110 backBtn.setOnClickListener(new View.OnClickListener() {
111 @Override
112 public void onClick(View view) {
113 finish();
114 }
115 });
116 et_search = findViewById(R.id.et_search);
117 btn_search = findViewById(R.id.btn_search);
118 btn_search.setOnClickListener(new View.OnClickListener() {
119 @Override
120 public void onClick(View view) {
121 String searchStr = et_search.getText().toString();
122 if(!searchStr.isEmpty()){
123 SpanTextViewUtils.gotoMiaohong(WordActivity.this, searchStr);
124 }
125 }
126 });
127 initTableTypeView();
128
129 }
130
131 private void initTableTypeView(){
132 btn_one_type = findViewById(R.id.btn_one_type);
133 rl_two_type = findViewById(R.id.rl_two_type);
134 rb_left = findViewById(R.id.rb_left);
135 rb_right = findViewById(R.id.rb_right);
136 radioGroup = findViewById(R.id.rg_type);
137 }
138
139 private void updateTableTypeView(){
140 if(tableTypes.size() > 1){
141 btn_one_type.setVisibility(View.GONE);
142 rl_two_type.setVisibility(View.VISIBLE);
143 rb_left.setText(tableTypes.get(0).replace("๏ผˆไธ€๏ผ‰","1").replace("๏ผˆไบŒ๏ผ‰","2"));
144 rb_right.setText(tableTypes.get(1).replace("๏ผˆไธ€๏ผ‰","1").replace("๏ผˆไบŒ๏ผ‰","2"));
145 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
146 @Override
147 public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
148 ll_word_group.removeAllViews();
149 if(i == R.id.rb_left){
150 showWordGroup(titleWords_left);
151 }else{
152 showWordGroup(titleWords_right);
153 }
154 }
155 });
156
157 }else{
158 btn_one_type.setVisibility(View.VISIBLE);
159 rl_two_type.setVisibility(View.GONE);
160 btn_one_type.setText(tableTypes.get(0));
161 }
162 }
163 private void showWordGroup(List<TitleWord> titleWords ){
164 ll_word_group = findViewById(R.id.ll_word_group);
165 for (TitleWord titleWord : titleWords){
166 ll_word_group.addView(getTitleWordView(titleWord));
167 }
168 }
169
170 public View getTitleWordView(TitleWord titleWord ) {
171 View view = LayoutInflater.from(this).inflate(
172 R.layout.view_title_word, null);
173 TextView tvTitle = view.findViewById(R.id.tv_title);
174 tvTitle.setText(titleWord.getTitle());
175 ListView listView = view.findViewById(R.id.row_list);
176 listView.setEnabled(false);
177 view.setFocusable(true);
178 view.setFocusableInTouchMode(true);
179 RowWordListAdapter adapter = new RowWordListAdapter(this,titleWord.getRowWordList());
180 listView.setAdapter(adapter);
181 setListViewHeightBasedOnChildren(listView);
182 return view;
183 }
184
185 public void setListViewHeightBasedOnChildren(ListView listView) {
186 // ่Žทๅ–ListViewๅฏนๅบ”็š„Adapter
187 ListAdapter listAdapter = listView.getAdapter();
188 if (listAdapter == null) {
189 return;
190 }
191
192 int px = DeviceUtils.dip2px(this,1.0f);
193
194 int totalHeight = 0;
195 for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
196 // listAdapter.getCount()่ฟ”ๅ›žๆ•ฐๆฎ้กน็š„ๆ•ฐ็›ฎ
197 View listItem = listAdapter.getView(i, null, listView);
198 // ่ฎก็ฎ—ๅญ้กนView ็š„ๅฎฝ้ซ˜
199 int w = View.MeasureSpec.makeMeasureSpec(0,
200 View.MeasureSpec.UNSPECIFIED);
201 int h = View.MeasureSpec.makeMeasureSpec(0,
202 View.MeasureSpec.UNSPECIFIED);
203
204 listItem.measure(w, h);
205 // ็ปŸ่ฎกๆ‰€ๆœ‰ๅญ้กน็š„ๆ€ป้ซ˜ๅบฆ
206 totalHeight += listItem.getMeasuredHeight();
207
208 if(totalHeight + (listView.getDividerHeight() * (i - 1)) >1000){
209 break;
210 }
211 }
212
213 ViewGroup.LayoutParams params = listView.getLayoutParams();
214 params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
215
216
217 // listView.getDividerHeight()่Žทๅ–ๅญ้กน้—ดๅˆ†้š”็ฌฆๅ ็”จ็š„้ซ˜ๅบฆ
218 // params.heightๆœ€ๅŽๅพ—ๅˆฐๆ•ดไธชListViewๅฎŒๆ•ดๆ˜พ็คบ้œ€่ฆ็š„้ซ˜ๅบฆ
219 listView.setLayoutParams(params);
220 }
221
222
223 public void showProgressDialog( final String message){
224
225 runOnUiThread(new Runnable() {
226 @Override
227 public void run() {
228 if (progressDialog == null) {
229 progressDialog = new ProgressDialog(WordActivity.this);
230 }
231 if(progressDialog.isShowing()) {
232 progressDialog.dismiss();
233 }
234
235 progressDialog.setMessage(message);
236 progressDialog.setCanceledOnTouchOutside(false);
237 progressDialog.show();
238 }
239 });
240 }
241
242
243 /**้š่—ๅŠ ่ฝฝ่ฟ›ๅบฆ
244 */
245 public void dismissProgressDialog() {
246 runOnUiThread(new Runnable() {
247 @Override
248 public void run() {
249 //ๆŠŠๅˆคๆ–ญๅ†™ๅœจrunOnUiThreadๅค–้ขๅฏผ่‡ดๆœ‰ๆ—ถdismissๆ— ๆ•ˆ๏ผŒๅฏ่ƒฝไธๅŒ็บฟ็จ‹ๅˆคๆ–ญprogressDialog.isShowing()็ป“ๆžœไธไธ€่‡ด
250 if(progressDialog == null || progressDialog.isShowing() == false){
251 return;
252 }
253 progressDialog.dismiss();
254 }
255 });
256 }
257
258 @Override
259 protected void onResume(){
260 super.onResume();
261 long enter_mills = StatisUtils.getEnterMiaohongTime(this);
262 if(enter_mills != 0){
263 long now_mills = System.currentTimeMillis();
264 long diff_mills = now_mills - enter_mills;
265 if(diff_mills > 0){
266 long save_mills = StatisUtils.getTodayTime(WordActivity.this) + diff_mills;
267 StatisUtils.setTodayTime(WordActivity.this,save_mills);
268 }
269 StatisUtils.setEnterMiaohongTime(this, 0);
270 }
271 }
272
273
274 @Override
275 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
276
277 switch (requestCode) {
278 case REQUEST_CODE_MIAO_HONG:
279 if(resultCode == 0){
280
281 long now_mills = System.currentTimeMillis();
282 long enter_mills = StatisUtils.getEnterMiaohongTime(WordActivity.this);
283 long diff_mills = now_mills - enter_mills;
284 if(diff_mills > 0){
285 long save_mills = StatisUtils.getTodayTime(WordActivity.this) + diff_mills;
286 StatisUtils.setTodayTime(WordActivity.this,save_mills);
287 }
288 }
289 break;
290 default:
291 break;
292 }
293 }
294
295 }
296
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/adapter/BookListAdapter.java
File was created 1 package com.hjx.miaohongentry.adapter;
2
3 import android.content.Context;
4 import android.view.LayoutInflater;
5 import android.view.View;
6 import android.view.ViewGroup;
7 import android.widget.BaseAdapter;
8 import android.widget.TextView;
9
10 import com.hjx.miaohongentry.R;
11 import com.hjx.miaohongentry.bean.BookInfo;
12
13 import java.util.ArrayList;
14
15 /**
16 * Created by l on 2018/2/2.
17 */
18
19 public class BookListAdapter extends BaseAdapter {
20
21 private Context mContext;
22 private ArrayList<BookInfo> mList = null;
23 private int selectItem = 0;
24
25 public BookListAdapter(Context mContext, ArrayList<BookInfo> mList) {
26 this.mContext = mContext;
27 this.mList = mList;
28 }
29
30 @Override
31 public int getCount() {
32 return mList == null ? 0 : mList.size();
33 }
34
35 @Override
36 public Object getItem(int position) {
37 return mList.get(position);
38 }
39
40 @Override
41 public long getItemId(int i) {
42 return i;
43 }
44
45 @Override
46 public View getView(int position, View convertView, ViewGroup viewGroup) {
47 ViewHolder mViewHolder = null;
48 int textColor = R.color.colorFontBlack;
49 if (convertView == null) {
50 convertView = LayoutInflater.from(mContext).inflate(
51 R.layout.choose_book_list_item, null);
52
53 mViewHolder = new ViewHolder();
54 mViewHolder.tv_grade = (TextView) convertView
55 .findViewById(R.id.choose_book_list_item_grade);
56 mViewHolder.tv_reactos = (TextView) convertView
57 .findViewById(R.id.choose_book_list_item_reactos);
58 mViewHolder.tv_press = (TextView) convertView
59 .findViewById(R.id.choose_book_list_item_press);
60 convertView.setTag(mViewHolder);
61 } else {
62 mViewHolder = (ViewHolder) convertView.getTag();
63 }
64
65 BookInfo detailInfo = (BookInfo) getItem(position);
66
67 if (detailInfo != null) {
68 mViewHolder.tv_grade.setText(detailInfo.getGrade());
69 mViewHolder.tv_reactos.setText(detailInfo.getReactOS());
70 mViewHolder.tv_press.setText(detailInfo.getPress());
71 }
72
73 if (position == selectItem) {
74 textColor = R.color.colorFontGreen;
75 }
76 mViewHolder.tv_grade.setTextColor(mContext.getResources().getColor(textColor));
77 mViewHolder.tv_reactos.setTextColor(mContext.getResources().getColor(textColor));
78 mViewHolder.tv_press.setTextColor(mContext.getResources().getColor(textColor));
79 return convertView;
80 }
81
82 public static class ViewHolder {
83 public TextView tv_grade;
84 public TextView tv_reactos;
85 public TextView tv_press;
86 }
87
88 public void setSelectItem(int selectItem) {
89 this.selectItem = selectItem;
90 notifyDataSetChanged();
91 }
92
93 public void setSelectItem(BookInfo bookInfo){
94 if (bookInfo == null) {
95 return;
96 }
97
98 for(int i = 0; i < mList.size(); i++){
99 BookInfo kBookInfo = mList.get(i);
100 if(bookInfo.get_id().equals(kBookInfo.get_id())){
101 selectItem = i;
102 notifyDataSetChanged();
103 break;
104 }
105 }
106 }
107
108 public int getSelectItem() {
109 return this.selectItem;
110 }
111
112 }
113
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/adapter/RowWordListAdapter.java
File was created 1 package com.hjx.miaohongentry.adapter;
2
3 import android.content.Context;
4 import android.view.LayoutInflater;
5 import android.view.View;
6 import android.view.ViewGroup;
7 import android.widget.BaseAdapter;
8 import android.widget.TextView;
9
10 import com.hjx.miaohongentry.R;
11 import com.hjx.miaohongentry.bean.RowWord;
12 import com.hjx.miaohongentry.ui.FixGridLayout;
13 import com.hjx.miaohongentry.util.SpanTextViewUtils;
14
15 import java.util.List;
16
17 /**
18 * Created by l on 2018/2/5.
19 */
20
21 public class RowWordListAdapter extends BaseAdapter{
22
23 private Context mContext;
24 private List<RowWord> mList = null;
25
26 public RowWordListAdapter(Context mContext, List<RowWord> mList) {
27 this.mContext = mContext;
28 this.mList = mList;
29 }
30
31
32 @Override
33 public int getCount() {
34 return mList == null ? 0 : mList.size();
35 }
36
37 @Override
38 public Object getItem(int position) {
39 return mList.get(position);
40 }
41
42 @Override
43 public long getItemId(int i) {
44 return i;
45 }
46
47 @Override
48 public View getView(int position, View convertView, ViewGroup viewGroup) {
49 ViewHolder mViewHolder = null;
50 if (convertView == null) {
51 convertView = LayoutInflater.from(mContext).inflate(
52 R.layout.row_word_list_item, null);
53 mViewHolder = new ViewHolder();
54 mViewHolder.tv_row_idx = convertView.findViewById(R.id.row_idx);
55 mViewHolder.ll_row_word = convertView.findViewById(R.id.ll_row_word);
56 convertView.setTag(mViewHolder);
57 } else {
58 mViewHolder = (ViewHolder) convertView.getTag();
59 }
60
61 RowWord rowWord = (RowWord) getItem(position);
62 if (rowWord != null) {
63 if(!rowWord.getOrderNum().isEmpty()){
64 mViewHolder.tv_row_idx.setText(rowWord.getOrderNum() + ".");
65 }
66 String rowStr = rowWord.getRowStr();
67 char rowChar[] = rowStr.toCharArray();
68 mViewHolder.ll_row_word.removeAllViews();
69 for (int i = 0; i < rowChar.length; i++){
70 mViewHolder.ll_row_word.addView(getWordView(rowChar[i]));
71 }
72 }
73 return convertView;
74 }
75
76 private TextView getWordView( char word ){
77 TextView tv = (TextView) LayoutInflater.from(mContext).inflate(
78 R.layout.word_text_view, null);
79 tv.setPadding(10,10,10,10);
80 tv.setText(""+word);
81 tv.setOnClickListener(new View.OnClickListener() {
82 @Override
83 public void onClick(View view) {
84 SpanTextViewUtils.gotoMiaohong(mContext,((TextView)view).getText().toString());
85 }
86 });
87 return tv;
88 }
89
90 public static class ViewHolder {
91 public TextView tv_row_idx;
92 public FixGridLayout ll_row_word;
93 }
94 }
95
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/AppVersion.java
File was created 1 package com.hjx.miaohongentry.bean;
2
3 /**
4 * Created by l on 2017/7/8.
5 */
6
7 public class AppVersion {
8
9 private int versionCode;
10 private String versionName;
11 private String url;
12 private String msg;
13 private boolean isForceUpdate;
14
15 public void setVersionCode( String versionCode){
16 this.versionCode = Integer.parseInt(versionCode); ;
17 }
18
19 public int getVersionCode(){
20 return versionCode;
21 }
22
23 public void setVersionName(String versionName){
24 this.versionName = versionName;
25 }
26
27 public String getVersionName(){
28 return versionName;
29 }
30
31 public void setURL(String url){
32 this.url = url;
33 }
34
35 public String getURL(){
36 return url;
37 }
38
39 public void setMsg(String msg){
40 this.msg = msg;
41 }
42
43 public String getMsg(){
44 return msg;
45 }
46
47 public void setForceUpdate(boolean isForceUpdate){
48 this.isForceUpdate = isForceUpdate;
49 }
50
51 public boolean isForceUpdate(){
52 return isForceUpdate;
53 }
54 }
55
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/BookInfo.java
File was created 1 package com.hjx.miaohongentry.bean;
2
3 /**
4 * Created by l on 2018/2/2.
5 */
6
7 public class BookInfo {
8
9 private String _id; //bookid
10
11 private String press; //ๅ‡บ็‰ˆ็คพ
12
13 private String grade; //ๅนด็บง
14
15 private String reactOS; //ไธŠไธ‹ๅ†Œ
16
17 public BookInfo(){
18
19 }
20
21 public BookInfo( String id, String press, String grade, String reactOS){
22 this._id = id;
23 this.press = press;
24 this.grade = grade;
25 this.reactOS = reactOS;
26 }
27
28 public String getPress() {
29 return press;
30 }
31
32 public void setPress(String press) {
33 this.press = press;
34 }
35
36 public String getGrade() {
37 return grade;
38 }
39
40 public void setGrade(String grade) {
41 this.grade = grade;
42 }
43
44 public String getReactOS() {
45 return reactOS;
46 }
47
48 public void setReactOS(String reactOS) {
49 this.reactOS = reactOS;
50 }
51
52 public String get_id() {
53 return _id;
54 }
55
56 public void set_id(String _id) {
57 this._id = _id;
58 }
59 }
60
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/RowWord.java
File was created 1 package com.hjx.miaohongentry.bean;
2
3 /**
4 * Created by l on 2018/2/3.
5 */
6
7 public class RowWord {
8
9 private String orderNum;
10 private String rowStr;
11
12 public RowWord(){
13
14 }
15
16 public RowWord(String orderNum, String rowStr){
17
18 this.orderNum = orderNum;
19 this.rowStr = rowStr;
20 }
21
22 public String getOrderNum() {
23 return orderNum;
24 }
25
26 public void setOrderNum(String orderNum) {
27 this.orderNum = orderNum;
28 }
29
30 public String getRowStr() {
31 return rowStr;
32 }
33
34 public void setRowStr(String rowStr) {
35 this.rowStr = rowStr;
36 }
37 }
38
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/TitleWord.java
File was created 1 package com.hjx.miaohongentry.bean;
2
3
4 import java.util.List;
5
6 /**
7 * Created by l on 2018/2/3.
8 */
9
10 public class TitleWord {
11
12 private String serialNumber;
13
14 private String title;
15
16 private List<RowWord> rowWordList;
17
18 public TitleWord(){
19
20 }
21
22 public TitleWord(String serialNumber, String title,List<RowWord> rowWordList ){
23 this.serialNumber = serialNumber;
24 this.title = title;
25 this.rowWordList = rowWordList;
26 }
27
28 public String getSerialNumber() {
29 return serialNumber;
30 }
31
32 public void setSerialNumber(String serialNumber) {
33 this.serialNumber = serialNumber;
34 }
35
36 public String getTitle() {
37 return title;
38 }
39
40 public void setTitle(String title) {
41 this.title = title;
42 }
43
44 public List<RowWord> getRowWordList() {
45 return rowWordList;
46 }
47
48 public void setRowWordList(List<RowWord> rowWordList) {
49 this.rowWordList = rowWordList;
50 }
51 }
52
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/builder/JSONBuilder.java
File was created 1
2 package com.hjx.miaohongentry.builder;
3
4 import org.json.JSONException;
5 import org.json.JSONObject;
6
7
8 public abstract class JSONBuilder<T> {
9
10 protected String root;
11
12 public JSONBuilder(){
13 root = "";
14 }
15
16 /**
17 * Sets root of the JSON params, useful when building object in joins
18 *
19 * @param root
20 */
21 public void setRoot(String root){
22 this.root = root;
23 }
24
25 public abstract T build(JSONObject jsonObject) throws JSONException;
26 }
27
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/builder/UpdateInfoBuilder.java
File was created 1 package com.hjx.miaohongentry.builder;
2
3
4
5
6 import com.hjx.miaohongentry.bean.AppVersion;
7
8 import org.json.JSONException;
9 import org.json.JSONObject;
10
11 /**
12 * Created by l on 2017/7/8.
13 */
14
15 public class UpdateInfoBuilder extends JSONBuilder<AppVersion> {
16 @Override
17 public AppVersion build(JSONObject jsonObject) throws JSONException {
18
19 try {
20 AppVersion info = new AppVersion();
21 info.setVersionName(jsonObject.getString(root+"version_name"));
22 info.setVersionCode(jsonObject.getString(root+"versioncode"));
23 info.setMsg(jsonObject.getString(root+"msg"));
24 info.setURL(jsonObject.getString(root+"url"));
25 String update = jsonObject.getString(root+"forceupdate");
26 if(update.equalsIgnoreCase("false")){
27 info.setForceUpdate(false);
28 }else{
29 info.setForceUpdate(true);
30 }
31
32 return info;
33 } catch (JSONException e) {
34 e.printStackTrace();
35 return null;
36 }
37 }
38 }
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/db/MHDataManager.java
File was created 1 package com.hjx.miaohongentry.db;
2
3 import android.content.Context;
4 import android.database.Cursor;
5 import android.database.sqlite.SQLiteDatabase;
6
7 import com.hjx.miaohongentry.activity.InitCallback;
8 import com.hjx.miaohongentry.bean.BookInfo;
9 import com.hjx.miaohongentry.bean.RowWord;
10 import com.hjx.miaohongentry.bean.TitleWord;
11 import com.hjx.miaohongentry.util.Constants;
12
13 import java.io.File;
14 import java.io.FileOutputStream;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.util.ArrayList;
18 import java.util.List;
19
20 /**
21 * Created by l on 2018/2/2.
22 */
23
24 public class MHDataManager {
25
26 public static ArrayList<BookInfo> getList(String dataPath){
27 SQLiteDatabase mDB = null;
28 List<BookInfo> mList = new ArrayList<BookInfo>();
29 Cursor mCursor = null;
30
31 mDB = SQLiteDatabase.openDatabase(dataPath, null,
32 SQLiteDatabase.OPEN_READONLY);
33 mCursor = mDB.rawQuery("select DISTINCT * from " + MHDataTable.DATA_BOOK_TABLE_NAME,null);
34 if (mCursor != null) {
35 int count = 0;
36 while (mCursor.moveToNext()) {
37 BookInfo tDetailInfo = getBookInfo(mCursor,count);
38 mList.add(tDetailInfo);
39 count++;
40 }
41 mCursor.close();
42 }
43
44 mDB.close();
45
46 return (ArrayList<BookInfo>) mList;
47 }
48
49
50 private static BookInfo getBookInfo(Cursor mCursor, int idx) {
51 BookInfo bookInfo = new BookInfo();
52 String _id = null;
53 String press = null;
54 String grade = null;
55 String reactOS = null;
56 if (mCursor != null){
57 try {
58 _id = "" + idx;
59 press = mCursor.getString(mCursor
60 .getColumnIndex(MHDataTable.PRESS));
61 grade = mCursor.getString(mCursor
62 .getColumnIndex(MHDataTable.GRADE_NAME));
63 reactOS = mCursor.getString(mCursor
64 .getColumnIndex(MHDataTable.REACTOS));
65 }catch (Exception e){
66 e.printStackTrace();
67 }
68 }
69 bookInfo.set_id(_id);
70 bookInfo.setPress(press);
71 bookInfo.setGrade(grade);
72 bookInfo.setReactOS(reactOS);
73 return bookInfo;
74 }
75
76 public static List<String> getTableTypes(String press, String grade_name, String reactOS ){
77
78 SQLiteDatabase mDB = null;
79 List<String> mList = new ArrayList<String>();
80 Cursor mCursor = null;
81
82 mDB = SQLiteDatabase.openDatabase(Constants.MH_DATABASE_PATH, null,
83 SQLiteDatabase.OPEN_READONLY);
84 mCursor = mDB.rawQuery("select DISTINCT " + MHDataTable.TABLE_TYPE + " from " + MHDataTable.DATA_WORD_TABLE_NAME
85 + " WHERE "+ MHDataTable.PRESS + " = ? and " + MHDataTable.GRADE_NAME + " = ? and " + MHDataTable.REACTOS + " = ?",
86 new String[] { press, grade_name, reactOS});
87 if (mCursor != null) {
88 while (mCursor.moveToNext()) {
89 String type = mCursor.getString(mCursor
90 .getColumnIndex(MHDataTable.TABLE_TYPE));
91 mList.add(type);
92 }
93 mCursor.close();
94 }
95
96 mDB.close();
97 return mList;
98 }
99
100 public static List<TitleWord> getTitleWords(String press, String grade_name, String reactOS, String table_type ){
101
102 SQLiteDatabase mDB = null;
103 List<TitleWord> mList = new ArrayList<TitleWord>();
104 Cursor mCursor = null;
105
106 mDB = SQLiteDatabase.openDatabase(Constants.MH_DATABASE_PATH, null,
107 SQLiteDatabase.OPEN_READONLY);
108 mCursor = mDB.rawQuery("select DISTINCT " + MHDataTable.SERIAL_NUMBER + ", " + MHDataTable.TITLE
109 + " from " + MHDataTable.DATA_WORD_TABLE_NAME + " WHERE "+ MHDataTable.PRESS + " = ? and "
110 + MHDataTable.GRADE_NAME + " = ? and " + MHDataTable.REACTOS + " = ? and "
111 + MHDataTable.TABLE_TYPE + " = ?",
112 new String[] { press, grade_name, reactOS, table_type});
113
114 if (mCursor != null) {
115 while (mCursor.moveToNext()) {
116 String serial_number = mCursor.getString(mCursor
117 .getColumnIndex(MHDataTable.SERIAL_NUMBER));
118 String title = mCursor.getString(mCursor
119 .getColumnIndex(MHDataTable.TITLE));
120 TitleWord titleWord = new TitleWord();
121 titleWord.setSerialNumber(serial_number);
122 titleWord.setTitle(title);
123 mList.add(titleWord);
124 }
125 mCursor.close();
126 }
127
128 mDB.close();
129 return mList;
130 }
131
132 public static List<RowWord> getRowWords(BookInfo book, String table_type, TitleWord titleWord){
133
134 SQLiteDatabase mDB = null;
135 List<RowWord> mList = new ArrayList<RowWord>();
136 Cursor mCursor = null;
137
138 mDB = SQLiteDatabase.openDatabase(Constants.MH_DATABASE_PATH, null,
139 SQLiteDatabase.OPEN_READONLY);
140 mCursor = mDB.rawQuery("select DISTINCT " + MHDataTable.ORDER_NUMBER + ", " + MHDataTable.NEW_WORD
141 + " from " + MHDataTable.DATA_WORD_TABLE_NAME + " WHERE "+ MHDataTable.PRESS + " = ? and "
142 + MHDataTable.GRADE_NAME + " = ? and " + MHDataTable.REACTOS + " = ? and "
143 + MHDataTable.TABLE_TYPE + " = ? and " + MHDataTable.SERIAL_NUMBER + " = ? and "
144 + MHDataTable.TITLE + " = ?",
145 new String[] { book.getPress(), book.getGrade(), book.getReactOS(), table_type,
146 titleWord.getSerialNumber(), titleWord.getTitle()});
147
148 if (mCursor != null) {
149 while (mCursor.moveToNext()) {
150 String order_number = mCursor.getString(mCursor
151 .getColumnIndex(MHDataTable.ORDER_NUMBER));
152 String row_word = mCursor.getString(mCursor
153 .getColumnIndex(MHDataTable.NEW_WORD));
154 RowWord rowWord = new RowWord();
155 rowWord.setOrderNum(order_number);
156 rowWord.setRowStr(row_word);
157 mList.add(rowWord);
158 }
159 mCursor.close();
160 }
161
162 mDB.close();
163 return mList;
164 }
165
166
167 public static void initDB(final Context context, final InitCallback callback){
168 new Thread(new Runnable() {
169 @Override
170 public void run() {
171 String databaseFilename = Constants.MH_DATABASE_DIR_PATH + "/mh.db";
172 File dir = new File(Constants.MH_DATABASE_DIR_PATH);
173 if (!dir.exists())
174 dir.mkdir();
175 if (!(new File(databaseFilename)).exists()) {
176 try {
177 // InputStream is = context.getResources().openRawResource(R.raw.address);
178 InputStream is = context.getResources().getAssets().open("mh.db");
179 FileOutputStream fos = new FileOutputStream(databaseFilename);
180 byte[] buffer = new byte[2048];
181 int i = 0;
182 while ((i = is.read(buffer)) > 0) {
183 fos.write(buffer, 0, i);
184 }
185 fos.flush();
186 fos.close();
187 is.close();
188 } catch (IOException e) {
189 new File(databaseFilename).delete();
190 callback.onError(e);
191 return;
192 }
193 }
194 callback.onSucess();
195 }
196 }).run();
197 }
198 }
199
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/db/MHDataTable.java
File was created 1 package com.hjx.miaohongentry.db;
2
3 /**
4 * Created by l on 2018/2/2.
5 */
6
7 public class MHDataTable {
8
9 public static final String DATA_NAME = "mh.db";
10
11 public static final String DATA_BOOK_TABLE_NAME = "chinese_basics";
12
13 public static final String DATA_WORD_TABLE_NAME = "practice_chinese";
14
15 public static final int DATA_VERSION = 1;
16
17 public static final String STR_ID = "_id";
18
19 public static final String PRESS = "press";
20
21 public static final String VERSION = "version";
22
23 public static final String GRADE_NAME = "grade_name";
24
25 public static final String REACTOS = "ReactOS";
26
27 public static final String[] BOOK_COLUMNS = new String[] {
28 PRESS,
29 VERSION,
30 GRADE_NAME,
31 REACTOS,
32 };
33
34 public static final String TABLE_TYPE = "table_type";
35
36 public static final String TITLE = "title";
37
38 public static final String SERIAL_NUMBER = "serial_number";
39
40 public static final String ORDER_NUMBER = "order_number";
41
42 public static final String NEW_WORD = "new_word";
43
44 }
45
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/http/MHGetApi.java
File was created 1 package com.hjx.miaohongentry.http;
2
3
4 import com.hjx.miaohongentry.bean.AppVersion;
5
6 /**
7 * Created by l on 2017/7/1.
8 */
9
10 public interface MHGetApi {
11
12 /**
13 * Get the update informatuon of the vertion
14 * <br><br>
15 * http://boss.hjx.com/general/release/version
16 * @return the update informatuon
17 * @throws Exception
18 */
19 AppVersion getUpdateInfo(String pid, String appName) throws Exception;
20
21
22 }
23
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/http/MHGetApiImp.java
File was created 1 package com.hjx.miaohongentry.http;
2
3
4
5 import com.hjx.miaohongentry.bean.AppVersion;
6 import com.hjx.miaohongentry.builder.UpdateInfoBuilder;
7
8 import org.json.JSONArray;
9 import org.json.JSONObject;
10
11 import java.io.BufferedReader;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.io.InputStreamReader;
15 import java.io.UnsupportedEncodingException;
16 import java.net.HttpURLConnection;
17 import java.net.MalformedURLException;
18 import java.net.ProtocolException;
19 import java.net.URL;
20
21 /**
22 * Created by l on 2017/7/1.
23 */
24
25 public class MHGetApiImp implements MHGetApi {
26
27
28 private String doGet(String query) throws Exception {
29 String path = "http://boss.hjx.com"+ query;
30 try {
31 URL url = new URL(path);
32 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
33 connection.setConnectTimeout(5000);
34 connection.setRequestMethod("GET");
35 //่Žทๅพ—็ป“ๆžœ็ 
36 int responseCode = connection.getResponseCode();
37 if(responseCode ==200){
38 //่ฏทๆฑ‚ๆˆๅŠŸ ่Žทๅพ—่ฟ”ๅ›ž็š„ๆต
39 InputStream is = connection.getInputStream();
40 return InputStream2String(is);
41 }else {
42 //่ฏทๆฑ‚ๅคฑ่ดฅ
43 return null;
44 }
45 } catch (MalformedURLException e) {
46 e.printStackTrace();
47 } catch (ProtocolException e) {
48 e.printStackTrace();
49 } catch (IOException e) {
50 e.printStackTrace();
51 }
52 return null;
53
54
55 }
56
57
58 public AppVersion getUpdateInfo(String pid, String appName) throws Exception {
59
60 String jsonStr = doGet("/general/release/version?pid="+pid+"&appName="+appName);
61 JSONArray jsonArray = new JSONArray(jsonStr);
62 for (int i = 0; i < jsonArray.length(); i++){
63 JSONObject jsonObject = jsonArray.getJSONObject(i);
64 UpdateInfoBuilder builder = new UpdateInfoBuilder();
65 return builder.build(jsonObject);
66 }
67 return null;
68 }
69
70 public static String InputStream2String(InputStream in) {
71 InputStreamReader reader = null;
72 try {
73 reader = new InputStreamReader(in, "UTF-8");
74 } catch (UnsupportedEncodingException e1) {
75 e1.printStackTrace();
76 }
77 BufferedReader br = new BufferedReader(reader);
78 StringBuilder sb = new StringBuilder();
79 String line = "";
80 try {
81 while ((line = br.readLine()) != null) {
82 sb.append(line);
83 }
84 } catch (IOException e) {
85 e.printStackTrace();
86 }
87 return sb.toString();
88 }
89 }
90
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/ui/FixGridLayout.java
File was created 1 package com.hjx.miaohongentry.ui;
2
3 import android.content.Context;
4 import android.content.res.TypedArray;
5 import android.util.AttributeSet;
6 import android.view.View;
7 import android.view.ViewGroup;
8
9 import com.hjx.miaohongentry.R;
10
11 import java.util.ArrayList;
12 import java.util.List;
13
14 /**
15 * Created by l on 2018/2/5.
16 */
17
18 public class FixGridLayout extends ViewGroup {
19
20 private Type mType;
21 private List<WarpLine> mWarpLineGroup;
22
23 public FixGridLayout(Context context) {
24 this(context, null);
25 }
26
27 public FixGridLayout(Context context, AttributeSet attrs) {
28 this(context, attrs, R.style.WarpLinearLayoutDefault);
29 }
30
31 public FixGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
32 super(context, attrs, defStyleAttr);
33 mType = new Type(context, attrs);
34 }
35
36 @Override
37 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
38 int withMode = MeasureSpec.getMode(widthMeasureSpec);
39 int withSize = MeasureSpec.getSize(widthMeasureSpec);
40 int heightMode = MeasureSpec.getMode(heightMeasureSpec);
41 int heightSize = MeasureSpec.getSize(heightMeasureSpec);
42 int with = 0;
43 int height = 0;
44 int childCount = getChildCount();
45 /**
46 * ๅœจ่ฐƒ็”จchildViewใ€‚getMeasreไน‹ๅ‰ๅฟ…้กปๅ…ˆ่ฐƒ็”จ่ฏฅ่กŒไปฃ็ ๏ผŒ็”จไบŽๅฏนๅญViewๅคงๅฐ็š„ๆต‹้‡
47 */
48 measureChildren(widthMeasureSpec, heightMeasureSpec);
49 /**
50 * ่ฎก็ฎ—ๅฎฝๅบฆ
51 */
52 switch (withMode) {
53 case MeasureSpec.EXACTLY:
54 with = withSize;
55 break;
56 case MeasureSpec.AT_MOST:
57 for (int i = 0; i < childCount; i++) {
58 if (i != 0) {
59 with += mType.horizontal_Space;
60 }
61 with += getChildAt(i).getMeasuredWidth();
62 }
63 with += getPaddingLeft() + getPaddingRight();
64 with = with > withSize ? withSize : with;
65 break;
66 case MeasureSpec.UNSPECIFIED:
67 for (int i = 0; i < childCount; i++) {
68 if (i != 0) {
69 with += mType.horizontal_Space;
70 }
71 with += getChildAt(i).getMeasuredWidth();
72 }
73 with += getPaddingLeft() + getPaddingRight();
74 break;
75 default:
76 with = withSize;
77 break;
78
79 }
80 /**
81 * ๆ นๆฎ่ฎก็ฎ—ๅ‡บ็š„ๅฎฝๅบฆ๏ผŒ่ฎก็ฎ—ๅ‡บๆ‰€้œ€่ฆ็š„่กŒๆ•ฐ
82 */
83 WarpLine warpLine = new WarpLine();
84 /**
85 * ไธ่ƒฝๅคŸๅœจๅฎšไน‰ๅฑžๆ€งๆ—ถๅˆๅง‹ๅŒ–๏ผŒๅ› ไธบonMeasureๆ–นๆณ•ไผšๅคšๆฌก่ฐƒ็”จ
86 */
87 mWarpLineGroup = new ArrayList<WarpLine>();
88 for (int i = 0; i < childCount; i++) {
89 if (warpLine.lineWidth + getChildAt(i).getMeasuredWidth() + mType.horizontal_Space > with) {
90 if (warpLine.lineView.size() == 0) {
91 warpLine.addView(getChildAt(i));
92 mWarpLineGroup.add(warpLine);
93 warpLine = new WarpLine();
94 } else {
95 mWarpLineGroup.add(warpLine);
96 warpLine = new WarpLine();
97 warpLine.addView(getChildAt(i));
98 }
99 } else {
100 warpLine.addView(getChildAt(i));
101 }
102 }
103 /**
104 * ๆทปๅŠ ๆœ€ๅŽไธ€่กŒ
105 */
106 if (warpLine.lineView.size() > 0 && !mWarpLineGroup.contains(warpLine)) {
107 mWarpLineGroup.add(warpLine);
108 }
109 /**
110 * ่ฎก็ฎ—ๅฎฝๅบฆ
111 */
112 height = getPaddingTop() + getPaddingBottom();
113 for (int i = 0; i < mWarpLineGroup.size(); i++) {
114 if (i != 0) {
115 height += mType.vertical_Space;
116 }
117 height += mWarpLineGroup.get(i).height;
118 }
119 switch (heightMode) {
120 case MeasureSpec.EXACTLY:
121 height = heightSize;
122 break;
123 case MeasureSpec.AT_MOST:
124 height = height > heightSize ? heightSize : height;
125 break;
126 case MeasureSpec.UNSPECIFIED:
127 break;
128 default:
129 break;
130 }
131 setMeasuredDimension(with, height);
132 }
133
134 @Override
135 protected void onLayout(boolean changed, int l, int t, int r, int b) {
136 t = getPaddingTop();
137 for (int i = 0; i < mWarpLineGroup.size(); i++) {
138 int left = getPaddingLeft();
139 WarpLine warpLine = mWarpLineGroup.get(i);
140 int lastWidth = getMeasuredWidth() - warpLine.lineWidth;
141 for (int j = 0; j < warpLine.lineView.size(); j++) {
142 View view = warpLine.lineView.get(j);
143 if (isFull()) {//้œ€่ฆๅ……ๆปกๅฝ“ๅ‰่กŒๆ—ถ
144 view.layout(left, t, left + view.getMeasuredWidth() + lastWidth / warpLine.lineView.size(), t + view.getMeasuredHeight());
145 left += view.getMeasuredWidth() + mType.horizontal_Space + lastWidth / warpLine.lineView.size();
146 } else {
147 switch (getGrivate()) {
148 case 0://ๅณๅฏน้ฝ
149 view.layout(left + lastWidth, t, left + lastWidth + view.getMeasuredWidth(), t + view.getMeasuredHeight());
150 break;
151 case 2://ๅฑ…ไธญๅฏน้ฝ
152 view.layout(left + lastWidth / 2, t, left + lastWidth / 2 + view.getMeasuredWidth(), t + view.getMeasuredHeight());
153 break;
154 default://ๅทฆๅฏน้ฝ
155 view.layout(left, t, left + view.getMeasuredWidth(), t + view.getMeasuredHeight());
156 break;
157 }
158 left += view.getMeasuredWidth() + mType.horizontal_Space;
159 }
160 }
161 t += warpLine.height + mType.vertical_Space;
162 }
163 }
164
165 /**
166 * ็”จไบŽๅญ˜ๆ”พไธ€่กŒๅญView
167 */
168 private final class WarpLine {
169 private List<View> lineView = new ArrayList<View>();
170 /**
171 * ๅฝ“ๅ‰่กŒไธญๆ‰€้œ€่ฆๅ ็”จ็š„ๅฎฝๅบฆ
172 */
173 private int lineWidth = getPaddingLeft() + getPaddingRight();
174 /**
175 * ่ฏฅ่กŒViewไธญๆ‰€้œ€่ฆๅ ็”จ็š„ๆœ€ๅคง้ซ˜ๅบฆ
176 */
177 private int height = 0;
178
179 private void addView(View view) {
180 if (lineView.size() != 0) {
181 lineWidth += mType.horizontal_Space;
182 }
183 height = height > view.getMeasuredHeight() ? height : view.getMeasuredHeight();
184 lineWidth += view.getMeasuredWidth();
185 lineView.add(view);
186 }
187 }
188
189 /**
190 * ๅฏนๆ ทๅผ็š„ๅˆๅง‹ๅŒ–
191 */
192 private final static class Type {
193 /*
194 *ๅฏน้ฝๆ–นๅผ right 0๏ผŒleft 1๏ผŒcenter 2
195 */
196 private int grivate;
197 /**
198 * ๆฐดๅนณ้—ด่ท,ๅ•ไฝpx
199 */
200 private float horizontal_Space;
201 /**
202 * ๅž‚็›ด้—ด่ท,ๅ•ไฝpx
203 */
204 private float vertical_Space;
205 /**
206 * ๆ˜ฏๅฆ่‡ชๅŠจๅกซๆปก
207 */
208 private boolean isFull;
209
210 Type(Context context, AttributeSet attrs) {
211 if (attrs == null) {
212 return;
213 }
214 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.WarpLinearLayout);
215 grivate = typedArray.getInt(R.styleable.WarpLinearLayout_grivate, grivate);
216 horizontal_Space = typedArray.getDimension(R.styleable.WarpLinearLayout_horizontal_Space, horizontal_Space);
217 vertical_Space = typedArray.getDimension(R.styleable.WarpLinearLayout_vertical_Space, vertical_Space);
218 isFull = typedArray.getBoolean(R.styleable.WarpLinearLayout_isFull, isFull);
219 }
220 }
221
222 public int getGrivate() {
223 return mType.grivate;
224 }
225
226 public float getHorizontal_Space() {
227 return mType.horizontal_Space;
228 }
229
230 public float getVertical_Space() {
231 return mType.vertical_Space;
232 }
233
234 public boolean isFull() {
235 return mType.isFull;
236 }
237
238 public void setGrivate(int grivate) {
239 mType.grivate = grivate;
240 }
241
242 public void setHorizontal_Space(float horizontal_Space) {
243 mType.horizontal_Space = horizontal_Space;
244 }
245
246 public void setVertical_Space(float vertical_Space) {
247 mType.vertical_Space = vertical_Space;
248 }
249
250 public void setIsFull(boolean isFull) {
251 mType.isFull = isFull;
252 }
253
254 /**
255 * ๆฏ่กŒๅญView็š„ๅฏน้ฝๆ–นๅผ
256 */
257 public final static class Gravite {
258 public final static int RIGHT = 0;
259 public final static int LEFT = 1;
260 public final static int CENTER = 2;
261 }
262 }
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/ui/WordListView.java
File was created 1 package com.hjx.miaohongentry.ui;
2
3 import android.content.Context;
4 import android.util.AttributeSet;
5 import android.widget.ListView;
6
7 /**
8 * Created by l on 2018/2/6.
9 */
10
11 public class WordListView extends ListView {
12
13 public WordListView(Context context) {
14 super(context);
15 }
16
17 public WordListView(Context context, AttributeSet attrs) {
18 super(context, attrs);
19 }
20
21 public WordListView(Context context, AttributeSet attrs, int defStyleAttr) {
22 super(context, attrs, defStyleAttr);
23 }
24
25
26 @Override
27 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
28 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
29 MeasureSpec.AT_MOST);
30 super.onMeasure(widthMeasureSpec, expandSpec);
31 }
32 }
33
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/update/DownloadService.java
File was created 1 package com.hjx.miaohongentry.update;
2
3 /**
4 * Created by l on 2017/7/17.
5 */
6
7
8 import android.app.IntentService;
9 import android.content.Intent;
10 import android.os.Bundle;
11 import android.os.ResultReceiver;
12
13 import java.io.BufferedInputStream;
14 import java.io.FileOutputStream;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.io.OutputStream;
18 import java.net.URL;
19 import java.net.URLConnection;
20
21 public class DownloadService extends IntentService {
22 public static final int UPDATE_PROGRESS = 8344;
23 public DownloadService() {
24 super("DownloadService");
25 }
26 @Override
27 protected void onHandleIntent(Intent intent) {
28 String urlToDownload = intent.getStringExtra("url");
29 String fileDestination = intent.getStringExtra("dest");
30 ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
31 try {
32 URL url = new URL(urlToDownload);
33 URLConnection connection = url.openConnection();
34 connection.connect();
35 // this will be useful so that you can show a typical 0-100% progress bar
36 int fileLength = connection.getContentLength();
37 // download the file
38 InputStream input = new BufferedInputStream(connection.getInputStream());
39 OutputStream output = new FileOutputStream(fileDestination);
40 byte data[] = new byte[100];
41 long total = 0;
42 int count;
43 while ((count = input.read(data)) != -1) {
44 total += count;
45 // publishing the progress....
46 Bundle resultData = new Bundle();
47 resultData.putInt("progress" ,(int) (total * 100 / fileLength));
48 receiver.send(UPDATE_PROGRESS, resultData);
49 output.write(data, 0, count);
50 }
51 output.flush();
52 output.close();
53 input.close();
54 } catch (IOException e) {
55 e.printStackTrace();
56 }
57 Bundle resultData = new Bundle();
58 resultData.putInt("progress" ,100);
59 receiver.send(UPDATE_PROGRESS, resultData);
60 }
61 }
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/update/UpdateChecker.java
File was created 1 package com.hjx.miaohongentry.update;
2
3 /**
4 * Created by l on 2017/7/17.
5 */
6
7 import android.app.Activity;
8 import android.app.AlertDialog;
9 import android.app.ProgressDialog;
10 import android.content.Context;
11 import android.content.DialogInterface;
12 import android.content.Intent;
13 import android.content.pm.PackageInfo;
14 import android.content.pm.PackageManager;
15 import android.net.Uri;
16 import android.os.Bundle;
17 import android.os.Environment;
18 import android.os.Handler;
19 import android.os.Message;
20 import android.os.ResultReceiver;
21 import android.util.Log;
22
23
24 import com.hjx.miaohongentry.bean.AppVersion;
25 import com.hjx.miaohongentry.http.MHGetApiImp;
26
27 import java.io.File;
28
29 public class UpdateChecker {
30 private static final String TAG = "UpdateChecker";
31 private Context mContext;
32 //ๆฃ€ๆŸฅ็‰ˆๆœฌไฟกๆฏ็š„็บฟ็จ‹
33 private Thread mThread;
34
35 private AppVersion mAppVersion;
36 //ไธ‹่ฝฝapk็š„ๅฏน่ฏๆก†
37 private ProgressDialog mProgressDialog;
38
39 private File apkFile;
40
41
42 public UpdateChecker(Context context) {
43 mContext = context;
44 // instantiate it within the onCreate method
45 mProgressDialog = new ProgressDialog(context);
46 mProgressDialog.setMessage("ๆญฃๅœจไธ‹่ฝฝ");
47 mProgressDialog.setIndeterminate(false);
48 mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
49 mProgressDialog.setCancelable(true);
50 mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
51 @Override
52 public void onCancel(DialogInterface dialog) {
53
54 }
55 });
56 mProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
57 @Override
58 public void onDismiss(DialogInterface dialog) {
59 // TODO Auto-generated method stub
60
61 }
62 });
63 }
64
65 public void checkForUpdates() {
66
67 final Handler handler = new Handler(){
68 public void handleMessage(Message msg) {
69 if (msg.what == 1) {
70 mAppVersion = (AppVersion) msg.obj;
71 try{
72 int versionCode = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
73 if (mAppVersion.getVersionCode() > versionCode) {
74 if(mAppVersion.isForceUpdate()){
75 showForceUpdateDialog();
76 }else{
77 showUpdateDialog();
78 }
79 } else {
80 //Toast.makeText(mContext, "ๅทฒ็ปๆ˜ฏๆœ€ๆ–ฐ็‰ˆๆœฌ", Toast.LENGTH_SHORT).show();
81 }
82 }catch (PackageManager.NameNotFoundException ignored) {
83 //
84 }
85 }
86 }
87 };
88
89 mThread = new Thread() {
90 @Override
91 public void run() {
92 //if (isNetworkAvailable(mContext)) {
93 try {
94 MHGetApiImp imp = new MHGetApiImp();
95 String pkgName = mContext.getPackageName();
96
97 PackageInfo pkg = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
98 // String appName = pkg.applicationInfo.loadLabel(mContext.getPackageManager()).toString();
99 String appName = "็ปƒๆฑ‰ๅญ—";
100 AppVersion appVersion = imp.getUpdateInfo(pkgName,appName);
101 if(appVersion != null){
102 Message msg = new Message();
103 msg.what = 1;
104 msg.obj = appVersion;
105 handler.sendMessage(msg);
106 }else {
107 Log.e(TAG, "can't get app update json");
108 }
109
110 }catch (Exception e){
111 e.printStackTrace();
112 }
113
114 }
115 };
116 mThread.start();
117 }
118
119 private void showForceUpdateDialog() {
120 AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
121
122 //builder.setIcon(R.drawable.icon);
123 builder.setTitle("ๅ‡็บงๆ็คบ");
124 builder.setMessage(mAppVersion.getMsg());
125 builder.setPositiveButton("็Žฐๅœจๅ‡็บง",
126 new DialogInterface.OnClickListener() {
127 public void onClick(DialogInterface dialog, int whichButton) {
128 downLoadApk();
129 }
130 });
131 builder.setNegativeButton("้€€ๅ‡บ",
132 new DialogInterface.OnClickListener() {
133 public void onClick(DialogInterface dialog, int whichButton) {
134 ((Activity)mContext).finish();
135 }
136 });
137 builder.setCancelable(false);
138 builder.show();
139 }
140
141 private void showUpdateDialog() {
142 AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
143 //builder.setIcon(R.drawable.icon);
144 builder.setTitle("ๅ‡็บงๆ็คบ");
145 builder.setMessage(mAppVersion.getMsg());
146 builder.setPositiveButton("ไธ‹่ฝฝ",
147 new DialogInterface.OnClickListener() {
148 public void onClick(DialogInterface dialog, int whichButton) {
149 downLoadApk();
150 }
151 });
152 builder.setNegativeButton("ๅฟฝ็•ฅ",
153 new DialogInterface.OnClickListener() {
154 public void onClick(DialogInterface dialog, int whichButton) {
155
156 }
157 });
158 builder.show();
159 }
160
161 private void downLoadApk() {
162 String apkUrl = mAppVersion.getURL();
163 String dir = mContext.getExternalFilesDir( "apk").getAbsolutePath();
164 File folder = Environment.getExternalStoragePublicDirectory(dir);
165 if(folder.exists() && folder.isDirectory()) {
166 //do nothing
167 }else {
168 folder.mkdirs();
169 }
170 String filename = apkUrl.substring(apkUrl.lastIndexOf("/"),apkUrl.length());
171 String destinationFilePath = dir + "/" + filename;
172 apkFile = new File(destinationFilePath);
173 if(mAppVersion.isForceUpdate()){
174 mProgressDialog.setCancelable(false);
175 }
176 mProgressDialog.show();
177 Intent intent = new Intent(mContext, DownloadService.class);
178 intent.putExtra("url", apkUrl);
179 intent.putExtra("dest", destinationFilePath);
180 intent.putExtra("receiver", new DownloadReceiver(new Handler()));
181 mContext.startService(intent);
182 }
183
184 private class DownloadReceiver extends ResultReceiver {
185 public DownloadReceiver(Handler handler) {
186 super(handler);
187 }
188 @Override
189 protected void onReceiveResult(int resultCode, Bundle resultData) {
190 super.onReceiveResult(resultCode, resultData);
191 if (resultCode == DownloadService.UPDATE_PROGRESS) {
192 int progress = resultData.getInt("progress");
193 mProgressDialog.setProgress(progress);
194 if (progress == 100) {
195 mProgressDialog.dismiss();
196 //ๅฆ‚ๆžœๆฒกๆœ‰่ฎพ็ฝฎSDCardๅ†™ๆƒ้™๏ผŒๆˆ–่€…ๆฒกๆœ‰sdcard,apkๆ–‡ไปถไฟๅญ˜ๅœจๅ†…ๅญ˜ไธญ๏ผŒ้œ€่ฆๆŽˆไบˆๆƒ้™ๆ‰่ƒฝๅฎ‰่ฃ…
197 String[] command = {"chmod","777",apkFile.toString()};
198 try{
199 ProcessBuilder builder = new ProcessBuilder(command);
200 builder.start();
201 Intent intent = new Intent(Intent.ACTION_VIEW);
202 intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
203 mContext.startActivity(intent);
204 }catch (Exception e){
205 e.printStackTrace();
206 }
207 }
208 }
209 }
210 }
211 }
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/Constants.java
File was created 1 package com.hjx.miaohongentry.util;
2
3 import android.os.Environment;
4
5 /**
6 * Created by l on 2018/2/3.
7 */
8
9 public class Constants {
10
11 public final static String SP_BOOK_CHOSEN_INFO = "book_info";
12 public final static String SP_BOOK_CHOSEN_ID = "book_idx";
13 public final static String PACKAGE_NAME = "com.hjx.miaohongentry";
14 public final static String MH_DATABASE_DIR_PATH = "/sdcard/"+PACKAGE_NAME;
15 public final static String MH_DATABASE_PATH = "/sdcard/"+PACKAGE_NAME+"/mh.db";
16
17 public final static String SP_STATIS_WRITE_TOTAL = "write_total";
18 public final static String SP_STATIS_WRITE_NUM_TODAY = "write_num_today";
19 public final static String SP_STATIS_WRITE_TIME_TODAY = "write_time_today";
20 public final static String SP_STATIS_DATE_TODAY = "today";
21
22 public final static String SP_STATIS_ENTER_APP_TIMR = "enter_time";
23 }
24
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/DeviceUtils.java
File was created 1 /*
2 * Copyright (C) 2013 Peng fei Pan <sky@xiaopan.me>
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.hjx.miaohongentry.util;
18
19 import android.annotation.TargetApi;
20 import android.content.Context;
21 import android.graphics.Point;
22 import android.os.Build;
23 import android.util.TypedValue;
24 import android.view.Display;
25 import android.view.WindowManager;
26
27 /**
28 * ่ฎพๅค‡ๅทฅๅ…ท็ฎฑ๏ผŒๆไพ›ไธŽ่ฎพๅค‡็กฌไปถ็›ธๅ…ณ็š„ๅทฅๅ…ทๆ–นๆณ•
29 */
30 public class DeviceUtils {
31
32 /**
33 * ่Žทๅ–ๅฑๅน•ๅฐบๅฏธ
34 */
35 @SuppressWarnings("deprecation")
36 @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
37 public static Point getScreenSize(Context context){
38 WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
39 Display display = windowManager.getDefaultDisplay();
40 if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2){
41 return new Point(display.getWidth(), display.getHeight());
42 }else{
43 Point point = new Point();
44 display.getSize(point);
45 return point;
46 }
47 }
48
49 public static int dip2px(Context context, float dpValue) {
50 final float scale = context.getResources().getDisplayMetrics().density;
51 return (int) (dpValue * scale + 0.5f);
52 }
53
54 /**
55 * dp่ฝฌpx
56 *
57 * @param context ไธŠไธ‹ๆ–‡
58 * @param dpVal dpๅ€ผ
59 * @return result in px
60 */
61 public static int dp2px(Context context, float dpVal) {
62 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
63 dpVal, context.getResources().getDisplayMetrics());
64 }
65
66 /**
67 * sp่ฝฌpx
68 *
69 * @param context ไธŠไธ‹ๆ–‡
70 * @param spVal spๅ€ผ
71 * @return result in px
72 */
73 public static int sp2px(Context context, float spVal) {
74 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
75 spVal, context.getResources().getDisplayMetrics());
76 }
77
78 /**
79 * px่ฝฌdp
80 *
81 * @param context ไธŠไธ‹ๆ–‡
82 * @param pxVal pxๅ€ผ
83 * @return result in dp
84 */
85 public static float px2dp(Context context, float pxVal) {
86 final float scale = context.getResources().getDisplayMetrics().density;
87 return (pxVal / scale);
88 }
89
90 /**
91 * px่ฝฌsp
92 *
93 * @param context ไธŠไธ‹ๆ–‡
94 * @param pxVal pxๅ€ผ
95 * @return result in sp
96 */
97 public static float px2sp(Context context, float pxVal) {
98 return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
99 }
100
101
102 }
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/SpUtils.java
File was created 1 package com.hjx.miaohongentry.util;
2
3 /**
4 * Created by l on 2017/7/20.
5 */
6
7
8 import android.content.Context;
9 import android.content.SharedPreferences;
10
11 /**
12 * SharedPreferenceๆ“ไฝœ็ฑป
13 */
14 public class SpUtils {
15 private static final String spFileName = "app";
16
17
18 public static String getString(Context context, String strKey) {
19 SharedPreferences setPreferences = context.getSharedPreferences(
20 spFileName, Context.MODE_PRIVATE);
21 String result = setPreferences.getString(strKey, "");
22 return result;
23 }
24
25 public static String getString(Context context, String strKey,
26 String strDefault) {
27 SharedPreferences setPreferences = context.getSharedPreferences(
28 spFileName, Context.MODE_PRIVATE);
29 String result = setPreferences.getString(strKey, strDefault);
30 return result;
31 }
32
33 public static void putString(Context context, String strKey, String strData) {
34 SharedPreferences activityPreferences = context.getSharedPreferences(
35 spFileName, Context.MODE_PRIVATE);
36 SharedPreferences.Editor editor = activityPreferences.edit();
37 editor.putString(strKey, strData);
38 editor.commit();
39 }
40
41 public static Boolean getBoolean(Context context, String strKey) {
42 SharedPreferences setPreferences = context.getSharedPreferences(
43 spFileName, Context.MODE_PRIVATE);
44 Boolean result = setPreferences.getBoolean(strKey, false);
45 return result;
46 }
47
48 public static Boolean getBoolean(Context context, String strKey,
49 Boolean strDefault) {
50 SharedPreferences setPreferences = context.getSharedPreferences(
51 spFileName, Context.MODE_PRIVATE);
52 Boolean result = setPreferences.getBoolean(strKey, strDefault);
53 return result;
54 }
55
56
57 public static void putBoolean(Context context, String strKey,
58 Boolean strData) {
59 SharedPreferences activityPreferences = context.getSharedPreferences(
60 spFileName, Context.MODE_PRIVATE);
61 SharedPreferences.Editor editor = activityPreferences.edit();
62 editor.putBoolean(strKey, strData);
63 editor.commit();
64 }
65
66 public static int getInt(Context context, String strKey) {
67 SharedPreferences setPreferences = context.getSharedPreferences(
68 spFileName, Context.MODE_PRIVATE);
69 int result = setPreferences.getInt(strKey, -1);
70 return result;
71 }
72
73 public static int getInt(Context context, String strKey, int strDefault) {
74 SharedPreferences setPreferences = context.getSharedPreferences(
75 spFileName, Context.MODE_PRIVATE);
76 int result = setPreferences.getInt(strKey, strDefault);
77 return result;
78 }
79
80 public static void putInt(Context context, String strKey, int strData) {
81 SharedPreferences activityPreferences = context.getSharedPreferences(
82 spFileName, Context.MODE_PRIVATE);
83 SharedPreferences.Editor editor = activityPreferences.edit();
84 editor.putInt(strKey, strData);
85 editor.commit();
86 }
87
88 public static long getLong(Context context, String strKey) {
89 SharedPreferences setPreferences = context.getSharedPreferences(
90 spFileName, Context.MODE_PRIVATE);
91 long result = setPreferences.getLong(strKey, -1);
92 return result;
93 }
94
95 public static long getLong(Context context, String strKey, long strDefault) {
96 SharedPreferences setPreferences = context.getSharedPreferences(
97 spFileName, Context.MODE_PRIVATE);
98 long result = setPreferences.getLong(strKey, strDefault);
99 return result;
100 }
101
102 public static void putLong(Context context, String strKey, long strData) {
103 SharedPreferences activityPreferences = context.getSharedPreferences(
104 spFileName, Context.MODE_PRIVATE);
105 SharedPreferences.Editor editor = activityPreferences.edit();
106 editor.putLong(strKey, strData);
107 editor.commit();
108 }
109 }
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/SpanTextViewUtils.java
File was created 1 package com.hjx.miaohongentry.util;
2
3 import java.util.Timer;
4 import java.util.TimerTask;
5 import java.util.concurrent.ExecutorService;
6 import java.util.concurrent.Executors;
7 import java.util.regex.Matcher;
8 import java.util.regex.Pattern;
9
10 import net.sourceforge.pinyin4j.PinyinHelper;
11 import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
12 import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
13 import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
14 import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
15
16 import android.app.Activity;
17 import android.app.AlertDialog;
18 import android.app.Dialog;
19 import android.content.ComponentName;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.graphics.Color;
23 import android.graphics.drawable.AnimationDrawable;
24 import android.provider.Settings;
25 import android.text.style.ForegroundColorSpan;
26 import android.view.LayoutInflater;
27 import android.view.View;
28 import android.view.View.OnClickListener;
29 import android.widget.ImageButton;
30 import android.widget.ImageView;
31 import android.widget.RelativeLayout;
32 import android.widget.Toast;
33
34 import com.hjx.miaohongentry.activity.WordActivity;
35
36
37 public class SpanTextViewUtils {
38
39 public static long lastTime;// ไธŠไธ€ๆฌก็‚นๅ‡ปๆ—ถ้—ด
40 public static long currentTime;// ่ฟ™ไธ€ๆฌก็‚นๅ‡ปๆ—ถ้—ด
41
42 private static View contentView;
43 private static Dialog dialog;
44 private static AnimationDrawable mAnimationDrawable;
45
46 public static ForegroundColorSpan mForegroundColorSpan = new ForegroundColorSpan(Color.CYAN);
47
48
49
50 /**
51 * ่ฟ›ๅ…ฅๆ็บขๅบ”็”จ adb shell am force-stop air.com.wyt.HanZiMiaoHong
52 *
53 * @param context
54 * @param character
55 * ้œ€่ฆๆ็บข็š„ๆฑ‰ๅญ—
56 */
57 public static void gotoMiaohong(Context context, String character) {
58 // ไธ€ไธชๅญ—็š„ๆƒ…ๅ†ตไธ‹๏ผŒ่ฟ›ๅ…ฅๆ็บข
59 String pinyins = converterToSpell(character);
60 String py = pinyins.split(",")[0].trim();
61 boolean isCharacter = false;
62 Pattern p = Pattern.compile("[\\u4e00-\\u9fa5]");
63 Matcher m = p.matcher(character);
64 while (m.find()) {
65 isCharacter = true;
66 }
67 if (isCharacter) {// ่ฏญๆ–‡็ง‘็›ฎไธ”ๆ˜ฏๆฑ‰ๅญ—ๆ‰่ทณ
68 //&& Constants.OPENFLAG == 0//่ฏญๆ–‡็ง‘็›ฎไธ”
69 Intent intent = new Intent();
70 ComponentName cn = new ComponentName("air.com.wyt.HanZiMiaoHong", "air.com.wyt.HanZiMiaoHong.AppEntry");
71 intent.setComponent(cn);
72 // ๆ็บขไผ ๅ…ฅ่ง„ๅˆ™๏ผšๆฑ‰ๅญ—&_ๆ‹ผ้Ÿณ
73 intent.putExtra("type", character.trim() + "&_" + py.trim());
74 try {
75 // ((Activity)context).startActivityForResult(intent, WordActivity.REQUEST_CODE_MIAO_HONG);
76 context.startActivity(intent);
77 } catch (Exception e) {
78 Toast.makeText(context, "ๆœชๅฎ‰่ฃ…ๆฑ‰ๅญ—ๆ็บข๏ผ",
79 Toast.LENGTH_SHORT).show();
80 // return;
81 //ToastUtil.showLong(context, context.getResources().getString(R.string.apk_none_hanzimiaohong));
82 }
83 StatisUtils.setEnterMiaohongTime(context, System.currentTimeMillis());
84 StatisUtils.addTotalNum(context);
85 int count = StatisUtils.getTodayNum(context);
86 count ++;
87 StatisUtils.setTodayNum(context,count);
88 }
89 }
90
91 /**
92 * ๆฑ‰ๅญ—่ฝฌๆขไฝๆฑ‰่ฏญๅ…จๆ‹ผ๏ผŒ่‹ฑๆ–‡ๅญ—็ฌฆไธๅ˜๏ผŒ็‰นๆฎŠๅญ—็ฌฆไธขๅคฑ
93 * ๆ”ฏๆŒๅคš้Ÿณๅญ—๏ผŒ็”Ÿๆˆๆ–นๅผๅฆ‚๏ผˆ้‡ๅฝ“ๅ‚:zhongdangcen,zhongdangcan,chongdangcen
94 * ,chongdangshen,zhongdangshen,chongdangcan๏ผ‰
95 *
96 * @param chines
97 * ๆฑ‰ๅญ—
98 * @return ๆ‹ผ้Ÿณ
99 */
100 public static String converterToSpell(String chines) {
101 StringBuffer pinyinName = new StringBuffer();
102 char[] nameChar = chines.toCharArray();
103 HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
104 defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
105 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
106 for (int i = 0; i < nameChar.length; i++) {
107 if (nameChar[i] > 128) {
108 try {
109 // ๅ–ๅพ—ๅฝ“ๅ‰ๆฑ‰ๅญ—็š„ๆ‰€ๆœ‰ๅ…จๆ‹ผ
110 String[] strs = PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat);
111 if (strs != null) {
112 for (int j = 0; j < strs.length; j++) {
113 pinyinName.append(strs[j]);
114 if (j != strs.length - 1) {
115 pinyinName.append(",");
116 }
117 }
118 }
119 } catch (BadHanyuPinyinOutputFormatCombination e) {
120 e.printStackTrace();
121 }
122 } else {
123 pinyinName.append(nameChar[i]);
124 }
125 pinyinName.append(" ");
126 }
127 return pinyinName.toString();
128 }
129
130 public static ExecutorService executorService = Executors.newFixedThreadPool(5);
131
132
133
134 private static void startAnimation() {
135 if (mAnimationDrawable != null) {
136 mAnimationDrawable.start();
137 Timer mytimer = new Timer();
138 TimerTask mytt = new TimerTask() {
139
140 @Override
141 public void run() {
142
143 stopAnimation();
144 }
145 };
146 mytimer.schedule(mytt, 1000);
147 }
148 }
149
150 public static void stopAnimation() {
151 if (mAnimationDrawable != null) {
152 mAnimationDrawable.stop();
153 }
154 }
155
156 }
157
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/StatisUtils.java
File was created 1 package com.hjx.miaohongentry.util;
2
3 import android.content.Context;
4
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7
8 /**
9 * Created by l on 2018/2/6.
10 */
11
12 public class StatisUtils {
13
14 public static void addTotalNum(Context context){
15 int num = SpUtils.getInt(context,Constants.SP_STATIS_WRITE_TOTAL,0);
16 num ++;
17 SpUtils.putInt(context,Constants.SP_STATIS_WRITE_TOTAL,num);
18 }
19
20 public static int getTotalNum(Context context){
21 int num = SpUtils.getInt(context,Constants.SP_STATIS_WRITE_TOTAL,0);
22 return num;
23 }
24
25 public static void setToday(Context context){
26 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
27 Date now = new Date();
28 String now_date = format.format(now);
29 SpUtils.putString(context,Constants.SP_STATIS_DATE_TODAY,now_date);
30 }
31
32 public static boolean isToday(Context context){
33 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
34 Date now = new Date();
35 String now_date = format.format(now);
36 String sp_today = SpUtils.getString(context,Constants.SP_STATIS_DATE_TODAY,"");
37 if(now_date.equals(sp_today)){
38 return true;
39 }else{
40 return false;
41 }
42 }
43
44 public static int getTodayNum(Context context){
45 int num = SpUtils.getInt(context,Constants.SP_STATIS_WRITE_NUM_TODAY,0);
46 return num;
47 }
48
49 public static long getTodayTime(Context context){
50 long time = SpUtils.getLong(context,Constants.SP_STATIS_WRITE_TIME_TODAY,0);
51 return time;
52 }
53
54 public static void setTodayTime(Context context, long time){
55 SpUtils.putLong(context,Constants.SP_STATIS_WRITE_TIME_TODAY,time);
56 }
57
58 public static void setTodayNum(Context context, int num){
59 SpUtils.putInt(context,Constants.SP_STATIS_WRITE_NUM_TODAY,num);
60 }
61
62 public static void setEnterMiaohongTime(Context context,long mills){
63 SpUtils.putLong(context,Constants.SP_STATIS_ENTER_APP_TIMR,mills);
64 }
65
66 public static long getEnterMiaohongTime(Context context){
67 long mills = SpUtils.getLong(context,Constants.SP_STATIS_ENTER_APP_TIMR,0);
68 return mills;
69 }
70 }
71
MiaohongEntry/app/src/main/libs/pinyin4j-2.5.0.jar
No preview for this file type
MiaohongEntry/app/src/main/res/drawable/dash_line.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="line" >
4
5 <!--็บฟๅฎฝไธบdashWith๏ผŒ็บฟไน‹้—ด็ฉบ้š™dashGap๏ผŒdashGap=0dpๆ—ถ๏ผŒๆ˜ฏๅฎž็บฟ -->
6 <stroke
7 android:dashGap="1dip"
8 android:dashWidth="3dip"
9 android:width="1dip"
10 android:color="@color/colorLineYellow" />
11
12 <!-- ่™š็บฟ้ซ˜ๅบฆ -->
13 <size android:height="1dip" />
14
15 </shape>
MiaohongEntry/app/src/main/res/drawable/radio_table_type_left.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item
4 android:state_checked="false"
5 android:drawable="@mipmap/btn_left" />
6 <item
7 android:state_checked="true"
8 android:drawable="@mipmap/btn_left_sel" />
9 </selector>
MiaohongEntry/app/src/main/res/drawable/radio_table_type_right.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item
4 android:state_checked="false"
5 android:drawable="@mipmap/btn_right" />
6 <item
7 android:state_checked="true"
8 android:drawable="@mipmap/btn_right_sel" />
9 </selector>
MiaohongEntry/app/src/main/res/drawable/shape_corner.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android">
3 <solid android:color="#ffffc73e" />
4 <corners android:topLeftRadius="20dp"
5 android:topRightRadius="20dp"
6 android:bottomRightRadius="20dp"
7 android:bottomLeftRadius="20dp"/>
8 <stroke android:width="1dp" android:color="#ffeab029" />
9 </shape>
MiaohongEntry/app/src/main/res/layout/activity_choose_book.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context="com.hjx.miaohongentry.activity.ChooseBookActivity">
6
7 <RelativeLayout
8 android:layout_width="400dp"
9 android:layout_height="600dp"
10 android:layout_centerVertical="true"
11 android:layout_centerHorizontal="true"
12 android:background="@mipmap/choose_book_bg">
13
14 <LinearLayout
15 android:id="@+id/ll_choose_book"
16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content"
18 android:layout_marginTop="70dp"
19 android:orientation="vertical">
20 <ListView
21 android:id="@+id/lv_book_list"
22 android:layout_width="wrap_content"
23 android:layout_height="450dp">
24
25 </ListView>
26
27 <Button
28 android:id="@+id/btn_ok"
29 android:layout_width="wrap_content"
30 android:layout_height="wrap_content"
31 android:layout_marginTop="20dp"
32 android:background="@mipmap/btn_ok"
33 android:layout_centerHorizontal="true"
34 android:layout_gravity="center"
35 android:text="็กฎๅฎš"
36 android:gravity="center"
37 android:textColor="@color/colorWhite"
38 android:textSize="28sp"/>
39
40 </LinearLayout>
41
42
43
44 </RelativeLayout>
45
46 </RelativeLayout>
47
MiaohongEntry/app/src/main/res/layout/activity_main.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:background="@mipmap/bg"
7 tools:context="com.hjx.miaohongentry.activity.MainActivity">
8
9
10 <LinearLayout
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:orientation="horizontal">
14
15 <RelativeLayout
16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content">
18
19 <ImageView
20 android:id="@+id/iv_head"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:layout_marginTop="30dp"
24 android:layout_marginLeft="30dp"
25 android:layout_marginRight="20dp"
26 android:src="@mipmap/head_icon"/>
27
28 <ImageView
29 android:layout_width="wrap_content"
30 android:layout_height="wrap_content"
31 android:layout_marginTop="-14dp"
32 android:layout_marginLeft="30dp"
33 android:layout_below="@+id/iv_head"
34 android:src ="@mipmap/cloud"/>
35 </RelativeLayout>
36
37
38 <LinearLayout
39 android:layout_width="wrap_content"
40 android:layout_height="wrap_content"
41 android:layout_gravity="center"
42 android:layout_marginTop="10dp"
43 android:orientation="vertical">
44 <LinearLayout
45 android:layout_width="wrap_content"
46 android:layout_height="wrap_content"
47 android:orientation="horizontal"
48 android:visibility="gone">
49 <TextView
50 android:layout_width="wrap_content"
51 android:layout_height="wrap_content"
52 android:textColor="@color/colorFontBlack"
53 android:textSize="15sp"
54 android:text="ๅˆ˜ๅพทๅŽ" />
55
56 <TextView
57 android:layout_width="wrap_content"
58 android:layout_height="wrap_content"
59 android:layout_marginLeft="10dp"
60 android:textColor="@color/colorFontBlack"
61 android:textSize="15sp"
62 android:text="2ๅนด็บง" />
63 </LinearLayout>
64
65 <LinearLayout
66 android:layout_width="wrap_content"
67 android:layout_height="wrap_content"
68 android:layout_marginTop="10dp"
69 android:orientation="horizontal">
70 <TextView
71 android:layout_width="wrap_content"
72 android:layout_height="wrap_content"
73 android:textColor="@color/colorFontBlack"
74 android:textSize="15sp"
75 android:text="็ดฏ่ฎก็ปƒๅญ—" />
76
77 <TextView
78 android:id="@+id/total_num"
79 android:layout_width="wrap_content"
80 android:layout_height="wrap_content"
81 android:textColor="@color/colorFontBlue"
82 android:textSize="15sp"
83 android:text="2" />
84
85 <TextView
86 android:layout_width="wrap_content"
87 android:layout_height="wrap_content"
88 android:layout_marginLeft="10dp"
89 android:textColor="@color/colorFontBlack"
90 android:textSize="15sp"
91 android:text="ไปŠๆ—ฅ็ปƒๅญ—" />
92
93 <TextView
94 android:id="@+id/today_num"
95 android:layout_width="wrap_content"
96 android:layout_height="wrap_content"
97 android:textColor="@color/colorFontBlue"
98 android:textSize="15sp"
99 android:text="2" />
100 </LinearLayout>
101
102 </LinearLayout>
103 </LinearLayout>
104
105
106
107
108 <RelativeLayout
109 android:id="@+id/rl_pie_chat"
110 android:layout_width="wrap_content"
111 android:layout_height="wrap_content"
112 android:layout_centerVertical="true"
113 android:layout_centerHorizontal="true">
114
115 <ImageView
116 android:id="@+id/iv_pie_chat"
117 android:layout_width="wrap_content"
118 android:layout_height="wrap_content"
119 android:src="@mipmap/pie_chat"/>
120
121 <LinearLayout
122 android:layout_width="wrap_content"
123 android:layout_height="wrap_content"
124 android:layout_centerVertical="true"
125 android:layout_centerHorizontal="true"
126 android:orientation="vertical">
127 <TextView
128 android:layout_width="wrap_content"
129 android:layout_height="wrap_content"
130 android:layout_gravity="center"
131 android:textColor="@color/colorFontBlack"
132 android:textSize="25sp"
133 android:text="ๅทฒ็ปƒ"/>
134 <TextView
135 android:id="@+id/write_time"
136 android:layout_width="wrap_content"
137 android:layout_height="wrap_content"
138 android:layout_marginTop="6dp"
139 android:textColor="@color/colorFontRed"
140 android:textSize="29sp"
141 android:text="3ๅˆ†31็ง’"/>
142 </LinearLayout>
143
144 </RelativeLayout>
145
146
147 <LinearLayout
148 android:layout_width="wrap_content"
149 android:layout_height="wrap_content"
150 android:layout_centerHorizontal="true"
151 android:layout_above="@+id/rl_pie_chat"
152 android:layout_marginBottom="16dp"
153 android:orientation="vertical">
154 <TextView
155 android:id="@+id/tv_publish_name"
156 android:layout_width="wrap_content"
157 android:layout_height="wrap_content"
158 android:textColor="@color/colorFontBlack"
159 android:textSize="20sp"
160 android:layout_gravity="center"
161 android:text="ไธ€ๅนด็บงไธŠๅ†Œ ไบบๆฐ‘ๆ•™่‚ฒๅ‡บ็‰ˆ็คพ" />
162
163 <TextView
164 android:layout_width="wrap_content"
165 android:layout_height="wrap_content"
166 android:layout_marginTop="10dp"
167 android:textColor="@color/colorFontBlack"
168 android:textSize="20sp"
169 android:layout_gravity="center"
170 android:text="ๆฏๆ—ฅ็ปƒๅญ—10ๅˆ†้’Ÿ" />
171 </LinearLayout>
172
173 <Button
174 android:id="@+id/btn_start"
175 android:layout_width="wrap_content"
176 android:layout_height="wrap_content"
177 android:layout_below="@+id/rl_pie_chat"
178 android:layout_centerHorizontal="true"
179 android:layout_marginTop="25dp"
180 android:text = "ๅผ€ๅง‹็ปƒๅญ—"
181 android:textSize="25sp"
182 android:textColor="@color/colorWhite"
183 android:background="@mipmap/btn_start"/>
184
185 <ImageButton
186 android:id="@+id/btn_choose"
187 android:layout_width="wrap_content"
188 android:layout_height="wrap_content"
189 android:src="@mipmap/btn_change_books"
190 android:layout_alignParentRight="true"
191 android:layout_marginTop="10dp"
192 android:layout_marginRight="30dp"
193 android:background="@null"/>
194
195 <ImageButton
196 android:id="@+id/btn_rank"
197 android:layout_width="wrap_content"
198 android:layout_height="wrap_content"
199 android:src="@mipmap/btn_rank"
200 android:layout_toLeftOf="@id/btn_choose"
201 android:layout_marginTop="10dp"
202 android:layout_marginRight="50dp"
203 android:background="@null"
204 android:visibility="gone"/>
205
206 </RelativeLayout>
207
MiaohongEntry/app/src/main/res/layout/activity_word.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:background="@mipmap/bg"
8 tools:context="com.hjx.miaohongentry.activity.WordActivity">
9
10 <ImageButton
11 android:id="@+id/btn_back"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:layout_margin="30dp"
15 android:background="@null"
16 android:src="@mipmap/btn_back"/>
17
18 <LinearLayout
19 android:layout_width="match_parent"
20 android:layout_height="wrap_content">
21 <LinearLayout
22 android:layout_width="0dp"
23 android:layout_height="wrap_content"
24 android:gravity="center"
25 android:layout_weight="1">
26 <ImageView
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 android:layout_marginTop="20dp"
30 android:layout_marginLeft="20dp"
31 android:src="@mipmap/balloon"/>
32 </LinearLayout>
33 <LinearLayout
34 android:layout_width="0dp"
35 android:layout_height="wrap_content"
36 android:layout_weight="1">
37 </LinearLayout>
38 </LinearLayout>
39
40
41 <RelativeLayout
42 android:layout_width="wrap_content"
43 android:layout_height="wrap_content"
44 android:layout_marginTop="70dp"
45 android:orientation="horizontal">
46
47 <LinearLayout
48 android:id="@+id/ll_word"
49 android:layout_width="wrap_content"
50 android:layout_height="wrap_content"
51 android:layout_centerInParent="true"
52 android:layout_alignParentRight="true"
53 android:layout_marginRight="10dp"
54 android:orientation="vertical"
55 android:background="@mipmap/word_bg">
56
57 <Button
58 android:id="@+id/btn_one_type"
59 android:layout_width="wrap_content"
60 android:layout_height="wrap_content"
61 android:layout_gravity="center"
62 android:layout_marginTop="50dp"
63 android:background="@mipmap/btn_type"
64 android:textColor="@color/colorWhite"
65 android:textSize="17sp"
66 android:text="่ฏ†ๅญ—่กจ"
67 android:visibility="invisible"/>
68
69 <RelativeLayout
70 android:id="@+id/rl_two_type"
71 android:layout_width="wrap_content"
72 android:layout_height="wrap_content"
73 android:layout_gravity="center"
74 android:layout_marginTop="50dp"
75 android:visibility="invisible">
76
77 <ImageView
78 android:layout_width="wrap_content"
79 android:layout_height="wrap_content"
80 android:layout_centerHorizontal="true"
81 android:layout_centerVertical="true"
82 android:src="@mipmap/word_switch_bg"/>
83
84 <RadioGroup
85 android:id="@+id/rg_type"
86 android:layout_centerHorizontal="true"
87 android:layout_centerVertical="true"
88 android:orientation="horizontal"
89 android:layout_width="wrap_content"
90 android:layout_height="wrap_content">
91
92 <RadioButton
93 android:id="@+id/rb_left"
94 android:layout_marginRight="1dp"
95 android:layout_width="wrap_content"
96 android:layout_height="wrap_content"
97 android:button="@null"
98 android:background="@drawable/radio_table_type_left"
99 android:textColor="@color/colorWhite"
100 android:checked="true"
101 android:textSize="17sp"
102 android:gravity="center"
103 android:text="่ฏ†ๅญ—่กจ"/>
104 <RadioButton
105 android:id="@+id/rb_right"
106 android:layout_marginLeft="1dp"
107 android:layout_width="wrap_content"
108 android:layout_height="wrap_content"
109 android:button="@null"
110 android:background="@drawable/radio_table_type_right"
111 android:textColor="@color/colorWhite"
112 android:textSize="17sp"
113 android:gravity="center"
114 android:text="ๅ†™ๅญ—่กจ"/>
115 </RadioGroup>
116 </RelativeLayout>
117
118 <LinearLayout
119 android:layout_width="match_parent"
120 android:layout_height="wrap_content"
121 android:layout_marginTop="20dp"
122 android:layout_marginBottom="50dp"
123 android:paddingLeft="80dp"
124 android:paddingRight="100dp">
125 <ScrollView
126 android:layout_width="match_parent"
127 android:layout_height="wrap_content">
128
129 <LinearLayout
130 android:id="@+id/ll_word_group"
131 android:layout_width="match_parent"
132 android:layout_height="wrap_content"
133 android:orientation="vertical">
134
135 </LinearLayout>
136
137 </ScrollView>
138 </LinearLayout>
139
140
141 </LinearLayout>
142 <ImageView
143 android:id="@+id/iv_plane"
144 android:layout_width="wrap_content"
145 android:layout_height="wrap_content"
146 android:layout_marginLeft="0dp"
147 android:layout_centerInParent="true"
148 android:layout_alignParentLeft="true"
149 android:src="@mipmap/plane"/>
150 </RelativeLayout>
151
152
153 <RelativeLayout
154 android:layout_width="260dp"
155 android:layout_height="wrap_content"
156 android:layout_marginTop="30dp"
157 android:paddingTop="5dp"
158 android:paddingBottom="5dp"
159 android:layout_alignParentRight="true"
160 android:layout_marginRight="40dp"
161 android:background="@drawable/shape_corner">
162
163 <EditText
164 android:id="@+id/et_search"
165 android:layout_width="100dp"
166 android:layout_height="wrap_content"
167 android:layout_marginLeft="30dp"
168 android:layout_centerVertical="true"
169 android:maxLength="1"
170 android:singleLine="true"
171 android:hint="่ฏทๆœ็ดขๅ…ณ้”ฎๅญ—"
172 android:textColorHint="@color/colorWhite"
173 android:textSize="15sp"
174 android:textColor="@color/colorWhite"
175 android:background="@null"/>
176
177 <ImageButton
178 android:id="@+id/btn_search"
179 android:layout_width="wrap_content"
180 android:layout_height="wrap_content"
181 android:layout_marginRight="10dp"
182 android:layout_alignParentRight="true"
183 android:background="@mipmap/btn_search"/>
184 </RelativeLayout>
185
186
187 </RelativeLayout>
188
MiaohongEntry/app/src/main/res/layout/choose_book_list_item.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="wrap_content"
4 android:orientation="horizontal">
5
6 <LinearLayout
7 android:layout_width="0dp"
8 android:layout_weight="1"
9 android:layout_height="wrap_content"
10 android:paddingTop="2dp"
11 android:paddingBottom="2dp"
12 android:layout_marginLeft="20dp"
13 android:layout_marginRight="50dp"
14 android:gravity="center">
15 <TextView
16 android:id="@+id/choose_book_list_item_grade"
17 android:layout_width="wrap_content"
18 android:layout_height="wrap_content"
19 android:singleLine="true"
20 android:layout_gravity="center_vertical"
21 android:textColor="@color/colorFontBlack"
22 android:textSize="20sp"
23 android:text="123"/>
24
25 <TextView
26 android:id="@+id/choose_book_list_item_reactos"
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 android:singleLine="true"
30 android:layout_gravity="center_vertical"
31 android:textColor="@color/colorFontBlack"
32 android:textSize="20sp"
33 android:text="123"/>
34 </LinearLayout>
35
36 <LinearLayout
37 android:layout_width="0dp"
38 android:layout_weight="1"
39 android:paddingTop="2dp"
40 android:paddingBottom="2dp"
41 android:layout_height="wrap_content"
42 android:gravity="center">
43 <TextView
44 android:id="@+id/choose_book_list_item_press"
45 android:layout_width="wrap_content"
46 android:layout_height="wrap_content"
47 android:singleLine="true"
48 android:layout_gravity="center"
49 android:textColor="@color/colorFontBlack"
50 android:textSize="20sp"
51 android:text="123"/>
52 </LinearLayout>
53
54 </LinearLayout>
MiaohongEntry/app/src/main/res/layout/row_word_list_item.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 android:orientation="horizontal"
5 android:layout_width="match_parent"
6 android:layout_height="wrap_content">
7
8 <ImageView
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:layout_marginRight="9dp"
12 android:layout_marginTop="15dp"
13 android:layout_marginBottom="15dp"
14 android:src="@mipmap/row_tag"
15 android:visibility="invisible"/>
16
17 <TextView
18 android:id="@+id/row_idx"
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:layout_marginRight="12dp"
22 android:layout_marginTop="8dp"
23 android:layout_marginBottom="10dp"
24 android:text="1."
25 android:textSize="22sp"
26 android:textColor="@color/colorFontBlack"/>
27
28 <com.hjx.miaohongentry.ui.FixGridLayout
29 android:id="@+id/ll_row_word"
30 android:layout_width="match_parent"
31 android:layout_height="wrap_content"
32 app:grivate="left"
33 app:horizontal_Space="10dp"
34 app:isFull="false"
35 app:vertical_Space="6dp">
36
37 </com.hjx.miaohongentry.ui.FixGridLayout>
38
39 </LinearLayout>
MiaohongEntry/app/src/main/res/layout/view_title_word.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical" android:layout_width="match_parent"
4 android:layout_height="wrap_content">
5
6 <TextView
7 android:id="@+id/tv_title"
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:text="่ฏ†ๅญ—"
11 android:textColor="@color/colorFontBlack"
12 android:textSize="21sp"/>
13
14 <LinearLayout
15 android:layout_width="match_parent"
16 android:layout_height="wrap_content">
17 <ListView
18 android:id="@+id/row_list"
19 android:layout_width="match_parent"
20 android:layout_height="wrap_content"
21 android:divider="@drawable/dash_line"
22 android:layerType="software"
23 android:dividerHeight="2dip" >
24
25 </ListView>
26
27 </LinearLayout>
28
29 </LinearLayout>
MiaohongEntry/app/src/main/res/layout/word_text_view.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:layout_marginRight="20dp"
6 android:textSize="22sp"
7 android:textColor="@color/colorFontYellow">
8 </TextView>
MiaohongEntry/app/src/main/res/mipmap-hdpi/balloon.png

22.1 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/bg.png

123 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_back.png

7.59 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_change_books.png

25.6 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_left.png

2.41 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_left_sel.png

2.72 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_ok.png

6.27 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_rank.png

27 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_right.png

2.39 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_right_sel.png

2.69 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_search.png

2.53 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_start.png

7.36 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/btn_type.png

4.51 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/choose_book_bg.png

8.07 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/cloud.png

2.37 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/head_icon.png

17.8 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/ic_launcher.png

7.11 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/ic_launcher_round.png

4.11 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/pie_chat.png

42.5 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/plane.png

104 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/row_tag.png

2.45 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/word_bg.png

388 KB

MiaohongEntry/app/src/main/res/mipmap-hdpi/word_switch_bg.png

3 KB

MiaohongEntry/app/src/main/res/mipmap-mdpi/ic_launcher.png

2.15 KB

MiaohongEntry/app/src/main/res/mipmap-mdpi/ic_launcher_round.png

2.5 KB

MiaohongEntry/app/src/main/res/mipmap-xhdpi/ic_launcher.png

7.11 KB

MiaohongEntry/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png

5.97 KB

MiaohongEntry/app/src/main/res/mipmap-xxhdpi/ic_launcher.png

7.11 KB

MiaohongEntry/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png

9.82 KB

MiaohongEntry/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png

7.11 KB

MiaohongEntry/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png

14.4 KB

MiaohongEntry/app/src/main/res/values/attrs.xml
File was created 1 <resources>
2
3 <!-- Declare custom theme attributes that allow changing which styles are
4 used for button bars depending on the API level.
5 ?android:attr/buttonBarStyle is new as of API 11 so this is
6 necessary to support previous API levels. -->
7 <declare-styleable name="ButtonBarContainerTheme">
8 <attr name="metaButtonBarStyle" format="reference" />
9 <attr name="metaButtonBarButtonStyle" format="reference" />
10 </declare-styleable>
11
12 <declare-styleable name="WarpLinearLayout">
13 <attr name="grivate" format="enum"><!--ๅฏน้ฝๆ–นๅผ !-->
14 <enum name="right" value="0"></enum>
15 <enum name="left" value="1"></enum>
16 <enum name="center" value="2"></enum>
17 </attr>
18 <attr name="horizontal_Space" format="dimension"></attr>
19 <attr name="vertical_Space" format="dimension"></attr>
20 <attr name="isFull" format="boolean"></attr>
21 </declare-styleable>
22 </resources>
23
MiaohongEntry/app/src/main/res/values/colors.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <color name="colorPrimary">#3F51B5</color>
4 <color name="colorPrimaryDark">#303F9F</color>
5 <color name="colorAccent">#FF4081</color>
6 <color name="colorWhite">#FFFFFF</color>
7 <color name="colorFontBlack">#FF333333</color>
8 <color name="colorFontRed">#FFe96565</color>
9 <color name="colorFontBlue">#FF1296fc</color>
10 <color name="colorFontGreen">#FF1c9925</color>
11 <color name="colorFontYellow">#FFbd6701</color>
12 <color name="colorLineYellow">#FFc4aa6c</color>
13
14 <color name="black_overlay">#66000000</color>
15 <color name="translucent_background">#90000000</color>
16 </resources>
17
MiaohongEntry/app/src/main/res/values/strings.xml
File was created 1 <resources>
2 <string name="app_name">็ปƒๆฑ‰ๅญ—</string>
3
4 <string name="title_activity_choose_book">ChooseBookActivity</string>
5 <string name="dummy_button">Dummy Button</string>
6 <string name="dummy_content">DUMMY\nCONTENT</string>
7 </resources>
8
MiaohongEntry/app/src/main/res/values/styles.xml
File was created 1 <resources>
2
3 <!-- Base application theme. -->
4 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5 <!-- Customize your theme here. -->
6 <item name="colorPrimary">@color/colorPrimary</item>
7 <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
8 <item name="colorAccent">@color/colorAccent</item>
9 </style>
10
11 <style name="FullscreenTheme" parent="@android:style/Theme.Light.NoTitleBar.Fullscreen">
12 <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
13 <item name="android:windowActionBarOverlay">true</item>
14 <item name="android:windowBackground">@null</item>
15 <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
16 <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
17 </style>
18
19 <style name="FullscreenActionBarStyle" parent="android:Widget.Holo.ActionBar">
20 <item name="android:background">@color/black_overlay</item>
21 </style>
22
23 <style name="translucent">
24 <item name="android:windowNoTitle">true</item>
25 <item name="android:windowBackground">@color/translucent_background</item>
26 <item name="android:windowIsTranslucent">true</item>
27 <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
28 </style>
29
30 <style name="WarpLinearLayoutDefault">
31 <item name="grivate">left</item>
32 <item name="horizontal_Space">20dp</item>
33 <item name="vertical_Space">20dp</item>
34 <item name="isFull">false</item>
35 </style>
36 </resources>
37
MiaohongEntry/app/src/test/java/com/hjx/miaohongentry/ExampleUnitTest.java
File was created 1 package com.hjx.miaohongentry;
2
3 import org.junit.Test;
4
5 import static org.junit.Assert.*;
6
7 /**
8 * Example local unit test, which will execute on the development machine (host).
9 *
10 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
11 */
12 public class ExampleUnitTest {
13 @Test
14 public void addition_isCorrect() throws Exception {
15 assertEquals(4, 2 + 2);
16 }
17 }
MiaohongEntry/build.gradle
File was created 1 // Top-level build file where you can add configuration options common to all sub-projects/modules.
2
3 buildscript {
4 repositories {
5 jcenter()
6 }
7 dependencies {
8 classpath 'com.android.tools.build:gradle:2.3.2'
9
10 // NOTE: Do not place your application dependencies here; they belong
11 // in the individual module build.gradle files
12 }
13 }
14
15 allprojects {
16 repositories {
17 jcenter()
18 }
19 }
20
21 task clean(type: Delete) {
22 delete rootProject.buildDir
23 }
24
MiaohongEntry/gradle.properties
File was created 1 # Project-wide Gradle settings.
2
3 # IDE (e.g. Android Studio) users:
4 # Gradle settings configured through the IDE *will override*
5 # any settings specified in this file.
6
7 # For more details on how to configure your build environment visit
8 # http://www.gradle.org/docs/current/userguide/build_environment.html
9
10 # Specifies the JVM arguments used for the daemon process.
11 # The setting is particularly useful for tweaking memory settings.
12 org.gradle.jvmargs=-Xmx1536m
13
14 # When configured, Gradle will run in incubating parallel mode.
15 # This option should only be used with decoupled projects. More details, visit
16 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 # org.gradle.parallel=true
18
MiaohongEntry/gradle/wrapper/gradle-wrapper.jar
No preview for this file type
MiaohongEntry/gradle/wrapper/gradle-wrapper.properties
File was created 1 #Tue Jan 23 19:37:02 CST 2018
2 distributionBase=GRADLE_USER_HOME
3 distributionPath=wrapper/dists
4 zipStoreBase=GRADLE_USER_HOME
5 zipStorePath=wrapper/dists
6 distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
7
MiaohongEntry/gradlew
File was created 1 #!/usr/bin/env bash
2
3 ##############################################################################
4 ##
5 ## Gradle start up script for UN*X
6 ##
7 ##############################################################################
8
9 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 DEFAULT_JVM_OPTS=""
11
12 APP_NAME="Gradle"
13 APP_BASE_NAME=`basename "$0"`
14
15 # Use the maximum available, or set MAX_FD != -1 to use that value.
16 MAX_FD="maximum"
17
18 warn ( ) {
19 echo "$*"
20 }
21
22 die ( ) {
23 echo
24 echo "$*"
25 echo
26 exit 1
27 }
28
29 # OS specific support (must be 'true' or 'false').
30 cygwin=false
31 msys=false
32 darwin=false
33 case "`uname`" in
34 CYGWIN* )
35 cygwin=true
36 ;;
37 Darwin* )
38 darwin=true
39 ;;
40 MINGW* )
41 msys=true
42 ;;
43 esac
44
45 # Attempt to set APP_HOME
46 # Resolve links: $0 may be a link
47 PRG="$0"
48 # Need this for relative symlinks.
49 while [ -h "$PRG" ] ; do
50 ls=`ls -ld "$PRG"`
51 link=`expr "$ls" : '.*-> \(.*\)$'`
52 if expr "$link" : '/.*' > /dev/null; then
53 PRG="$link"
54 else
55 PRG=`dirname "$PRG"`"/$link"
56 fi
57 done
58 SAVED="`pwd`"
59 cd "`dirname \"$PRG\"`/" >/dev/null
60 APP_HOME="`pwd -P`"
61 cd "$SAVED" >/dev/null
62
63 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64
65 # Determine the Java command to use to start the JVM.
66 if [ -n "$JAVA_HOME" ] ; then
67 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 # IBM's JDK on AIX uses strange locations for the executables
69 JAVACMD="$JAVA_HOME/jre/sh/java"
70 else
71 JAVACMD="$JAVA_HOME/bin/java"
72 fi
73 if [ ! -x "$JAVACMD" ] ; then
74 die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75
76 Please set the JAVA_HOME variable in your environment to match the
77 location of your Java installation."
78 fi
79 else
80 JAVACMD="java"
81 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82
83 Please set the JAVA_HOME variable in your environment to match the
84 location of your Java installation."
85 fi
86
87 # Increase the maximum file descriptors if we can.
88 if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 MAX_FD_LIMIT=`ulimit -H -n`
90 if [ $? -eq 0 ] ; then
91 if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 MAX_FD="$MAX_FD_LIMIT"
93 fi
94 ulimit -n $MAX_FD
95 if [ $? -ne 0 ] ; then
96 warn "Could not set maximum file descriptor limit: $MAX_FD"
97 fi
98 else
99 warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 fi
101 fi
102
103 # For Darwin, add options to specify how the application appears in the dock
104 if $darwin; then
105 GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 fi
107
108 # For Cygwin, switch paths to Windows format before running java
109 if $cygwin ; then
110 APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 JAVACMD=`cygpath --unix "$JAVACMD"`
113
114 # We build the pattern for arguments to be converted via cygpath
115 ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 SEP=""
117 for dir in $ROOTDIRSRAW ; do
118 ROOTDIRS="$ROOTDIRS$SEP$dir"
119 SEP="|"
120 done
121 OURCYGPATTERN="(^($ROOTDIRS))"
122 # Add a user-defined pattern to the cygpath arguments
123 if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 fi
126 # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 i=0
128 for arg in "$@" ; do
129 CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131
132 if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 else
135 eval `echo args$i`="\"$arg\""
136 fi
137 i=$((i+1))
138 done
139 case $i in
140 (0) set -- ;;
141 (1) set -- "$args0" ;;
142 (2) set -- "$args0" "$args1" ;;
143 (3) set -- "$args0" "$args1" "$args2" ;;
144 (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 esac
151 fi
152
153 # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 function splitJvmOpts() {
155 JVM_OPTS=("$@")
156 }
157 eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159
160 exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161
MiaohongEntry/gradlew.bat
File was created 1 @if "%DEBUG%" == "" @echo off
2 @rem ##########################################################################
3 @rem
4 @rem Gradle startup script for Windows
5 @rem
6 @rem ##########################################################################
7
8 @rem Set local scope for the variables with windows NT shell
9 if "%OS%"=="Windows_NT" setlocal
10
11 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 set DEFAULT_JVM_OPTS=
13
14 set DIRNAME=%~dp0
15 if "%DIRNAME%" == "" set DIRNAME=.
16 set APP_BASE_NAME=%~n0
17 set APP_HOME=%DIRNAME%
18
19 @rem Find java.exe
20 if defined JAVA_HOME goto findJavaFromJavaHome
21
22 set JAVA_EXE=java.exe
23 %JAVA_EXE% -version >NUL 2>&1
24 if "%ERRORLEVEL%" == "0" goto init
25
26 echo.
27 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 echo.
29 echo Please set the JAVA_HOME variable in your environment to match the
30 echo location of your Java installation.
31
32 goto fail
33
34 :findJavaFromJavaHome
35 set JAVA_HOME=%JAVA_HOME:"=%
36 set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37
38 if exist "%JAVA_EXE%" goto init
39
40 echo.
41 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 echo.
43 echo Please set the JAVA_HOME variable in your environment to match the
44 echo location of your Java installation.
45
46 goto fail
47
48 :init
49 @rem Get command-line arguments, handling Windowz variants
50
51 if not "%OS%" == "Windows_NT" goto win9xME_args
52 if "%@eval[2+2]" == "4" goto 4NT_args
53
54 :win9xME_args
55 @rem Slurp the command line arguments.
56 set CMD_LINE_ARGS=
57 set _SKIP=2
58
59 :win9xME_args_slurp
60 if "x%~1" == "x" goto execute
61
62 set CMD_LINE_ARGS=%*
63 goto execute
64
65 :4NT_args
66 @rem Get arguments from the 4NT Shell from JP Software
67 set CMD_LINE_ARGS=%$
68
69 :execute
70 @rem Setup the command line
71
72 set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73
74 @rem Execute Gradle
75 "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76
77 :end
78 @rem End local scope for the variables with windows NT shell
79 if "%ERRORLEVEL%"=="0" goto mainEnd
80
81 :fail
82 rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 rem the _cmd.exe /c_ return code!
84 if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 exit /b 1
86
87 :mainEnd
88 if "%OS%"=="Windows_NT" endlocal
89
90 :omega
91
MiaohongEntry/settings.gradle
File was created 1 include ':app'
2