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
... ... @@ -0,0 +1,9 @@
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +/.idea/workspace.xml
  5 +/.idea/libraries
  6 +.DS_Store
  7 +/build
  8 +/captures
  9 +.externalNativeBuild
... ...
MiaohongEntry/.idea/compiler.xml
... ... @@ -0,0 +1,22 @@
  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>
0 23 \ No newline at end of file
... ...
MiaohongEntry/.idea/copyright/profiles_settings.xml
... ... @@ -0,0 +1,3 @@
  1 +<component name="CopyrightManager">
  2 + <settings default="" />
  3 +</component>
0 4 \ No newline at end of file
... ...
MiaohongEntry/.idea/gradle.xml
... ... @@ -0,0 +1,18 @@
  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>
0 19 \ No newline at end of file
... ...
MiaohongEntry/.idea/misc.xml
... ... @@ -0,0 +1,46 @@
  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>
0 47 \ No newline at end of file
... ...
MiaohongEntry/.idea/modules.xml
... ... @@ -0,0 +1,9 @@
  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>
0 10 \ No newline at end of file
... ...
MiaohongEntry/.idea/runConfigurations.xml
... ... @@ -0,0 +1,12 @@
  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>
0 13 \ No newline at end of file
... ...
MiaohongEntry/app/.gitignore
... ... @@ -0,0 +1 @@
  1 +/build
... ...
MiaohongEntry/app/build.gradle
... ... @@ -0,0 +1,33 @@
  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 +}
... ...
MiaohongEntry/app/proguard-rules.pro
... ... @@ -0,0 +1,25 @@
  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
... ...
MiaohongEntry/app/src/androidTest/java/com/hjx/miaohongentry/ExampleInstrumentedTest.java
... ... @@ -0,0 +1,26 @@
  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 +}
... ...
MiaohongEntry/app/src/main/AndroidManifest.xml
... ... @@ -0,0 +1,50 @@
  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>
0 51 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/assets/mh.db
No preview for this file type
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/ChooseBookActivity.java
... ... @@ -0,0 +1,73 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/InitCallback.java
... ... @@ -0,0 +1,12 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/MainActivity.java
... ... @@ -0,0 +1,196 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/activity/WordActivity.java
... ... @@ -0,0 +1,295 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/adapter/BookListAdapter.java
... ... @@ -0,0 +1,112 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/adapter/RowWordListAdapter.java
... ... @@ -0,0 +1,94 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/AppVersion.java
... ... @@ -0,0 +1,54 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/BookInfo.java
... ... @@ -0,0 +1,59 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/RowWord.java
... ... @@ -0,0 +1,37 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/bean/TitleWord.java
... ... @@ -0,0 +1,51 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/builder/JSONBuilder.java
... ... @@ -0,0 +1,26 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/builder/UpdateInfoBuilder.java
... ... @@ -0,0 +1,38 @@
  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 +}
0 39 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/db/MHDataManager.java
... ... @@ -0,0 +1,198 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/db/MHDataTable.java
... ... @@ -0,0 +1,44 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/http/MHGetApi.java
... ... @@ -0,0 +1,22 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/http/MHGetApiImp.java
... ... @@ -0,0 +1,89 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/ui/FixGridLayout.java
... ... @@ -0,0 +1,262 @@
  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 +}
0 263 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/ui/WordListView.java
... ... @@ -0,0 +1,32 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/update/DownloadService.java
... ... @@ -0,0 +1,61 @@
  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 +}
0 62 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/update/UpdateChecker.java
... ... @@ -0,0 +1,211 @@
  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 +}
0 212 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/Constants.java
... ... @@ -0,0 +1,23 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/DeviceUtils.java
... ... @@ -0,0 +1,102 @@
  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 +}
0 103 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/SpUtils.java
... ... @@ -0,0 +1,109 @@
  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 +}
0 110 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/SpanTextViewUtils.java
... ... @@ -0,0 +1,156 @@
  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 +}
... ...
MiaohongEntry/app/src/main/java/com/hjx/miaohongentry/util/StatisUtils.java
... ... @@ -0,0 +1,70 @@
  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 +}
... ...
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
... ... @@ -0,0 +1,15 @@
  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>
0 16 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/drawable/radio_table_type_left.xml
... ... @@ -0,0 +1,9 @@
  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>
0 10 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/drawable/radio_table_type_right.xml
... ... @@ -0,0 +1,9 @@
  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>
0 10 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/drawable/shape_corner.xml
... ... @@ -0,0 +1,9 @@
  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>
0 10 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/layout/activity_choose_book.xml
... ... @@ -0,0 +1,46 @@
  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>
... ...
MiaohongEntry/app/src/main/res/layout/activity_main.xml
... ... @@ -0,0 +1,206 @@
  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>
... ...
MiaohongEntry/app/src/main/res/layout/activity_word.xml
... ... @@ -0,0 +1,187 @@
  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>
... ...
MiaohongEntry/app/src/main/res/layout/choose_book_list_item.xml
... ... @@ -0,0 +1,54 @@
  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>
0 55 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/layout/row_word_list_item.xml
... ... @@ -0,0 +1,39 @@
  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>
0 40 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/layout/view_title_word.xml
... ... @@ -0,0 +1,29 @@
  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>
0 30 \ No newline at end of file
... ...
MiaohongEntry/app/src/main/res/layout/word_text_view.xml
... ... @@ -0,0 +1,8 @@
  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>
0 9 \ No newline at end of file
... ...
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
... ... @@ -0,0 +1,22 @@
  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>
... ...
MiaohongEntry/app/src/main/res/values/colors.xml
... ... @@ -0,0 +1,16 @@
  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>
... ...
MiaohongEntry/app/src/main/res/values/strings.xml
... ... @@ -0,0 +1,7 @@
  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>
... ...
MiaohongEntry/app/src/main/res/values/styles.xml
... ... @@ -0,0 +1,36 @@
  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>
... ...
MiaohongEntry/app/src/test/java/com/hjx/miaohongentry/ExampleUnitTest.java
... ... @@ -0,0 +1,17 @@
  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 +}
0 18 \ No newline at end of file
... ...
MiaohongEntry/build.gradle
... ... @@ -0,0 +1,23 @@
  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 +}
... ...
MiaohongEntry/gradle.properties
... ... @@ -0,0 +1,17 @@
  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
... ...
MiaohongEntry/gradle/wrapper/gradle-wrapper.jar
No preview for this file type
MiaohongEntry/gradle/wrapper/gradle-wrapper.properties
... ... @@ -0,0 +1,6 @@
  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
... ...
MiaohongEntry/gradlew
... ... @@ -0,0 +1,160 @@
  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 "$@"
... ...
MiaohongEntry/gradlew.bat
... ... @@ -0,0 +1,90 @@
  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
... ...
MiaohongEntry/settings.gradle
... ... @@ -0,0 +1 @@
  1 +include ':app'
... ...