diff --git a/app/build.gradle b/app/build.gradle index 59a685d9..082b7776 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,18 +1,35 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion + compileSdkVersion 28 buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.hjq.demo" - minSdkVersion 14 + minSdkVersion 15 targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 10 - versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } + + signingConfigs { + debug { + keyAlias 'key0' + keyPassword 'test2018' + storeFile file('/test2018.jks') + storePassword 'test2018' + } + + release { + keyAlias 'key0' + keyPassword 'test2018' + storeFile file('/test2018.jks') + storePassword 'test2018' + } + + } + buildTypes { release { + signingConfig signingConfigs.release // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" // 移除无用的resource文件,前提minifyEnabled必须打开 @@ -26,6 +43,7 @@ android { } debug { + signingConfig signingConfigs.debug //ZipAlign优化 zipAlignEnabled false //设置混淆 @@ -54,36 +72,74 @@ android { dependencies { api fileTree(include: ['*.jar'], dir: 'libs') api project(':baselibrary') + // 示例:添加一个 aar 包 //api(name: 'password_dialog', ext: 'aar') - api "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion" api "com.android.support:design:$rootProject.ext.supportLibraryVersion" api "com.android.support:support-v4:$rootProject.ext.supportLibraryVersion" api "com.android.support:cardview-v7:$rootProject.ext.supportLibraryVersion" api "com.android.support.constraint:constraint-layout:$rootProject.ext.constraintlayoutVersion" + api 'com.android.support:recyclerview-v7:28.0.0' + + // 解决函数超过65535时的分包问题 + api 'com.android.support:multidex:1.0.3' // 状态栏沉浸:https://github.com/gyf-dev/ImmersionBar api 'com.gyf.barlibrary:barlibrary:2.3.0' + // 侧滑功能:https://github.com/bingoogolapple/BGASwipeBackLayout-Android api 'cn.bingoogolapple:bga-swipebacklayout:1.1.9@aar' // 权限请求框架:https://github.com/getActivity/XXPermissions api 'com.hjq:xxpermissions:5.2' + // 标题栏:https://github.com/getActivity/TitleBar api 'com.hjq:titlebar:3.2' + // 吐司工具类:https://github.com/getActivity/ToastUtils api 'com.hjq:toast:2.5' // 圆形的ImageView:https://github.com/hdodenhof/CircleImageView api 'de.hdodenhof:circleimageview:2.2.0' - // ButterKnife注解库:https://github.com/JakeWharton/butterknife - api "com.jakewharton:butterknife:$rootProject.ext.butterknifeVersion" - annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.ext.butterknifeVersion" + //网络请求库 + api 'org.xutils:xutils:3.5.0' + + //选项卡 + api 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar' + + //轮播 + api 'com.youth.banner:banner:1.4.10' + + //适配器 + api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.42' + + //JSON处理 + api 'com.google.code.gson:gson:2.8.5' + + //https://github.com/zhihu/Matisse 本地文件选择器 + implementation 'com.zhihu.android:matisse:0.5.2-beta3' + //图片加载器 matisse 需要2.5.2 ,不要变动版本 + implementation 'com.squareup.picasso:picasso:2.5.2' + + //七牛图片上传SDK + implementation 'com.qiniu:qiniu-android-sdk:7.3.13' + + + + // 友盟统计与第三方 + implementation files('libs/umeng-share-core-6.9.3.jar') + implementation files('libs/umeng-sharetool-6.9.3.jar') + implementation files('libs/umeng-share-QQ-simplify-6.9.3.jar') + implementation files('libs/umeng-share-wechat-simplify-6.9.3.jar') + implementation files('libs/umeng-common-1.5.4.jar') + implementation files('libs/umeng-analytics-7.5.4.jar') + //PushSDK必须依赖utdid库,所以需要加入对应依赖 + api 'com.umeng.sdk:utdid:1.1.5.3' + //PushSDK + api 'com.umeng.sdk:push:4.2.0' - // 友盟统计 - compileOnly 'com.umeng.analytics:analytics:6.1.4' } repositories { diff --git a/app/libs/umeng-analytics-7.5.4.jar b/app/libs/umeng-analytics-7.5.4.jar new file mode 100644 index 00000000..58247b3c Binary files /dev/null and b/app/libs/umeng-analytics-7.5.4.jar differ diff --git a/app/libs/umeng-analytics-v6.1.2.jar b/app/libs/umeng-analytics-v6.1.2.jar deleted file mode 100644 index 73588734..00000000 Binary files a/app/libs/umeng-analytics-v6.1.2.jar and /dev/null differ diff --git a/app/libs/umeng-common-1.5.4.jar b/app/libs/umeng-common-1.5.4.jar new file mode 100644 index 00000000..c25014be Binary files /dev/null and b/app/libs/umeng-common-1.5.4.jar differ diff --git a/app/libs/umeng-share-QQ-simplify-6.9.3.jar b/app/libs/umeng-share-QQ-simplify-6.9.3.jar new file mode 100644 index 00000000..70dc7350 Binary files /dev/null and b/app/libs/umeng-share-QQ-simplify-6.9.3.jar differ diff --git a/app/libs/umeng-share-core-6.9.3.jar b/app/libs/umeng-share-core-6.9.3.jar new file mode 100644 index 00000000..1bb4ad18 Binary files /dev/null and b/app/libs/umeng-share-core-6.9.3.jar differ diff --git a/app/libs/umeng-share-wechat-simplify-6.9.3.jar b/app/libs/umeng-share-wechat-simplify-6.9.3.jar new file mode 100644 index 00000000..f6dd8284 Binary files /dev/null and b/app/libs/umeng-share-wechat-simplify-6.9.3.jar differ diff --git a/app/libs/umeng-sharetool-6.9.3.jar b/app/libs/umeng-sharetool-6.9.3.jar new file mode 100644 index 00000000..7b06966f Binary files /dev/null and b/app/libs/umeng-sharetool-6.9.3.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d195a5a4..72bb02f8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ + package="com.hjq.demo" + android:versionCode="1" + android:versionName="1.0.0"> @@ -16,9 +18,21 @@ + + + + + + + + + + + + android:value="5bea6d89b465f57ac40000cf" /> + + + + android:launchMode="singleTop" + android:screenOrientation="portrait" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/editor.html b/app/src/main/assets/editor.html new file mode 100644 index 00000000..aa44a513 --- /dev/null +++ b/app/src/main/assets/editor.html @@ -0,0 +1,13 @@ + + + + + + + + + +
+ + + diff --git a/app/src/main/assets/normalize.css b/app/src/main/assets/normalize.css new file mode 100644 index 00000000..a5ae163b --- /dev/null +++ b/app/src/main/assets/normalize.css @@ -0,0 +1,413 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} \ No newline at end of file diff --git a/app/src/main/assets/rich_editor.js b/app/src/main/assets/rich_editor.js new file mode 100644 index 00000000..9eca1688 --- /dev/null +++ b/app/src/main/assets/rich_editor.js @@ -0,0 +1,312 @@ +/** + * Copyright (C) 2017 Wasabeef + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var RE = {}; + +RE.currentSelection = { + "startContainer": 0, + "startOffset": 0, + "endContainer": 0, + "endOffset": 0}; + +RE.editor = document.getElementById('editor'); + +document.addEventListener("selectionchange", function() { RE.backuprange(); }); + +// Initializations +RE.callback = function() { + window.location.href = "re-callback://" + encodeURI(RE.getHtml()); +} + +RE.setHtml = function(contents) { + RE.editor.innerHTML = decodeURIComponent(contents.replace(/\+/g, '%20')); +} + +RE.getHtml = function() { + return RE.editor.innerHTML; +} + +RE.getText = function() { + return RE.editor.innerText; +} + +RE.setBaseTextColor = function(color) { + RE.editor.style.color = color; +} + +RE.setBaseFontSize = function(size) { + RE.editor.style.fontSize = size; +} + +RE.setPadding = function(left, top, right, bottom) { + RE.editor.style.paddingLeft = left; + RE.editor.style.paddingTop = top; + RE.editor.style.paddingRight = right; + RE.editor.style.paddingBottom = bottom; +} + +RE.setBackgroundColor = function(color) { + document.body.style.backgroundColor = color; +} + +RE.setBackgroundImage = function(image) { + RE.editor.style.backgroundImage = image; +} + +RE.setWidth = function(size) { + RE.editor.style.minWidth = size; +} + +RE.setHeight = function(size) { + RE.editor.style.height = size; +} + +RE.setTextAlign = function(align) { + RE.editor.style.textAlign = align; +} + +RE.setVerticalAlign = function(align) { + RE.editor.style.verticalAlign = align; +} + +RE.setPlaceholder = function(placeholder) { + RE.editor.setAttribute("placeholder", placeholder); +} + +RE.setInputEnabled = function(inputEnabled) { + RE.editor.contentEditable = String(inputEnabled); +} + +RE.undo = function() { + document.execCommand('undo', false, null); +} + +RE.redo = function() { + document.execCommand('redo', false, null); +} + +RE.setBold = function() { + document.execCommand('bold', false, null); +} + +RE.setItalic = function() { + document.execCommand('italic', false, null); +} + +RE.setSubscript = function() { + document.execCommand('subscript', false, null); +} + +RE.setSuperscript = function() { + document.execCommand('superscript', false, null); +} + +RE.setStrikeThrough = function() { + document.execCommand('strikeThrough', false, null); +} + +RE.setUnderline = function() { + document.execCommand('underline', false, null); +} + +RE.setBullets = function() { + document.execCommand('insertUnorderedList', false, null); +} + +RE.setNumbers = function() { + document.execCommand('insertOrderedList', false, null); +} + +RE.setTextColor = function(color) { + RE.restorerange(); + document.execCommand("styleWithCSS", null, true); + document.execCommand('foreColor', false, color); + document.execCommand("styleWithCSS", null, false); +} + +RE.setTextBackgroundColor = function(color) { + RE.restorerange(); + document.execCommand("styleWithCSS", null, true); + document.execCommand('hiliteColor', false, color); + document.execCommand("styleWithCSS", null, false); +} + +RE.setFontSize = function(fontSize){ + document.execCommand("fontSize", false, fontSize); +} + +RE.setHeading = function(heading) { + document.execCommand('formatBlock', false, ''); +} + +RE.setIndent = function() { + document.execCommand('indent', false, null); +} + +RE.setOutdent = function() { + document.execCommand('outdent', false, null); +} + +RE.setJustifyLeft = function() { + document.execCommand('justifyLeft', false, null); +} + +RE.setJustifyCenter = function() { + document.execCommand('justifyCenter', false, null); +} + +RE.setJustifyRight = function() { + document.execCommand('justifyRight', false, null); +} + +RE.setBlockquote = function() { + document.execCommand('formatBlock', false, '
'); +} + +RE.insertImage = function(url, alt) { + var html = '' + alt + ''; + RE.insertHTML(html); +} + +RE.insertHTML = function(html) { + RE.restorerange(); + document.execCommand('insertHTML', false, html); +} + +RE.insertLink = function(url, title) { + RE.restorerange(); + var sel = document.getSelection(); + if (sel.toString().length == 0) { + document.execCommand("insertHTML",false,""+title+""); + } else if (sel.rangeCount) { + var el = document.createElement("a"); + el.setAttribute("href", url); + el.setAttribute("title", title); + + var range = sel.getRangeAt(0).cloneRange(); + range.surroundContents(el); + sel.removeAllRanges(); + sel.addRange(range); + } + RE.callback(); +} + +RE.setTodo = function(text) { + var html = '  '; + document.execCommand('insertHTML', false, html); +} + +RE.prepareInsert = function() { + RE.backuprange(); +} + +RE.backuprange = function(){ + var selection = window.getSelection(); + if (selection.rangeCount > 0) { + var range = selection.getRangeAt(0); + RE.currentSelection = { + "startContainer": range.startContainer, + "startOffset": range.startOffset, + "endContainer": range.endContainer, + "endOffset": range.endOffset}; + } +} + +RE.restorerange = function(){ + var selection = window.getSelection(); + selection.removeAllRanges(); + var range = document.createRange(); + range.setStart(RE.currentSelection.startContainer, RE.currentSelection.startOffset); + range.setEnd(RE.currentSelection.endContainer, RE.currentSelection.endOffset); + selection.addRange(range); +} + +RE.enabledEditingItems = function(e) { + var items = []; + if (document.queryCommandState('bold')) { + items.push('bold'); + } + if (document.queryCommandState('italic')) { + items.push('italic'); + } + if (document.queryCommandState('subscript')) { + items.push('subscript'); + } + if (document.queryCommandState('superscript')) { + items.push('superscript'); + } + if (document.queryCommandState('strikeThrough')) { + items.push('strikeThrough'); + } + if (document.queryCommandState('underline')) { + items.push('underline'); + } + if (document.queryCommandState('insertOrderedList')) { + items.push('orderedList'); + } + if (document.queryCommandState('insertUnorderedList')) { + items.push('unorderedList'); + } + if (document.queryCommandState('justifyCenter')) { + items.push('justifyCenter'); + } + if (document.queryCommandState('justifyFull')) { + items.push('justifyFull'); + } + if (document.queryCommandState('justifyLeft')) { + items.push('justifyLeft'); + } + if (document.queryCommandState('justifyRight')) { + items.push('justifyRight'); + } + if (document.queryCommandState('insertHorizontalRule')) { + items.push('horizontalRule'); + } + var formatBlock = document.queryCommandValue('formatBlock'); + if (formatBlock.length > 0) { + items.push(formatBlock); + } + + window.location.href = "re-state://" + encodeURI(items.join(',')); +} + +RE.focus = function() { + var range = document.createRange(); + range.selectNodeContents(RE.editor); + range.collapse(false); + var selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + RE.editor.focus(); +} + +RE.blurFocus = function() { + RE.editor.blur(); +} + +RE.removeFormat = function() { + document.execCommand('removeFormat', false, null); +} + +// Event Listeners +RE.editor.addEventListener("input", RE.callback); +RE.editor.addEventListener("keyup", function(e) { + var KEY_LEFT = 37, KEY_RIGHT = 39; + if (e.which == KEY_LEFT || e.which == KEY_RIGHT) { + RE.enabledEditingItems(e); + } +}); +RE.editor.addEventListener("click", RE.enabledEditingItems); diff --git a/app/src/main/assets/style.css b/app/src/main/assets/style.css new file mode 100644 index 00000000..c6618c33 --- /dev/null +++ b/app/src/main/assets/style.css @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2017 Wasabeef + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@charset "UTF-8"; + + +html { + height: 100%; +} + +body { + overflow: scroll; + display: table; + table-layout: fixed; + width: 100%; + min-height:100%; +} + +#editor { + display: table-cell; + outline: 0px solid transparent; + background-repeat: no-repeat; + background-position: center; + background-size: cover; +} + +#editor[placeholder]:empty:not(:focus):before { + content: attr(placeholder); + opacity: .5; +}} diff --git a/app/src/main/java/com/hjq/demo/Constant.java b/app/src/main/java/com/hjq/demo/Constant.java new file mode 100644 index 00000000..5c6500e6 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/Constant.java @@ -0,0 +1,20 @@ +package com.hjq.demo; + +public class Constant { + //服务端域名 + public final static String DOMAIN = "http://www.iafeng.cc/"; + + //第三方KEY + public final static String QQAPP_ID = "1105979137"; + public final static String QQAPP_SECRET = "jODSgRir417714vY"; + public final static String WXAPP_ID = "wxbec65736501d0564"; + public final static String WXAPP_SECRET = "82bc1e49bbb56cdded05cc8875d02ea79"; + + + //广播接受器Action监听类型 + public enum ActionType { + ON_DOWNLOAD, //下载中返回进度 + DOWNLOAD_ERROR, //下载错误 + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/Service/DownloadService.java b/app/src/main/java/com/hjq/demo/Service/DownloadService.java new file mode 100644 index 00000000..64a8d1d4 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/Service/DownloadService.java @@ -0,0 +1,381 @@ +package com.hjq.demo.Service; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.support.v4.app.NotificationCompat; +import android.text.TextUtils; +import android.util.Log; +import android.widget.RemoteViews; +import android.widget.Toast; + +import com.hjq.baselibrary.utils.FileUtils; +import com.hjq.demo.Constant; +import com.hjq.demo.R; +import com.hjq.demo.ui.activity.HomeActivity; + +import org.xutils.common.Callback; +import org.xutils.http.RequestParams; +import org.xutils.x; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.security.NoSuchAlgorithmException; + +/** + * Created by Administrator on 2016/3/11. + */ +public class DownloadService extends IntentService { + private static final String TAG = DownloadService.class.getSimpleName(); + private NotificationManager notificationManager; + private Notification notification; + private RemoteViews rViews; + private int fileLength, downloadLength; + // 定时器,每隔一段时间检查下载进度,然后更新Notification上的ProgressBar + private Handler handler = new Handler(); + private Runnable run = new Runnable() { + public void run() { + rViews.setProgressBar(R.id.progressbar, 100, downloadLength * 100 / fileLength, false); + notification.contentView = rViews; + notificationManager.notify(0, notification); + handler.postDelayed(run, 500); + + // 广播出去,用于显示下载进度 + Intent sendIntent = new Intent(Constant.ActionType.ON_DOWNLOAD.name()); + sendIntent.putExtra("progress", downloadLength * 100 / fileLength); + sendBroadcast(sendIntent); + + Log.d("--onLoading", "sendBroadcast-downloadLength: " + downloadLength); + Log.d("--onLoading", "sendBroadcast-fileLength: " + fileLength); + } + }; + + public DownloadService() { + super(Constant.ActionType.ON_DOWNLOAD.name()); + } + + protected void onHandleIntent(Intent intent) { + Bundle bundle = intent.getExtras(); + // 获得下载文件的url + String downloadUrl = bundle.getString("url"); + String apkmd5 = bundle.getString("apkmd5"); + String apkName = bundle.getString("apkName"); + if (TextUtils.isEmpty(apkName)) { + apkName = "file.apk"; + } + // 设置文件下载后的保存路径,保存在SD卡根目录的Download文件夹 + File dirs = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download"); + // 检查文件夹是否存在,不存在则创建 + if (!dirs.exists()) { + dirs.mkdir(); + } + File file = new File(dirs, apkName); + // 设置Notification + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + NotificationCompat.Builder builder = new NotificationCompat.Builder(this); + builder.setTicker("正在下载新版本"); + builder.setContentText(getString(R.string.app_name) + ":正在下载新版本"); + builder.setSmallIcon(R.mipmap.ic_launcher); + notification = builder.build(); + + + Intent intentNotifi = new Intent(this, HomeActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intentNotifi, 0); + notification.contentIntent = pendingIntent; + // 加载Notification的布局文件 + rViews = new RemoteViews(getPackageName(), R.layout.item_download_progress); + // 设置下载进度条 + rViews.setProgressBar(R.id.progressbar, 100, 0, false); + notification.contentView = rViews; + notificationManager.notify(0, notification); + // 开始下载 + downloadFile(downloadUrl, file); + + boolean hasException = false; //判断是否出现异常 + + //检查文件完整性 + try { + File apk = new File(file.getPath()); + if (apk.exists()) { + String md5 = FileUtils.getFileMD5(apk); + Log.d("--md5", "onReceive: " + md5); + if (!TextUtils.isEmpty(md5)) { + if (!TextUtils.isEmpty(apkmd5)) { + Log.d("--md5", "apkmd5: " + apkmd5); + + if (apkmd5.equals(md5)) { + // 移除通知栏 + notificationManager.cancel(0); + // 广播出去,由广播接收器来处理下载完成的文件 + Intent sendIntent = new Intent(Constant.ActionType.ON_DOWNLOAD.name()); + // 把下载好的文件的保存地址加进Intent + sendIntent.putExtra("downloadFile", file.getPath()); + sendBroadcast(sendIntent); + } else { + + try { + x.task().post(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "文件完整性检验失败,将尝试重新下载", Toast.LENGTH_LONG).show(); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + Log.d("--md5", "文件不完整,将尝试重新下载"); + Log.d("--md5", "downloadUrl:" + downloadUrl); + + //尝试使用断点续传方式下载 + startDownload(downloadUrl, dirs.getPath(), new Callback.ProgressCallback() { + @Override + public void onWaiting() { + + } + + @Override + public void onStarted() { + Log.d("--onLoading", "onStarted: " + downloadLength); + + } + + @Override + public void onLoading(long total, long current, boolean b) { +// fileLength = Math.round(total); +// //做一下判断,防止自回调过于频繁,造成更新通知栏进度过于频繁,而出现卡顿的问题。 +// int rate = Math.round(current); +// if (downloadLength != rate) { +// //重新赋值 +// downloadLength = rate; +// } + //不显示进度 + Log.d("--onLoading", "downloadLength: " + downloadLength); + Log.d("--onLoading", "fileLength: " + fileLength); + } + + @Override + public void onSuccess(File result) { + Log.d("--md5", "下载完成"); + + // 移除通知栏 + notificationManager.cancel(0); + // 广播出去,由广播接收器来处理下载完成的文件 + Intent sendIntent = new Intent(Constant.ActionType.ON_DOWNLOAD.name()); + // 把下载好的文件的保存地址加进Intent + sendIntent.putExtra("downloadFile", result.getPath()); + sendBroadcast(sendIntent); + } + + @Override + public void onError(Throwable throwable, boolean b) { + Log.d("--md5", "onError:" + throwable.getMessage()); + try { + x.task().post(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "网络无法连接,请检查后重试", Toast.LENGTH_LONG).show(); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + // 移除通知栏 + notificationManager.cancel(0); + // 广播出去,由广播接收器来处理状态 + Intent sendIntent = new Intent(Constant.ActionType.DOWNLOAD_ERROR.name()); + sendBroadcast(sendIntent); + + } + + @Override + public void onCancelled(CancelledException e) { + + } + + @Override + public void onFinished() { + + } + }); + + } + } else { + //就算服务器不返回md5码也要尝试安装 + hasException = true; + } + } + } + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + hasException = true; + } catch (IOException e) { + e.printStackTrace(); + hasException = true; + } + + //如果上面的处理出现异常则尝试使用以往方式进行安装 + if (hasException) { + // 移除通知栏 + notificationManager.cancel(0); + // 广播出去,由广播接收器来处理下载完成的文件 + Intent sendIntent = new Intent(Constant.ActionType.ON_DOWNLOAD.name()); + // 把下载好的文件的保存地址加进Intent + sendIntent.putExtra("downloadFile", file.getPath()); + sendBroadcast(sendIntent); + } + + + } + + private void downloadFile(String downloadUrl, File file) { + FileOutputStream fos = null; + try { + fos = new FileOutputStream(file); + } catch (FileNotFoundException e) { + Log.e(TAG, "找不到保存下载文件的目录"); + e.printStackTrace(); + } + InputStream ips = null; + try { + URL url = new URL(downloadUrl); + HttpURLConnection huc = (HttpURLConnection) url.openConnection(); + huc.setRequestMethod("GET"); + huc.setReadTimeout(10000); + huc.setConnectTimeout(3000); + + try { + //友盟发现此值可能为null + if (huc.getHeaderField("Content-Length") != null) { + fileLength = Integer.valueOf(huc.getHeaderField("Content-Length")); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + ips = huc.getInputStream(); + // 拿到服务器返回的响应码 + int hand = huc.getResponseCode(); + if (hand == 200) { + // 开始检查下载进度 + handler.post(run); + // 建立一个byte数组作为缓冲区,等下把读取到的数据储存在这个数组 + byte[] buffer = new byte[8192]; + int len = 0; + while ((len = ips.read(buffer)) != -1) { + fos.write(buffer, 0, len); + downloadLength = downloadLength + len; + } + } else { + Log.e(TAG, "服务器返回码" + hand); + } + + } catch (ProtocolException e) { + e.printStackTrace(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + if (ips != null) { + ips.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public void onDestroy() { + // 移除定時器 + handler.removeCallbacks(run); + super.onDestroy(); + } + + + private void startDownload(String apkUrl, String target, final Callback.ProgressCallback downloadListener) { + if (TextUtils.isEmpty(apkUrl)) { + return; + } + + RequestParams params = new RequestParams(apkUrl); + params.addBodyParameter("time", String.valueOf(System.currentTimeMillis())); + params.setAutoResume(true);// 断点续传 + params.setSaveFilePath(target); + x.http().get(params, new Callback.ProgressCallback() { + @Override + public void onSuccess(final File result) { + x.task().post(new Runnable() { + @Override + public void run() { + if (downloadListener != null) { + downloadListener.onSuccess(result); + } + } + }); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + System.err.println("下载错误:" + ex.getMessage()); + if (downloadListener != null) { + downloadListener.onError(ex, isOnCallback); + } + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + + } + + @Override + public void onWaiting() { + + } + + @Override + public void onStarted() { + if (downloadListener != null) { + downloadListener.onStarted(); + } + } + + @Override + public void onLoading(final long total, final long current, final boolean isDownloading) { + x.task().post(new Runnable() { + @Override + public void run() { + if (downloadListener != null) { + downloadListener.onLoading(total, current, isDownloading); + } + } + }); + } + }); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/api/HttpUtils.java b/app/src/main/java/com/hjq/demo/api/HttpUtils.java new file mode 100644 index 00000000..7824644e --- /dev/null +++ b/app/src/main/java/com/hjq/demo/api/HttpUtils.java @@ -0,0 +1,369 @@ +package com.hjq.demo.api; + +import org.xutils.common.Callback; +import org.xutils.http.RequestParams; +import org.xutils.x; + +import java.io.File; +import java.util.Map; + + +public class HttpUtils { + + + /** + * 异步get请求 + * + * @param callback + */ + public static void get(RequestParams params, final XCallBack callback) { + + x.http().get(params, new Callback.CommonCallback() { + + @Override + public void onSuccess(String result) { + + onSuccessResponse(result, callback); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + callback.onError(); + System.err.println("网络请求出错:" + ex.getMessage()); + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + onFinishedResponse(callback); + } + }); + + } + + /** + * 异步post请求 + * + * @param callback + */ + public static void post(RequestParams params, final XCallBack callback) { + + x.http().post(params, new Callback.CommonCallback() { + + @Override + public void onSuccess(String result) { + onSuccessResponse(result, callback); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + callback.onError(); + System.err.println("网络请求出错:" + ex.getMessage()); + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + onFinishedResponse(callback); + } + }); + } + + + /** + * 带缓存数据的异步 get请求 + * + * @param pnewCache + * @param callback + */ + public static void getCache(RequestParams params, final boolean pnewCache, final XCallBack callback) { + + x.http().get(params, new Callback.CacheCallback() { + @Override + public void onSuccess(String result) { + onSuccessResponse(result, callback); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + callback.onError(); + System.err.println("网络请求出错:" + ex.getMessage()); + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + onFinishedResponse(callback); + } + + @Override + public boolean onCache(String result) { + onSuccessResponse(result, callback); + return pnewCache; + } + }); + } + + public static void getCache(RequestParams params, final XCallBack callback) { + getCache(params, false, callback); + } + + // 得到缓存数据, 缓存过期后不会进入这个方法. + // 如果服务端没有返回过期时间, 参考params.setCacheMaxAge(maxAge)方法. + // + // * 客户端会根据服务端返回的 header 中 max-age 或 expires 来确定本地缓存是否给 onCache 方法. + // 如果服务端没有返回 max-age 或 expires, 那么缓存将一直保存, 除非这里自己定义了返回false的 + // 逻辑, 那么xUtils将请求新数据, 来覆盖它. + // + // * 如果信任该缓存返回 true, 将不再请求网络; + // 返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息, + // 如果服务端返回304, 则表示数据没有更新, 不继续加载数据. + + /** + * 带缓存数据的异步 post请求 + * + * @param pnewCache + * @param callback + */ + public static void postCache(RequestParams params, final boolean pnewCache, final XCacheCallBack callback) { + + x.http().post(params, new Callback.CacheCallback() { + @Override + public void onSuccess(final String result) { + // 注意: 如果服务返回304 或 onCache 选择了信任缓存, 这时result为null. + x.task().post(new Runnable() { + @Override + public void run() { + if (callback != null) { + callback.onSuccess(result, false); + } + } + }); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + callback.onError(); + System.err.println("网络请求出错:" + ex.getMessage()); + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + + @Override + public void onFinished() { + x.task().post(new Runnable() { + @Override + public void run() { + if (callback != null) { + callback.onFinished(); + } + } + }); + } + + @Override + public boolean onCache(final String result) { + x.task().post(new Runnable() { + @Override + public void run() { + if (callback != null) { + callback.onSuccess(result, true); + } + } + }); + return pnewCache; // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据. + } + }); + } + + //先显示缓存再更新 + public static void postCache(RequestParams params, final XCacheCallBack callback) { + postCache(params, false, callback); + } + + + /** + * 文件上传 + * + * @param file + * @param callback + */ + public static void upLoadFile(RequestParams params, Map file, final XCallBack callback) { + if (file != null) { + for (Map.Entry entry : file.entrySet()) { + params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile()); + } + } + // 有上传文件时使用multipart表单, 否则上传原始文件流. + params.setMultipart(true); + x.http().post(params, new Callback.CommonCallback() { + @Override + public void onSuccess(String result) { + onSuccessResponse(result, callback); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + callback.onError(); + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + onFinishedResponse(callback); + } + }); + + } + + + /** + * 文件下载 + * + * @param callBack + */ + public static void downLoadFile(RequestParams params, String path, final XDownLoadCallBack callBack) { + + params.setAutoResume(true);// 断点续传 + params.setSaveFilePath(path); + x.http().get(params, new Callback.ProgressCallback() { + @Override + public void onSuccess(final File result) { + x.task().post(new Runnable() { + @Override + public void run() { + if (callBack != null) { + callBack.onResponse(result); + } + } + }); + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + x.task().post(new Runnable() { + @Override + public void run() { + if (callBack != null) { + callBack.onFinished(); + } + } + }); + } + + @Override + public void onWaiting() { + + } + + @Override + public void onStarted() { + + } + + @Override + public void onLoading(final long total, final long current, final boolean isDownloading) { + x.task().post(new Runnable() { + @Override + public void run() { + if (callBack != null) { + callBack.onLoading(total, current, isDownloading); + } + } + }); + } + }); + + } + + /** + * 异步get请求返回结果,json字符串 + * + * @param result + * @param callBack + */ + private static void onSuccessResponse(final String result, final XCallBack callBack) { + //运行在UI线程,同时还有个x.task().run() 则是异步任务 + x.task().post(new Runnable() { + @Override + public void run() { + if (callBack != null) { + callBack.onSuccess(result); + } + } + }); + } + + private static void onFinishedResponse(final XCallBack callBack) { + //运行在UI线程,同时还有个x.task().run() 则是异步任务 + x.task().post(new Runnable() { + @Override + public void run() { + if (callBack != null) { + callBack.onFinished(); + } + } + }); + } + + + //区别返回的是缓存还是新数据 + public interface XCacheCallBack { + void onSuccess(String result, boolean isCache);//true是缓存数据,false是服务器数据 + + void onError(); + + void onFinished(); + + } + + public interface XCallBack { + void onSuccess(String result); + + void onError(); + + void onFinished(); + + } + + + public interface XDownLoadCallBack { + void onResponse(File result); + + void onLoading(long total, long current, boolean isDownloading); + + void onFinished(); + } + + +} diff --git a/app/src/main/java/com/hjq/demo/bean/Appversion.java b/app/src/main/java/com/hjq/demo/bean/Appversion.java new file mode 100644 index 00000000..84263993 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/bean/Appversion.java @@ -0,0 +1,86 @@ +package com.hjq.demo.bean; + +import java.io.Serializable; + +public class Appversion implements Serializable { + private String id; + // 假版本 + private int jiaVersion; + // 版本 + private int version; + // 修改描述 + private String upDes; + // 强制更新 + private String mustup; + // 下载路径 + private String downUrl; + // 文件完整性验证码 + private String apkMd5; + //APK文件名 + private String apkName; + + public String getApkMd5() { + return apkMd5; + } + + public void setApkMd5(String apkMd5) { + this.apkMd5 = apkMd5; + } + + public String getApkName() { + return apkName; + } + + public void setApkName(String apkName) { + this.apkName = apkName; + } + + public int getJiaVersion() { + return jiaVersion; + } + + public void setJiaVersion(int jiaVersion) { + this.jiaVersion = jiaVersion; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public String getUpDes() { + return upDes; + } + + public void setUpDes(String upDes) { + this.upDes = upDes; + } + + public String getMustup() { + return mustup; + } + + public void setMustup(String mustup) { + this.mustup = mustup; + } + + public String getDownUrl() { + return downUrl; + } + + public void setDownUrl(String downUrl) { + this.downUrl = downUrl; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +} diff --git a/app/src/main/java/com/hjq/demo/bean/User.java b/app/src/main/java/com/hjq/demo/bean/User.java new file mode 100644 index 00000000..718999bf --- /dev/null +++ b/app/src/main/java/com/hjq/demo/bean/User.java @@ -0,0 +1,721 @@ +package com.hjq.demo.bean; + +import android.content.Context; + +import com.hjq.baselibrary.utils.SettingConfig; + +import java.math.BigDecimal; + +public class User { + private static User user; + + private Integer id; + + private String pid; + + private String openId; + + private String unionid; + + private String imei; + + private String userCode; + /** + * @Fields niname : TODO(昵称) + */ + private String niName; + /** + * @Fields photo : TODO(头像) + */ + private String photo; + /** + * @Fields phone : TODO(电话) + */ + private String phone; + /** + * @Fields sex : TODO(性别,1男性,2女性,0未知) + */ + private String sex; + /** + * @Fields alipay : TODO(支付宝账号) + */ + private String alipay; + /** + * @Fields uname : TODO(真实姓名) + */ + private String uname; + /** + * @Fields todMoney : TODO(今日收益) + */ + private BigDecimal todMoney; + /** + * @Fields todMoney : TODO(今日收益,1上升,0下降) + */ + private String todShengTag; + /** + * @Fields yuMoney : TODO(余额) + */ + private BigDecimal yuMoney; + /** + * @Fields totMoney : TODO(累计收益) + */ + private BigDecimal totMoney; + /** + * @Fields payMoney : TODO(花费总数) + */ + private BigDecimal payMoney; + /** + * @Fields payNum : TODO(花钱笔数) + */ + private Integer payNum; + /** + * @Fields totTiMoney : TODO(累计提现金额) + */ + private String totTiMoney; + /** + * @Fields nianLv : TODO(年华率) + */ + private BigDecimal nianLv; + /** + * @Fields bangWx : TODO(绑定微信账号,1已绑定,0未绑定) + */ + private String bangWx; + /** + * @Fields qrCodeUrl : TODO(分享二维码) + */ + private String qrCodeUrl; + /** + * @Fields popTi : TODO(提示框) + */ + private String popTi; + /** + * @Fields fuPop : TODO(浮动框:1显示,0不显示) + */ + private String fuPop; + /** + * @Fields fuPopImg : TODO(浮动框图片) + */ + private String fuPopImg; + /** + * @Fields fuPopUrl : TODO(浮动框链接) + */ + private String fuPopUrl; + /** + * @Fields friPing : TODO(好友邀请) + */ + private String friPing; + /** + * @Fields friPingTag : TODO(好友邀请,1升高,0降低) + */ + private String friPingTag; + /** + * @Fields xiaoPing : TODO(消费能力) + */ + private String xiaoPing; + /** + * @Fields xiaoPingTag : TODO(消费能力,1升高,0降低) + */ + private String xiaoPingTag; + /** + * @Fields sharePing : TODO(分享能力) + */ + private String sharePing; + /** + * @Fields sharePingTag : TODO(分享能力,1升高,0降低) + */ + private String sharePingTag; + /** + * @Fields usePing : TODO(使用频率) + */ + private String usePing; + /** + * @Fields usePingTag : TODO(使用频率,1升高,0降低) + */ + private String usePingTag; + /** + * @Fields shopPing : TODO(购物行为) + */ + private String shopPing; + /** + * @Fields shopPingTag : TODO(购物行为,1升高,0降低) + */ + private String shopPingTag; + /** + * @Fields duiAdvImg : TODO(兑换界面广告图片) + */ + private String duiAdvImg; + /** + * @Fields duiAdvUrl : TODO(兑换界面广告链接) + */ + private String duiAdvUrl; + /** + * @Fields daiCunMoney : TODO(待存入金额) + */ + private Float daiCunMoney; + /** + * @Fields xinrenHongbao : TODO(新人红包:1表示新人红包 0表示每日红包) + */ + private String xinrenHongbao; + /** + * @Fields hongbaoState : TODO(每日红包状态: 1表示可以领取 2表示已领取过 3表示没有可以领取的红包 4表示已拆未领取(此时红包金额不为空)) + */ + private String hongbaoState; + /** + * @Fields hongbaoState : TODO(每日红包金额) + */ + private String hongbaoMoney; + /** + * @Fields member : TODO(会员等级: 0初级会员 1待审核超级会员 2超级会员 3运营商) + */ + private String member; + /** + * @Fields tuNum : TODO(直属粉丝数量) + */ + private int tuNum; + /** + * @Fields tutuNum : TODO(推荐粉丝数量) + */ + private int tutuNum; + /** + * @Fields createTime : TODO(创建时间) + */ + private String createTime; + /** + * @Fields goleLingquTime : TODO(领取金币时间) + */ + private String goleLingquTime; + /** + * @Fields singInState : TODO(签到状态 0:未签到 1:已签到) + */ + private String singInState; + + public static User getInstance(Context context) { + if (user == null) { + user = new User(); + String id = SettingConfig.getInstance(context).getStringPreference("id", "0"); + if (id == null || id.length() == 0) { + id = "0"; + } + user.setId(Integer.parseInt(id)); + user.setPid(SettingConfig.getInstance(context).getStringPreference("pid", "")); + user.setOpenId(SettingConfig.getInstance(context).getStringPreference("openId", "")); + user.setUnionid(SettingConfig.getInstance(context).getStringPreference("unionid", "")); + user.setImei(SettingConfig.getInstance(context).getStringPreference("imei", "")); + user.setUserCode(SettingConfig.getInstance(context).getStringPreference("userCode", "")); + user.setNiName(SettingConfig.getInstance(context).getStringPreference("niName", "")); + user.setPhoto(SettingConfig.getInstance(context).getStringPreference("photo", "")); + user.setPhone(SettingConfig.getInstance(context).getStringPreference("phone", "")); + user.setAlipay(SettingConfig.getInstance(context).getStringPreference("alipay", "")); + user.setUname(SettingConfig.getInstance(context).getStringPreference("uname", "")); + user.setSex(SettingConfig.getInstance(context).getStringPreference("sex", "")); + user.setTodMoney(new BigDecimal(SettingConfig.getInstance(context).getStringPreference("todMoney", "0"))); + user.setYuMoney(new BigDecimal(SettingConfig.getInstance(context).getStringPreference("yuMoney", "0"))); + user.setTotMoney(new BigDecimal(SettingConfig.getInstance(context).getStringPreference("totMoney", "0"))); + user.setPayMoney(new BigDecimal(SettingConfig.getInstance(context).getStringPreference("payMoney", "0"))); + user.setPayNum((int) (SettingConfig.getInstance(context).getStringPreference("payNum", 0))); + user.setTotTiMoney(SettingConfig.getInstance(context).getStringPreference("totTiMoney", "0")); + user.setNianLv(new BigDecimal(SettingConfig.getInstance(context).getStringPreference("nianLv", "0"))); + user.setBangWx(SettingConfig.getInstance(context).getStringPreference("bangWx", "")); + user.setQrCodeUrl(SettingConfig.getInstance(context).getStringPreference("qrCodeUrl", "")); + user.setPopTi(SettingConfig.getInstance(context).getStringPreference("popTi", "0")); + user.setFuPop(SettingConfig.getInstance(context).getStringPreference("fuPop", "0")); + user.setFuPopImg(SettingConfig.getInstance(context).getStringPreference("fuPopImg", "")); + user.setFuPopUrl(SettingConfig.getInstance(context).getStringPreference("fuPopUrl", "")); + user.setTodShengTag(SettingConfig.getInstance(context).getStringPreference("todShengTag", "")); + user.setFriPing(SettingConfig.getInstance(context).getStringPreference("friPing", "")); + user.setFriPingTag(SettingConfig.getInstance(context).getStringPreference("friPingTag", "")); + user.setXiaoPing(SettingConfig.getInstance(context).getStringPreference("xiaoPing", "")); + user.setXiaoPingTag(SettingConfig.getInstance(context).getStringPreference("xiaoPingTag", "")); + user.setSharePing(SettingConfig.getInstance(context).getStringPreference("sharePing", "")); + user.setSharePingTag(SettingConfig.getInstance(context).getStringPreference("sharePingTag", "")); + user.setUsePing(SettingConfig.getInstance(context).getStringPreference("usePing", "")); + user.setUsePingTag(SettingConfig.getInstance(context).getStringPreference("usePingTag", "")); + user.setShopPing(SettingConfig.getInstance(context).getStringPreference("shopPing", "")); + user.setShopPingTag(SettingConfig.getInstance(context).getStringPreference("shopPingTag", "")); + user.setDuiAdvImg(SettingConfig.getInstance(context).getStringPreference("duiAdvImg", "")); + user.setDuiAdvUrl(SettingConfig.getInstance(context).getStringPreference("duiAdvUrl", "")); + user.setDaiCunMoney(SettingConfig.getInstance(context).getStringPreference("daiCunMoney", 0)); + user.setXinrenHongbao(SettingConfig.getInstance(context).getStringPreference("xinrenHongbao", "")); + user.setHongbaoState(SettingConfig.getInstance(context).getStringPreference("hongbaoState", "")); + user.setHongbaoMoney(SettingConfig.getInstance(context).getStringPreference("hongbaoMoney", "")); + user.setMember(SettingConfig.getInstance(context).getStringPreference("member", "0")); + user.setCreateTime(SettingConfig.getInstance(context).getStringPreference("createTime", "")); + user.setTuNum((int) SettingConfig.getInstance(context).getStringPreference("tuNum", 0)); + user.setTutuNum((int) SettingConfig.getInstance(context).getStringPreference("tutuNum", 0)); + user.setGoleLingquTime(SettingConfig.getInstance(context).getStringPreference("goleLingquTime", "1970-01-01 00:00:00")); + user.setSingInState(SettingConfig.getInstance(context).getStringPreference("singInState", "")); + } + return user; + } + + //登录 + public static void userLogin(Context context, User userLog) { + SettingConfig.getInstance(context).setStringPreference("id", String.valueOf(userLog.getId())); + SettingConfig.getInstance(context).setStringPreference("pid", userLog.getPid()); + SettingConfig.getInstance(context).setStringPreference("openId", userLog.getOpenId()); + SettingConfig.getInstance(context).setStringPreference("unionid", userLog.getUnionid()); + SettingConfig.getInstance(context).setStringPreference("imei", userLog.getImei()); + SettingConfig.getInstance(context).setStringPreference("userCode", userLog.getUserCode()); + SettingConfig.getInstance(context).setStringPreference("niName", userLog.getNiName()); + SettingConfig.getInstance(context).setStringPreference("photo", userLog.getPhoto()); + SettingConfig.getInstance(context).setStringPreference("phone", userLog.getPhone()); + SettingConfig.getInstance(context).setStringPreference("alipay", userLog.getAlipay()); + SettingConfig.getInstance(context).setStringPreference("uname", userLog.getUname()); + SettingConfig.getInstance(context).setStringPreference("sex", userLog.getSex()); + SettingConfig.getInstance(context).setStringPreference("todMoney", userLog.getTodMoney().toString()); + SettingConfig.getInstance(context).setStringPreference("yuMoney", userLog.getYuMoney().toString()); + SettingConfig.getInstance(context).setStringPreference("totMoney", userLog.getTotMoney().toString()); + SettingConfig.getInstance(context).setStringPreference("payMoney", userLog.getPayMoney().toString()); + SettingConfig.getInstance(context).setStringPreference("payNum", userLog.getPayNum()); + SettingConfig.getInstance(context).setStringPreference("totTiMoney", userLog.getTotTiMoney()); + SettingConfig.getInstance(context).setStringPreference("nianLv", userLog.getNianLv().toString()); + SettingConfig.getInstance(context).setStringPreference("bangWx", userLog.getBangWx()); + SettingConfig.getInstance(context).setStringPreference("qrCodeUrl", userLog.getQrCodeUrl()); + SettingConfig.getInstance(context).setStringPreference("popTi", userLog.getPopTi()); + SettingConfig.getInstance(context).setStringPreference("fuPop", userLog.getFuPop()); + SettingConfig.getInstance(context).setStringPreference("fuPopImg", userLog.getFuPopImg()); + SettingConfig.getInstance(context).setStringPreference("fuPopUrl", userLog.getFuPopUrl()); + SettingConfig.getInstance(context).setStringPreference("todShengTag", userLog.getTodShengTag()); + SettingConfig.getInstance(context).setStringPreference("friPing", userLog.getFriPing()); + SettingConfig.getInstance(context).setStringPreference("friPingTag", userLog.getFriPingTag()); + SettingConfig.getInstance(context).setStringPreference("xiaoPing", userLog.getXiaoPing()); + SettingConfig.getInstance(context).setStringPreference("xiaoPingTag", userLog.getXiaoPingTag()); + SettingConfig.getInstance(context).setStringPreference("sharePing", userLog.getSharePing()); + SettingConfig.getInstance(context).setStringPreference("sharePingTag", userLog.getSharePingTag()); + SettingConfig.getInstance(context).setStringPreference("usePing", userLog.getUsePing()); + SettingConfig.getInstance(context).setStringPreference("usePingTag", userLog.getUsePingTag()); + SettingConfig.getInstance(context).setStringPreference("shopPing", userLog.getShopPing()); + SettingConfig.getInstance(context).setStringPreference("shopPingTag", userLog.getShopPingTag()); + SettingConfig.getInstance(context).setStringPreference("duiAdvImg", userLog.getDuiAdvImg()); + SettingConfig.getInstance(context).setStringPreference("duiAdvUrl", userLog.getDuiAdvUrl()); + SettingConfig.getInstance(context).setStringPreference("daiCunMoney", userLog.getDaiCunMoney()); + SettingConfig.getInstance(context).setStringPreference("xinrenHongbao", userLog.getXinrenHongbao()); + SettingConfig.getInstance(context).setStringPreference("hongbaoState", userLog.getHongbaoState()); + SettingConfig.getInstance(context).setStringPreference("hongbaoMoney", userLog.getHongbaoMoney()); + SettingConfig.getInstance(context).setStringPreference("member", userLog.getMember()); + SettingConfig.getInstance(context).setStringPreference("createTime", userLog.getCreateTime()); + SettingConfig.getInstance(context).setStringPreference("tuNum", userLog.getTuNum()); + SettingConfig.getInstance(context).setStringPreference("tutuNum", userLog.getTutuNum()); + SettingConfig.getInstance(context).setStringPreference("goleLingquTime", userLog.getGoleLingquTime()); + SettingConfig.getInstance(context).setStringPreference("singInState", userLog.getSingInState()); + user = null; + } + + //退出登录 + public static void userOutLogin(Context context) { + SettingConfig.getInstance(context).setStringPreference("id", "0"); + SettingConfig.getInstance(context).setStringPreference("openId", ""); + SettingConfig.getInstance(context).setStringPreference("unionid", ""); + SettingConfig.getInstance(context).setStringPreference("imei", ""); + SettingConfig.getInstance(context).setStringPreference("userCode", ""); + SettingConfig.getInstance(context).setStringPreference("niName", ""); + SettingConfig.getInstance(context).setStringPreference("photo", "http://app.yuetaobuy.com/ctaobao/file/icon.png"); + SettingConfig.getInstance(context).setStringPreference("todMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("yuMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("totMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("payMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("payNum", 0); + SettingConfig.getInstance(context).setStringPreference("totTiMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("nianLv", "0"); + SettingConfig.getInstance(context).setStringPreference("fuPop", "0"); + SettingConfig.getInstance(context).setStringPreference("todShengTag", ""); + SettingConfig.getInstance(context).setStringPreference("mianTag", ""); + SettingConfig.getInstance(context).setStringPreference("daiCunMoney", 0); + SettingConfig.getInstance(context).setStringPreference("xinrenHongbao", ""); + SettingConfig.getInstance(context).setStringPreference("hongbaoState", ""); + SettingConfig.getInstance(context).setStringPreference("hongbaoMoney", ""); + SettingConfig.getInstance(context).setStringPreference("member", "0"); + SettingConfig.getInstance(context).setStringPreference("orderNum", 0); + SettingConfig.getInstance(context).setStringPreference("memberMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("memberMonMoney", "0"); + SettingConfig.getInstance(context).setStringPreference("goleLingquTime", "1970-01-01 00:00:00"); + SettingConfig.getInstance(context).setStringPreference("singInState", ""); + + user = null; + + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId == null ? null : openId.trim(); + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei == null ? null : imei.trim(); + } + + public String getUserCode() { + return userCode; + } + + public void setUserCode(String userCode) { + this.userCode = userCode == null ? null : userCode.trim(); + } + + public String getNiName() { + return niName; + } + + public void setNiName(String niName) { + this.niName = niName == null ? null : niName.trim(); + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo == null ? null : photo.trim(); + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone == null ? null : phone.trim(); + } + + public String getAlipay() { + return alipay; + } + + public void setAlipay(String alipay) { + this.alipay = alipay == null ? null : alipay.trim(); + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname == null ? null : uname.trim(); + } + + public BigDecimal getTodMoney() { + return todMoney.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setTodMoney(BigDecimal todMoney) { + this.todMoney = todMoney; + } + + public BigDecimal getYuMoney() { + return yuMoney.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setYuMoney(BigDecimal yuMoney) { + this.yuMoney = yuMoney; + } + + public BigDecimal getTotMoney() { + return totMoney.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setTotMoney(BigDecimal totMoney) { + this.totMoney = totMoney; + } + + public BigDecimal getPayMoney() { + return payMoney; + } + + public void setPayMoney(BigDecimal payMoney) { + this.payMoney = payMoney; + } + + public BigDecimal getNianLv() { + return nianLv; + } + + public void setNianLv(BigDecimal nianLv) { + this.nianLv = nianLv; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public String getTotTiMoney() { + return totTiMoney; + } + + public void setTotTiMoney(String totTiMoney) { + this.totTiMoney = totTiMoney; + } + + public String getPopTi() { + return popTi; + } + + public void setPopTi(String popTi) { + this.popTi = popTi; + } + + public String getBangWx() { + return bangWx; + } + + public void setBangWx(String bangWx) { + this.bangWx = bangWx; + } + + public String getQrCodeUrl() { + return qrCodeUrl; + } + + public void setQrCodeUrl(String qrCodeUrl) { + this.qrCodeUrl = qrCodeUrl; + } + + public String getFuPop() { + return fuPop; + } + + public void setFuPop(String fuPop) { + this.fuPop = fuPop; + } + + public String getFuPopImg() { + return fuPopImg; + } + + public void setFuPopImg(String fuPopImg) { + this.fuPopImg = fuPopImg; + } + + public String getFuPopUrl() { + return fuPopUrl; + } + + public void setFuPopUrl(String fuPopUrl) { + this.fuPopUrl = fuPopUrl; + } + + public String getFriPing() { + return friPing; + } + + public void setFriPing(String friPing) { + this.friPing = friPing; + } + + public String getFriPingTag() { + return friPingTag; + } + + public void setFriPingTag(String friPingTag) { + this.friPingTag = friPingTag; + } + + public String getXiaoPing() { + return xiaoPing; + } + + public void setXiaoPing(String xiaoPing) { + this.xiaoPing = xiaoPing; + } + + public String getXiaoPingTag() { + return xiaoPingTag; + } + + public void setXiaoPingTag(String xiaoPingTag) { + this.xiaoPingTag = xiaoPingTag; + } + + public String getSharePing() { + return sharePing; + } + + public void setSharePing(String sharePing) { + this.sharePing = sharePing; + } + + public String getSharePingTag() { + return sharePingTag; + } + + public void setSharePingTag(String sharePingTag) { + this.sharePingTag = sharePingTag; + } + + public String getUsePing() { + return usePing; + } + + public void setUsePing(String usePing) { + this.usePing = usePing; + } + + public String getUsePingTag() { + return usePingTag; + } + + public void setUsePingTag(String usePingTag) { + this.usePingTag = usePingTag; + } + + public String getShopPing() { + return shopPing; + } + + public void setShopPing(String shopPing) { + this.shopPing = shopPing; + } + + public String getShopPingTag() { + return shopPingTag; + } + + public void setShopPingTag(String shopPingTag) { + this.shopPingTag = shopPingTag; + } + + public String getTodShengTag() { + return todShengTag; + } + + public void setTodShengTag(String todShengTag) { + this.todShengTag = todShengTag; + } + + public String getDuiAdvImg() { + return duiAdvImg; + } + + public void setDuiAdvImg(String duiAdvImg) { + this.duiAdvImg = duiAdvImg; + } + + public String getDuiAdvUrl() { + return duiAdvUrl; + } + + public void setDuiAdvUrl(String duiAdvUrl) { + this.duiAdvUrl = duiAdvUrl; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Float getDaiCunMoney() { + return daiCunMoney; + } + + public void setDaiCunMoney(Float daiCunMoney) { + this.daiCunMoney = daiCunMoney; + } + + public String getXinrenHongbao() { + return xinrenHongbao; + } + + public void setXinrenHongbao(String xinrenHongbao) { + this.xinrenHongbao = xinrenHongbao; + } + + public String getHongbaoState() { + return hongbaoState; + } + + public void setHongbaoState(String hongbaoState) { + this.hongbaoState = hongbaoState; + } + + public String getHongbaoMoney() { + return hongbaoMoney; + } + + public void setHongbaoMoney(String hongbaoMoney) { + this.hongbaoMoney = hongbaoMoney; + } + + public String getMember() { + return member; + } + + public void setMember(String member) { + this.member = member; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getTuNum() { + return tuNum; + } + + public void setTuNum(int tuNum) { + this.tuNum = tuNum; + } + + public int getTutuNum() { + return tutuNum; + } + + public void setTutuNum(int tutuNum) { + this.tutuNum = tutuNum; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } + + public String getGoleLingquTime() { + return goleLingquTime; + } + + public void setGoleLingquTime(String goleLingquTime) { + this.goleLingquTime = goleLingquTime; + } + + public String getSingInState() { + return singInState; + } + + public void setSingInState(String singInState) { + this.singInState = singInState; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/common/CommonActivity.java b/app/src/main/java/com/hjq/demo/common/CommonActivity.java index 8cf2ffbe..9413183a 100644 --- a/app/src/main/java/com/hjq/demo/common/CommonActivity.java +++ b/app/src/main/java/com/hjq/demo/common/CommonActivity.java @@ -1,25 +1,26 @@ package com.hjq.demo.common; +import android.app.Activity; import android.content.pm.ActivityInfo; import android.view.View; import com.hjq.bar.OnTitleBarListener; import com.hjq.bar.TitleBar; import com.umeng.analytics.MobclickAgent; +import com.umeng.message.PushAgent; -import butterknife.ButterKnife; -import butterknife.Unbinder; +import org.xutils.x; /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 项目中的Activity基类 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 项目中的Activity基类 */ -public abstract class CommonActivity extends UIActivity - implements OnTitleBarListener { +public abstract class CommonActivity extends UIActivity implements OnTitleBarListener { + + public Activity thisAct; - private Unbinder mButterKnife;//View注解 @Override public void init() { @@ -31,8 +32,10 @@ public void init() { } } - mButterKnife = ButterKnife.bind(this); - + x.view().inject(this); + thisAct = this; + MobclickAgent.onEvent(thisAct, getClass().getSimpleName()); + PushAgent.getInstance(thisAct).onAppStart(); initOrientation(); super.init(); @@ -43,8 +46,12 @@ public void init() { */ protected void initOrientation() { //如果没有指定屏幕方向,则默认为竖屏 - if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + try { + if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } + } catch (Exception e) { + e.printStackTrace(); } } @@ -69,8 +76,12 @@ public void setTitle(CharSequence title) { } protected TitleBar getTitleBar() { - if (getTitleBarId() > 0 && findViewById(getTitleBarId()) instanceof TitleBar) { - return findViewById(getTitleBarId()); + try { + if (getTitleBarId() > 0 && findViewById(getTitleBarId()) instanceof TitleBar) { + return findViewById(getTitleBarId()); + } + } catch (Exception e) { + e.printStackTrace(); } return null; } @@ -98,13 +109,15 @@ public void onLeftClick(View v) { * 标题栏中间的View被点击了 */ @Override - public void onTitleClick(View v) {} + public void onTitleClick(View v) { + } /** * 标题栏右边的View被点击了 */ @Override - public void onRightClick(View v) {} + public void onRightClick(View v) { + } @Override protected void onResume() { @@ -124,9 +137,5 @@ protected void onPause() { MobclickAgent.onPause(this); } - @Override - protected void onDestroy() { - super.onDestroy(); - if (mButterKnife != null) mButterKnife.unbind(); - } + } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/common/CommonApplication.java b/app/src/main/java/com/hjq/demo/common/CommonApplication.java index fddf50cc..6a18526f 100644 --- a/app/src/main/java/com/hjq/demo/common/CommonApplication.java +++ b/app/src/main/java/com/hjq/demo/common/CommonApplication.java @@ -1,24 +1,85 @@ package com.hjq.demo.common; +import android.content.Context; +import android.support.multidex.MultiDex; +import android.util.Log; + +import com.hjq.demo.Constant; import com.hjq.toast.ToastUtils; import com.umeng.analytics.MobclickAgent; +import com.umeng.commonsdk.UMConfigure; +import com.umeng.message.IUmengRegisterCallback; +import com.umeng.message.PushAgent; +import com.umeng.socialize.PlatformConfig; + +import org.xutils.x; /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 项目中的Activity基类 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 项目中的Activity基类 */ public class CommonApplication extends UIApplication { + private Context that; + @Override public void onCreate() { super.onCreate(); + that = this; + initXutils(); + initUmeng(); // 初始化吐司工具类 ToastUtils.init(getApplicationContext()); + + } + + //友盟 + void initUmeng() { + UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, null); + initAnalytics(); //统计 + initPush(); //推送 + //第三方登录分享 APPID, APPKEY + PlatformConfig.setWeixin(Constant.WXAPP_ID, Constant.WXAPP_SECRET); + PlatformConfig.setQQZone(Constant.QQAPP_ID, Constant.QQAPP_SECRET); + } + + void initAnalytics() { // 友盟统计 MobclickAgent.setScenarioType(getApplicationContext(), MobclickAgent.EScenarioType.E_UM_NORMAL); } + + void initPush() { + PushAgent mPushAgent = PushAgent.getInstance(this); + //注册推送服务,每次调用register方法都会回调该接口 + mPushAgent.register(new IUmengRegisterCallback() { + + @Override + public void onSuccess(String deviceToken) { + //注册成功会返回device token +// Log.d("deviceToken", "onSuccess: " + deviceToken); + } + + @Override + public void onFailure(String s, String s1) { + Log.d("deviceToken", "onFailure: " + s + "--" + s1); + } + }); + } + + void initXutils() { + x.Ext.init(this); + x.Ext.setDebug(false); // 是否输出debug日志, 开启debug会影响性能. + } + + // 解决函数超过65535时的分包问题 + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/common/CommonLazyFragment.java b/app/src/main/java/com/hjq/demo/common/CommonLazyFragment.java index 6e1e681c..b0a4bd66 100644 --- a/app/src/main/java/com/hjq/demo/common/CommonLazyFragment.java +++ b/app/src/main/java/com/hjq/demo/common/CommonLazyFragment.java @@ -8,23 +8,22 @@ import com.umeng.analytics.MobclickAgent; -import butterknife.ButterKnife; -import butterknife.Unbinder; +import org.xutils.x; /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 项目中Fragment懒加载基类 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 项目中Fragment懒加载基类 */ public abstract class CommonLazyFragment extends UILazyFragment { - private Unbinder mButterKnife;// View注解 @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); - mButterKnife = ButterKnife.bind(this, view); + x.view().inject(this, view); + MobclickAgent.onEvent(getContext(), getClass().getSimpleName()); return view; } @@ -42,9 +41,5 @@ public void onPause() { MobclickAgent.onPause(getContext()); } - @Override - public void onDestroy() { - super.onDestroy(); - mButterKnife.unbind(); - } + } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/tool/CommonMethod.java b/app/src/main/java/com/hjq/demo/tool/CommonMethod.java new file mode 100644 index 00000000..bb0b6568 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/tool/CommonMethod.java @@ -0,0 +1,55 @@ +package com.hjq.demo.tool; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.text.TextUtils; +import android.widget.ImageView; + +import com.hjq.baselibrary.listener.OnStringCallBack; +import com.squareup.picasso.Picasso; + +public class CommonMethod { + + //图片显示 + public static void displayImage(Context context, String url, ImageView imageView) { + Picasso.with(context).load(url).into(imageView); + } + + //文件上传 + public static void uploadFile(String uploadToken, String uploadFilePath, OnStringCallBack callBack) { + QiniuUtils.upload(uploadToken, uploadFilePath, callBack); + } + + + /** + * 获取AndroidManifest中指定的meta-data。本例中,调用方法时key就是UMENG_CHANNEL + * + * @return 如果没有获取成功(没有对应值 , 或者异常),则返回值为空 + */ + public static String getAppMetaData(Context ctx, String key) { + if (ctx == null || TextUtils.isEmpty(key)) { + return null; + } + + String resultData = null; + try { + PackageManager packageManager = ctx.getPackageManager(); + if (packageManager != null) { + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA); + if (applicationInfo != null) { + if (applicationInfo.metaData != null) { + resultData = applicationInfo.metaData.get(key) + ""; + } + } + + } + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + + return resultData; + } + + +} diff --git a/app/src/main/java/com/hjq/demo/tool/GifSizeFilter.java b/app/src/main/java/com/hjq/demo/tool/GifSizeFilter.java new file mode 100644 index 00000000..6c2f6404 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/tool/GifSizeFilter.java @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Zhihu Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hjq.demo.tool; + +import android.content.Context; +import android.graphics.Point; + +import com.hjq.demo.R; +import com.zhihu.matisse.MimeType; +import com.zhihu.matisse.filter.Filter; +import com.zhihu.matisse.internal.entity.IncapableCause; +import com.zhihu.matisse.internal.entity.Item; +import com.zhihu.matisse.internal.utils.PhotoMetadataUtils; + +import java.util.HashSet; +import java.util.Set; + +public class GifSizeFilter extends Filter { + + private int mMinWidth; + private int mMinHeight; + private int mMaxSize; + + public GifSizeFilter(int minWidth, int minHeight, int maxSizeInBytes) { + mMinWidth = minWidth; + mMinHeight = minHeight; + mMaxSize = maxSizeInBytes; + } + + @Override + public Set constraintTypes() { + return new HashSet() {{ + add(MimeType.GIF); + }}; + } + + @Override + public IncapableCause filter(Context context, Item item) { + if (!needFiltering(context, item)) + return null; + + Point size = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), item.getContentUri()); + if (size.x < mMinWidth || size.y < mMinHeight || item.size > mMaxSize) { + return new IncapableCause(IncapableCause.DIALOG, context.getString(R.string.error_gif, mMinWidth, + String.valueOf(PhotoMetadataUtils.getSizeInMB(mMaxSize)))); + } + return null; + } + +} diff --git a/app/src/main/java/com/hjq/demo/tool/PicassoUtils.java b/app/src/main/java/com/hjq/demo/tool/PicassoUtils.java new file mode 100644 index 00000000..79c6243a --- /dev/null +++ b/app/src/main/java/com/hjq/demo/tool/PicassoUtils.java @@ -0,0 +1,98 @@ +package com.hjq.demo.tool; + +import android.content.Context; +import android.graphics.Bitmap; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; + +import com.squareup.picasso.Picasso; +import com.squareup.picasso.Transformation; + +/** + * 图片加载工具 + * Created by 韩小呆 on 2017/12/10. + */ + +public class PicassoUtils { + /** + * 默认加载图片 + */ + public static void Display(Context context, String url, ImageView imageView) { + + Picasso.with(context).load(url).into(imageView); + } + + /** + * 从res文件内部加载图片 + */ + public static void Display(Context context, int resourceId, ImageView imageView) { + Picasso.with(context).load(resourceId).into(imageView); + } + + /** + * 网上加载指定图片大小的图片 + */ + public static void Display(Context context, String url, int width, int height, ImageView imageView) { + Picasso.with(context).load(url).resize(width, height).centerCrop().into(imageView); + } + + /** + * res文件内部加载指定大小图片 + */ + public static void Display(Context context, int id, int width, int height, ImageView imageView) { + Picasso.with(context).load(id).resize(width, height).centerCrop().into(imageView); + } + + /** + * 1、加载中图片,加载错误图片,加载正确图片并且设置 + * 2、当没有图片时,因此imageView + */ + public static void loadImageViewHolder(Context context, String url, int loadingImage, int loadingErrorImage, ImageView imageView) { + if (url != null && !TextUtils.isEmpty(url)) { + Picasso.with(context).load(url).placeholder(loadingImage).error(loadingErrorImage).into(imageView); + } else { + imageView.setVisibility(View.GONE); + } + + } + + public static void loadImageViewHolderSize(Context context, String url, int width, int height, int loadingImage, int loadingErrorImage, ImageView imageView) { + if (url != null && !TextUtils.isEmpty(url)) { + Picasso.with(context).load(url).resize(width, height).centerCrop().placeholder(loadingImage).error(loadingErrorImage).into(imageView); + } else { + imageView.setVisibility(View.GONE); + } + + } + + + /** + * 裁剪图片 + */ + public static void loadImageViewCrop(Context context, String url, ImageView imageView) { + Picasso.with(context).load(url).transform(new CropSquareTransformation()).into(imageView); + } + + /** + * 按比例裁剪图片 + */ + public static class CropSquareTransformation implements Transformation { + @Override + public Bitmap transform(Bitmap source) { + int size = Math.min(source.getWidth(), source.getHeight()); + int x = (source.getWidth() - size) / 2; + int y = (source.getHeight() - size) / 2; + Bitmap result = Bitmap.createBitmap(source, x, y, size, size); + if (result != source) { + source.recycle(); + } + return result; + } + + @Override + public String key() { + return "crop"; + } + } +} diff --git a/app/src/main/java/com/hjq/demo/tool/QiniuUtils.java b/app/src/main/java/com/hjq/demo/tool/QiniuUtils.java new file mode 100644 index 00000000..596b0c19 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/tool/QiniuUtils.java @@ -0,0 +1,115 @@ +package com.hjq.demo.tool; + +import android.util.Log; + +import com.hjq.baselibrary.listener.OnStringCallBack; +import com.hjq.baselibrary.utils.FileUtils; +import com.hjq.toast.ToastUtils; +import com.qiniu.android.common.FixedZone; +import com.qiniu.android.http.ResponseInfo; +import com.qiniu.android.storage.Configuration; +import com.qiniu.android.storage.UpCompletionHandler; +import com.qiniu.android.storage.UpProgressHandler; +import com.qiniu.android.storage.UploadManager; +import com.qiniu.android.storage.UploadOptions; +import com.qiniu.android.utils.AsyncRun; +import com.qiniu.android.utils.Etag; + +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; + +/** + * Created by AFeng on 2018/11/16. + */ +public class QiniuUtils { + + private QiniuUtils() { + } + + private static UploadManager uploadManager; + + + /** + * 上传文件 + * + * @param uploadToken 服务器token + * @param uploadFilePath 文件路径 + * @param callBack 返回文件网络路径 + */ + public static void upload(String uploadToken, String uploadFilePath, final OnStringCallBack callBack) { + upload(uploadToken, uploadFilePath, null, callBack); + } + + + /** + * 上传文件 + * + * @param uploadToken 服务器token + * @param uploadFilePath 文件路径 + * @param uploadFileKey 指定文件名 + * @param callBack 返回文件网络路径 + */ + public static void upload(String uploadToken, String uploadFilePath, String uploadFileKey, final OnStringCallBack callBack) { + if (uploadManager == null) { + Configuration config = new Configuration.Builder() + .chunkSize(512 * 1024) // 分片上传时,每片的大小。 默认256K + .putThreshhold(1024 * 1024) // 启用分片上传阀值。默认512K + .connectTimeout(10) // 链接超时。默认10秒 + .useHttps(true) // 是否使用https上传域名 + .responseTimeout(60) // 服务器响应超时。默认60秒 +// .recorder(null) // recorder分片上传时,已上传片记录器。默认null +// .recorder(recorder, keyGen) // keyGen 分片上传时,生成标识符,用于片记录器区分是那个文件的上传记录 + .zone(FixedZone.zone2) // 设置区域,指定不同区域的上传域名、备用域名、备用IP。 + .build(); + uploadManager = new UploadManager(config); + } + File uploadFile = new File(uploadFilePath); + UploadOptions uploadOptions = new UploadOptions(null, null, false, + new UpProgressHandler() { + @Override + public void progress(String key, double percent) { + //上传进度 + } + }, null); + + if (uploadFileKey == null) { + try { + uploadFileKey = Etag.file(uploadFile) + "." + FileUtils.getExtensionName(uploadFile); + Log.d("--respInfo", "getName: " + uploadFile.getName()); + Log.d("--respInfo", "getExtensionName: " + FileUtils.getExtensionName(uploadFile)); + } catch (IOException e) { + e.printStackTrace(); + } + } + uploadManager.put(uploadFile, uploadFileKey, uploadToken, + new UpCompletionHandler() { + @Override + public void complete(String key, ResponseInfo respInfo, JSONObject jsonData) { + Log.d("--respInfo", "complete: " + respInfo); + Log.d("--respInfo", "jsonData: " + jsonData); + Log.d("--respInfo", "key: " + key); + if (respInfo.isOK()) { + try { + String fileKey = jsonData.optString("key"); //文件名 +// String fileHash = jsonData.optString("hash"); + callBack.onCallBack(fileKey); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + AsyncRun.runInMain(new Runnable() { + @Override + public void run() { + ToastUtils.show("上传失败,请重试"); + } + }); + } + } + + }, uploadOptions); + } + + +} diff --git a/app/src/main/java/com/hjq/demo/tool/RichEditorUtils.java b/app/src/main/java/com/hjq/demo/tool/RichEditorUtils.java new file mode 100644 index 00000000..de88f086 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/tool/RichEditorUtils.java @@ -0,0 +1,68 @@ +package com.hjq.demo.tool; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.Base64; + +import java.io.ByteArrayOutputStream; + +/** + * Copyright (C) 2017 Wasabeef + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public final class RichEditorUtils { + + private RichEditorUtils() throws InstantiationException { + throw new InstantiationException("This class is not for instantiation"); + } + + public static String toBase64(Bitmap bitmap) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); + byte[] bytes = baos.toByteArray(); + + return Base64.encodeToString(bytes, Base64.NO_WRAP); + } + + public static Bitmap toBitmap(Drawable drawable) { + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + + int width = drawable.getIntrinsicWidth(); + width = width > 0 ? width : 1; + int height = drawable.getIntrinsicHeight(); + height = height > 0 ? height : 1; + + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + + return bitmap; + } + + public static Bitmap decodeResource(Context context, int resId) { + return BitmapFactory.decodeResource(context.getResources(), resId); + } + + public static long getCurrentTime() { + return System.currentTimeMillis(); + } +} diff --git a/app/src/main/java/com/hjq/demo/tool/SystemInfoUtils.java b/app/src/main/java/com/hjq/demo/tool/SystemInfoUtils.java new file mode 100644 index 00000000..9034c4cf --- /dev/null +++ b/app/src/main/java/com/hjq/demo/tool/SystemInfoUtils.java @@ -0,0 +1,26 @@ +package com.hjq.demo.tool; + +import android.content.Context; +import android.telephony.TelephonyManager; + +/** + * Created by AFeng on 2018/11/16. + */ +public class SystemInfoUtils { + + //获取本机IMEI + public static String getImei(Context context) { + TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + String imeiCode = ""; + + try { + imeiCode = manager.getDeviceId(); + } catch (Exception e) { + e.printStackTrace(); + } + return imeiCode; + } + + + +} diff --git a/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java index 979f4f6c..24a94db2 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java @@ -26,8 +26,5 @@ protected void initView() { } - @Override - protected void initData() { - } } diff --git a/app/src/main/java/com/hjq/demo/ui/activity/CopyActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/CopyActivity.java index 3c06f9fb..982993bb 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/CopyActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/CopyActivity.java @@ -26,8 +26,5 @@ protected void initView() { } - @Override - protected void initData() { - } } diff --git a/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java index 444f4a5d..55b1d086 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java @@ -12,21 +12,22 @@ import com.hjq.demo.ui.adapter.HomeViewPagerAdapter; import com.hjq.toast.ToastUtils; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; + /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 主页界面 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 主页界面 */ public class HomeActivity extends CommonActivity implements ViewPager.OnPageChangeListener, Runnable, BottomNavigationView.OnNavigationItemSelectedListener { - @BindView(R.id.vp_home_pager) + @ViewInject(R.id.vp_home_pager) ViewPager mViewPager; - @BindView(R.id.bv_home_navigation) + @ViewInject(R.id.bv_home_navigation) BottomNavigationView mBottomNavigationView; private HomeViewPagerAdapter mAdapter; @@ -51,10 +52,7 @@ protected void initView() { // 修复在 ViewPager 中点击 EditText 弹出软键盘导致 BottomNavigationView 还显示在 ViewPager 下面的问题 postDelayed(this, 1000); - } - @Override - protected void initData() { mAdapter = new HomeViewPagerAdapter(this); mViewPager.setAdapter(mAdapter); @@ -62,6 +60,7 @@ protected void initData() { mViewPager.setOffscreenPageLimit(mAdapter.getCount()); } + /** * {@link Runnable} */ @@ -84,7 +83,8 @@ public void run() { */ @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } @Override public void onPageSelected(int position) { @@ -105,7 +105,8 @@ public void onPageSelected(int position) { } @Override - public void onPageScrollStateChanged(int state) {} + public void onPageScrollStateChanged(int state) { + } /** * {@link BottomNavigationView.OnNavigationItemSelectedListener} diff --git a/app/src/main/java/com/hjq/demo/ui/activity/LauncherActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/LauncherActivity.java index 99b06dc1..91ccf780 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/LauncherActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/LauncherActivity.java @@ -1,5 +1,6 @@ package com.hjq.demo.ui.activity; +import android.os.Build; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.RotateAnimation; @@ -17,22 +18,22 @@ import java.util.List; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 启动界面 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 启动界面 -- 没有权限则申请,有的话就进入主页面 */ public class LauncherActivity extends CommonActivity implements OnPermission, Animation.AnimationListener { - @BindView(R.id.iv_launcher_bg) + @ViewInject(R.id.iv_launcher_bg) ImageView mImageView; - @BindView(R.id.iv_launcher_icon) + @ViewInject(R.id.iv_launcher_icon) ImageView mIconView; - @BindView(R.id.iv_launcher_name) + @ViewInject(R.id.iv_launcher_name) TextView mTextView; @Override @@ -55,11 +56,11 @@ protected void initView() { .hideBar(BarHide.FLAG_HIDE_STATUS_BAR)//隐藏状态栏 .transparentNavigationBar()//透明导航栏,不写默认黑色(设置此方法,fullScreen()方法自动为true) .init(); - } - @Override - protected void initData() {} + } + + //动画持续时间 private static final int ANIM_TIME = 1000; /** @@ -81,10 +82,18 @@ private void initStartAnim() { mTextView.startAnimation(ra); } + //自动申请权限 private void requestFilePermission() { - XXPermissions.with(this) - .permission(Permission.Group.STORAGE) - .request(this); + //必须设置 targetSdkVersion >= 23 才能正常检测权限 + if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M) { + XXPermissions.with(this) + .permission(Permission.Group.STORAGE) + .request(this); + } else { + startActivity(HomeActivity.class); + finish(); + } + } /** @@ -93,6 +102,7 @@ private void requestFilePermission() { @Override public void hasPermission(List granted, boolean isAll) { + //拥有权限后,跳转 startActivity(HomeActivity.class); finish(); } @@ -106,11 +116,14 @@ public void onBackPressed() { @Override protected void onRestart() { super.onRestart(); - if (XXPermissions.isHasPermission(LauncherActivity.this, Permission.Group.STORAGE)) { - hasPermission(null, true); - }else { - requestFilePermission(); + if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M) { + if (XXPermissions.isHasPermission(LauncherActivity.this, Permission.Group.STORAGE)) { + hasPermission(null, true); + } else { + requestFilePermission(); + } } + } @Override @@ -124,7 +137,7 @@ public void noPermission(List denied, boolean quick) { if (quick) { ToastUtils.show("没有权限访问文件,请手动授予权限"); XXPermissions.gotoPermissionSettings(LauncherActivity.this, true); - }else { + } else { ToastUtils.show("请先授予文件读写权限"); getWindow().getDecorView().postDelayed(new Runnable() { @Override @@ -140,7 +153,8 @@ public void run() { */ @Override - public void onAnimationStart(Animation animation) {} + public void onAnimationStart(Animation animation) { + } @Override public void onAnimationEnd(Animation animation) { @@ -148,7 +162,8 @@ public void onAnimationEnd(Animation animation) { } @Override - public void onAnimationRepeat(Animation animation) {} + public void onAnimationRepeat(Animation animation) { + } @Override diff --git a/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java index f0afaef2..ec084892 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java @@ -1,33 +1,47 @@ package com.hjq.demo.ui.activity; +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; import android.view.View; -import android.widget.Button; -import android.widget.EditText; +import android.widget.LinearLayout; -import com.hjq.baselibrary.utils.EditTextInputHelper; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.hjq.demo.Constant; import com.hjq.demo.R; +import com.hjq.demo.bean.User; import com.hjq.demo.common.CommonActivity; +import com.hjq.demo.tool.CommonMethod; +import com.hjq.demo.tool.SystemInfoUtils; +import com.hjq.demo.widget.LoadingDialog; import com.hjq.toast.ToastUtils; +import com.umeng.analytics.MobclickAgent; +import com.umeng.message.PushAgent; +import com.umeng.socialize.UMAuthListener; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareConfig; +import com.umeng.socialize.bean.SHARE_MEDIA; -import butterknife.BindView; +import org.xutils.common.Callback; +import org.xutils.http.RequestParams; +import org.xutils.view.annotation.Event; +import org.xutils.view.annotation.ViewInject; +import org.xutils.x; + +import java.util.Map; /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 登录界面 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 登录界面 */ -public class LoginActivity extends CommonActivity - implements View.OnClickListener { +public class LoginActivity extends CommonActivity { - @BindView(R.id.et_login_phone) - EditText mPhoneView; - @BindView(R.id.et_login_password) - EditText mPasswordView; - @BindView(R.id.btn_login_commit) - Button mCommitView; + @ViewInject(R.id.ll_loginWithQQ) + LinearLayout ll_loginWithQQ; - private EditTextInputHelper mEditTextInputHelper; @Override protected int getLayoutId() { @@ -36,31 +50,131 @@ protected int getLayoutId() { @Override protected int getTitleBarId() { - return R.id.tb_login_title; + return 0; } + @Override protected void initView() { - mCommitView.setOnClickListener(this); - mEditTextInputHelper = new EditTextInputHelper(mCommitView, false); - mEditTextInputHelper.addViews(mPhoneView, mPasswordView); + } - @Override - protected void initData() { + //微信登录 + @Event(R.id.ll_loginWithWX) + private void btnWxLoginClick(View v) { + MobclickAgent.onEvent(thisAct, "login_wx"); + UMShareConfig config = new UMShareConfig(); + config.isNeedAuthOnGetUserInfo(true); + UMShareAPI.get(this).setShareConfig(config); + UMShareAPI.get(this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.WEIXIN, authListener); } - @Override - public void onRightClick(View v) { - // 跳转到注册界面 - startActivity(RegisterActivity.class); + //QQ登录 + @Event(R.id.ll_loginWithQQ) + private void btnQQLogin(View v) { + MobclickAgent.onEvent(thisAct, "login_qq"); + UMShareConfig config = new UMShareConfig(); + config.isNeedAuthOnGetUserInfo(true); + UMShareAPI.get(this).setShareConfig(config); + UMShareAPI.get(this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ, authListener); } + + UMAuthListener authListener = new UMAuthListener() { + + + @Override + public void onStart(SHARE_MEDIA share_media) { + + } + + /** + * 授权成功的回调 + * @param share_media 平台名称 + * @param i 行为序号,开发者用不上 + * @param map 用户资料返回 + */ + @Override + public void onComplete(SHARE_MEDIA share_media, int i, Map map) { + Log.d("--login", "onComplete: " + map); + LoadingDialog.show(thisAct, ll_loginWithQQ); + RequestParams params = new RequestParams(Constant.DOMAIN + "user/appLogin"); + params.addBodyParameter("user.openId", map.get("openid")); + params.addBodyParameter("user.unionid", map.get("uid")); + params.addBodyParameter("user.imei", SystemInfoUtils.getImei(thisAct)); + params.addBodyParameter("user.niName", map.get("screen_name")); + String gender = map.get("gender"); + if (gender != null && gender.equals("男")) gender = "1"; + else if (gender != null && gender.equals("女")) gender = "2"; + else gender = "2"; + params.addBodyParameter("user.sex", gender); + params.addBodyParameter("user.country", map.get("country")); + params.addBodyParameter("user.province", map.get("province")); + params.addBodyParameter("user.city", map.get("city")); + params.addBodyParameter("user.photo", map.get("iconurl")); + params.addBodyParameter("user.packName", thisAct.getPackageName()); + String pushId = PushAgent.getInstance(thisAct).getRegistrationId(); + params.addBodyParameter("user.pushId", pushId); + params.addBodyParameter("user.loginType", share_media.name()); + String userChannel = CommonMethod.getAppMetaData(thisAct, "UMENG_CHANNEL"); + if (userChannel != null && userChannel.length() > 0) { + params.addBodyParameter("user.userChannel", userChannel); + } + x.http().post(params, new Callback.CommonCallback() { + @Override + public void onSuccess(String result) { + try { + if (!TextUtils.isEmpty(result)) { + User user = new Gson().fromJson(result, new TypeToken() { + }.getType()); + ToastUtils.show("登录成功"); + User.userLogin(thisAct, user); + finish(); + } else { + LoadingDialog.cancel(); + ToastUtils.show("登录失败,请重试"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onError(Throwable ex, boolean isOnCallback) { + ToastUtils.show("网络连接繁忙,请重试"); + } + + @Override + public void onCancelled(CancelledException cex) { + + } + + @Override + public void onFinished() { + LoadingDialog.cancel(); + } + + }); + } + + @Override + public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) { + + } + + @Override + public void onCancel(SHARE_MEDIA share_media, int i) { + + } + }; + + @Override - protected void onDestroy() { - mEditTextInputHelper.removeViews(); - super.onDestroy(); + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); + } @Override @@ -69,15 +183,5 @@ public boolean isSupportSwipeBack() { return !super.isSupportSwipeBack(); } - /** - * {@link View.OnClickListener} - */ - @Override - public void onClick(View v) { - if (v == mCommitView) { - if (mPhoneView.getText().toString().length() != 11) { - ToastUtils.show(getResources().getString(R.string.phone_input_error)); - } - } - } + } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java index 954dc376..8c04aa2d 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java @@ -10,7 +10,7 @@ import com.hjq.demo.common.CommonActivity; import com.hjq.toast.ToastUtils; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; /** * author : HJQ @@ -21,20 +21,20 @@ public class RegisterActivity extends CommonActivity implements View.OnClickListener { - @BindView(R.id.et_register_phone) + @ViewInject(R.id.et_register_phone) EditText mPhoneView; - @BindView(R.id.cv_register_countdown) + @ViewInject(R.id.cv_register_countdown) CountdownView mCountdownView; - @BindView(R.id.et_register_code) + @ViewInject(R.id.et_register_code) EditText mCodeView; - @BindView(R.id.et_register_password1) + @ViewInject(R.id.et_register_password1) EditText mPasswordView1; - @BindView(R.id.et_register_password2) + @ViewInject(R.id.et_register_password2) EditText mPasswordView2; - @BindView(R.id.btn_register_commit) + @ViewInject(R.id.btn_register_commit) Button mCommitView; private EditTextInputHelper mEditTextInputHelper; @@ -58,10 +58,6 @@ protected void initView() { mEditTextInputHelper.addViews(mPhoneView, mCodeView, mPasswordView1, mPasswordView2); } - @Override - protected void initData() { - - } /** * {@link View.OnClickListener} diff --git a/app/src/main/java/com/hjq/demo/ui/activity/RicheditorActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/RicheditorActivity.java new file mode 100644 index 00000000..035498f4 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/ui/activity/RicheditorActivity.java @@ -0,0 +1,363 @@ +package com.hjq.demo.ui.activity; + +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.graphics.Color; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import com.hjq.baselibrary.listener.OnStringCallBack; +import com.hjq.demo.R; +import com.hjq.demo.api.HttpUtils; +import com.hjq.demo.common.CommonActivity; +import com.hjq.demo.tool.CommonMethod; +import com.hjq.demo.tool.GifSizeFilter; +import com.hjq.demo.widget.RichEditor; +import com.zhihu.matisse.Matisse; +import com.zhihu.matisse.MimeType; +import com.zhihu.matisse.engine.impl.PicassoEngine; +import com.zhihu.matisse.filter.Filter; +import com.zhihu.matisse.internal.entity.CaptureStrategy; +import com.zhihu.matisse.listener.OnCheckedListener; +import com.zhihu.matisse.listener.OnSelectedListener; + +import org.json.JSONException; +import org.json.JSONObject; +import org.xutils.http.RequestParams; + +import java.util.List; + + +public class RicheditorActivity extends CommonActivity { + + private RichEditor mEditor; + private TextView mPreview; + + @Override + protected int getLayoutId() { + return R.layout.a_richeditor; + } + + @Override + protected int getTitleBarId() { + return 0; + } + + @Override + protected void initView() { + initLayout(); + } + + void initLayout() { + mEditor = (RichEditor) findViewById(R.id.editor); + mEditor.setEditorHeight(200); + mEditor.setEditorFontSize(22); + mEditor.setEditorFontColor(Color.RED); + //mEditor.setEditorBackgroundColor(Color.BLUE); + //mEditor.setBackgroundColor(Color.BLUE); + //mEditor.setBackgroundResource(R.drawable.bg); + mEditor.setPadding(10, 10, 10, 10); + //mEditor.setBackground("https://raw.githubusercontent.com/wasabeef/art/master/chip.jpg"); + mEditor.setPlaceholder("Insert text here..."); + //mEditor.setInputEnabled(false); + + mPreview = (TextView) findViewById(R.id.preview); + mEditor.setOnTextChangeListener(new RichEditor.OnTextChangeListener() { + @Override + public void onTextChange(String text) { + mPreview.setText(text); + } + }); + + findViewById(R.id.action_undo).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.undo(); + } + }); + + findViewById(R.id.action_redo).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.redo(); + } + }); + + findViewById(R.id.action_bold).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setBold(); + } + }); + + findViewById(R.id.action_italic).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setItalic(); + } + }); + + findViewById(R.id.action_subscript).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setSubscript(); + } + }); + + findViewById(R.id.action_superscript).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setSuperscript(); + } + }); + + findViewById(R.id.action_strikethrough).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setStrikeThrough(); + } + }); + + findViewById(R.id.action_underline).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setUnderline(); + } + }); + + findViewById(R.id.action_heading1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setHeading(1); + } + }); + + findViewById(R.id.action_heading2).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setHeading(2); + } + }); + + findViewById(R.id.action_heading3).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setHeading(3); + } + }); + + findViewById(R.id.action_heading4).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setHeading(4); + } + }); + + findViewById(R.id.action_heading5).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setHeading(5); + } + }); + + findViewById(R.id.action_heading6).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setHeading(6); + } + }); + + findViewById(R.id.action_txt_color).setOnClickListener(new View.OnClickListener() { + private boolean isChanged; + + @Override + public void onClick(View v) { + mEditor.setTextColor(isChanged ? Color.BLACK : Color.RED); + isChanged = !isChanged; + } + }); + + findViewById(R.id.action_bg_color).setOnClickListener(new View.OnClickListener() { + private boolean isChanged; + + @Override + public void onClick(View v) { + mEditor.setTextBackgroundColor(isChanged ? Color.TRANSPARENT : Color.YELLOW); + isChanged = !isChanged; + } + }); + + findViewById(R.id.action_indent).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setIndent(); + } + }); + + findViewById(R.id.action_outdent).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setOutdent(); + } + }); + + findViewById(R.id.action_align_left).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setAlignLeft(); + } + }); + + findViewById(R.id.action_align_center).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setAlignCenter(); + } + }); + + findViewById(R.id.action_align_right).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setAlignRight(); + } + }); + + findViewById(R.id.action_blockquote).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setBlockquote(); + } + }); + + findViewById(R.id.action_insert_bullets).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setBullets(); + } + }); + + findViewById(R.id.action_insert_numbers).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.setNumbers(); + } + }); + + findViewById(R.id.action_insert_image).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// Matisse.from(thisAct) +// .choose(MimeType.ofImage()) +// .theme(R.style.Matisse_Dracula) +// .countable(false) +// .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K)) +// .maxSelectable(9) +// .originalEnable(true) +// .maxOriginalSize(10) +// .imageEngine(new PicassoEngine()) +// .forResult(1001); + + Matisse.from(thisAct) + .choose(MimeType.ofAll(), false) + .countable(true) + .capture(true) + .captureStrategy(new CaptureStrategy(true, getPackageName() + ".fileprovider", "test")) + .maxSelectable(9) + .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K)) + .gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size)) + .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + .thumbnailScale(0.85f) + .imageEngine(new PicassoEngine()) + .setOnSelectedListener(new OnSelectedListener() { + @Override + public void onSelected( + @NonNull List uriList, @NonNull List pathList) { + // 选中或取消选中文件时 + Log.e("onSelected", "onSelected: pathList=" + pathList); + + } + }) + .originalEnable(true) + .maxOriginalSize(10) + .autoHideToolbarOnSingleTap(true) + .setOnCheckedListener(new OnCheckedListener() { + @Override + public void onCheck(boolean isChecked) { + // 是否勾选原图时 + Log.e("isChecked", "onCheck: isChecked=" + isChecked); + } + }) + .forResult(1001); + + } + }); + + findViewById(R.id.action_insert_link).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.insertLink("https://github.com/wasabeef", "wasabeef"); + } + }); + findViewById(R.id.action_insert_checkbox).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditor.insertTodo(); + } + }); + } + + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 1001 && resultCode == RESULT_OK) { + Log.e("OnActivityResult ", String.valueOf(Matisse.obtainOriginalState(data))); //是否原文件 + Log.e("OnActivityResult ", String.valueOf(Matisse.obtainResult(data))); //URI + Log.e("OnActivityResult ", String.valueOf(Matisse.obtainPathResult(data))); //path + + final String imgPath = String.valueOf(Matisse.obtainPathResult(data)).replace("[", "").replace("]", ""); + + RequestParams params = new RequestParams("http://192.168.2.149:8080/renren-fast/app/getToken"); +// params.addBodyParameter("time", String.valueOf(System.currentTimeMillis())); + HttpUtils.get(params, new HttpUtils.XCallBack() { + @Override + public void onSuccess(String result) { + try { + Log.d("--result", "onSuccess: " + result); + JSONObject json = new JSONObject(result); + String token = json.optString("token"); + final String domain = json.optString("domain"); + CommonMethod.uploadFile(token, imgPath, new OnStringCallBack() { + @Override + public void onCallBack(String s) { + String imgUrl = domain + "/" + s; + Log.d("--result", "imgUrl: " + imgUrl); + //TODO 先上传再插入 + mEditor.insertImage(imgUrl, "dachshund"); + } + }); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + @Override + public void onError() { + + } + + @Override + public void onFinished() { + + } + }); + + + } + } + + +} diff --git a/app/src/main/java/com/hjq/demo/ui/activity/UpdateActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/UpdateActivity.java new file mode 100644 index 00000000..08e40441 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/ui/activity/UpdateActivity.java @@ -0,0 +1,157 @@ +package com.hjq.demo.ui.activity; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.hjq.demo.Constant; +import com.hjq.demo.R; +import com.hjq.demo.Service.DownloadService; +import com.hjq.demo.bean.Appversion; +import com.hjq.demo.common.CommonActivity; + +import org.xutils.view.annotation.Event; +import org.xutils.view.annotation.ViewInject; + +/** + * 更新软件 + * Created by Administrator on 2016/3/15. + */ +public class UpdateActivity extends CommonActivity { + + + @ViewInject(R.id.btn_update) + Button btn_update; + @ViewInject(R.id.tv_desc) + TextView tv_desc; + @ViewInject(R.id.pb) + ProgressBar pb; + @ViewInject(R.id.iv_cancel) + ImageView iv_cancel; + + BroadcastReceiver receiver; + Appversion version; + + @Override + protected int getLayoutId() { + return R.layout.a_update_dialog; + } + + @Override + protected int getTitleBarId() { + return 0; + } + + @Override + protected void initView() { + version = (Appversion) getIntent().getSerializableExtra("version"); + tv_desc.setText(version.getUpDes().replace("|", "\r\n")); + if (version.getMustup().equals("1")) { + //强行更新 + iv_cancel.setVisibility(View.INVISIBLE); + } + } + + + @Event(R.id.btn_update) + private void download(View v) { + downloadApk(); + btn_update.setText("正在下载"); + } + + + public void downloadApk() { + Intent downloadIntent = new Intent(thisAct, DownloadService.class); + Bundle bundle = new Bundle(); + bundle.putString("url", version.getDownUrl()); + bundle.putString("apkName", version.getApkName()); + if (!TextUtils.isEmpty(version.getApkMd5())) { + bundle.putString("apkmd5", version.getApkMd5()); + } + downloadIntent.putExtras(bundle); + thisAct.startService(downloadIntent); + // 设置广播接收器,当新版本的apk下载完成后自动弹出安装界面 + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Constant.ActionType.ON_DOWNLOAD.name()); + intentFilter.addAction(Constant.ActionType.DOWNLOAD_ERROR.name()); + receiver = new BroadcastReceiver() { + + public void onReceive(Context context, Intent intent) { + + String action = intent.getAction(); + if (TextUtils.isEmpty(action)) { + return; + } + + if (action.equals(Constant.ActionType.ON_DOWNLOAD.name())) { + int progress = intent.getIntExtra("progress", 0); + if (progress > 0) { + pb.setVisibility(View.VISIBLE); + pb.setProgress(progress); + btn_update.setVisibility(View.GONE); + } + + //下载完成 + String downloadFile = intent.getStringExtra("downloadFile"); + if (downloadFile != null && downloadFile.equals("") == false) { + + //开始安装 + Intent install = new Intent(Intent.ACTION_VIEW); + String pathString = intent.getStringExtra("downloadFile"); + install.setDataAndType(Uri.parse("file://" + pathString), "application/vnd.android.package-archive"); + install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(install); + + btn_update.setVisibility(View.VISIBLE); + btn_update.setText("立即下载"); + pb.setVisibility(View.GONE); + } + } else if (action.equals(Constant.ActionType.DOWNLOAD_ERROR.name())) { + //下载错误 + btn_update.setVisibility(View.VISIBLE); + btn_update.setText("立即更新"); + pb.setVisibility(View.GONE); + } + + + } + }; + registerReceiver(receiver, intentFilter); + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == event.KEYCODE_BACK) { + //不让按返回键 + return true; + } + return false; + } + + @Event(R.id.iv_cancel) + private void cancel(View v) { + finish(); + } + + @Override + protected void onDestroy() { + // 移除广播接收器 + if (receiver != null) { + unregisterReceiver(receiver); + } + super.onDestroy(); + } + + +} diff --git a/app/src/main/java/com/hjq/demo/ui/activity/WebActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/WebActivity.java index d32e8fbf..7f38a073 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/WebActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/WebActivity.java @@ -17,7 +17,7 @@ import com.hjq.demo.R; import com.hjq.demo.common.CommonActivity; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; /** * author : HJQ @@ -27,9 +27,9 @@ */ public class WebActivity extends CommonActivity { - @BindView(R.id.pb_web_progress) + @ViewInject(R.id.pb_web_progress) ProgressBar mProgressBar; - @BindView(R.id.wv_web_view) + @ViewInject(R.id.wv_web_view) WebView mWebView; @Override @@ -75,15 +75,14 @@ protected void initView() { } else { settings.setLoadsImagesAutomatically(false); } - } - @Override - protected void initData() { mWebView.setWebViewClient(new MyWebViewClient()); mWebView.setWebChromeClient(new MyWebChromeClient()); mWebView.loadUrl("https://github.com/getActivity/AndroidProject"); } + + @Override public void onLeftClick(View v) { finish(); diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/CopyFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/CopyFragment.java index 9847c6b2..39d5db07 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/CopyFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/CopyFragment.java @@ -30,8 +30,5 @@ protected void initView() { } - @Override - protected void initData() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentA.java b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentA.java index 959b833c..eae9060f 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentA.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentA.java @@ -10,29 +10,29 @@ import com.hjq.demo.common.CommonLazyFragment; import com.hjq.demo.widget.XCollapsingToolbarLayout; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; /** - * author : HJQ - * github : https://github.com/getActivity/AndroidProject - * time : 2018/10/18 - * desc : 项目炫酷效果示例 + * author : HJQ + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 项目炫酷效果示例 */ public class TestFragmentA extends CommonLazyFragment implements XCollapsingToolbarLayout.OnScrimsListener { - @BindView(R.id.abl_test_bar) + @ViewInject(R.id.abl_test_bar) AppBarLayout mAppBarLayout; - @BindView(R.id.ctl_test_bar) + @ViewInject(R.id.ctl_test_bar) XCollapsingToolbarLayout mCollapsingToolbarLayout; - @BindView(R.id.t_test_title) + @ViewInject(R.id.t_test_title) Toolbar mToolbar; - @BindView(R.id.tb_test_bar) + @ViewInject(R.id.tb_test_bar) TitleBar mTitleBar; - @BindView(R.id.tv_test_address) + @ViewInject(R.id.tv_test_address) TextView mAddressView; - @BindView(R.id.tv_test_search) + @ViewInject(R.id.tv_test_search) TextView mSearchView; public static TestFragmentA newInstance() { @@ -58,10 +58,7 @@ protected void initView() { mCollapsingToolbarLayout.setOnScrimsListener(this); } - @Override - protected void initData() { - } @Override public boolean isStatusBarEnabled() { @@ -84,7 +81,7 @@ public void onScrimsStateChange(boolean shown) { mAddressView.setTextColor(getResources().getColor(R.color.black)); mSearchView.setBackgroundResource(R.drawable.bg_home_search_bar_gray); getStatusBarConfig().statusBarDarkFont(true).init(); - }else { + } else { mAddressView.setTextColor(getResources().getColor(R.color.white)); mSearchView.setBackgroundResource(R.drawable.bg_home_search_bar_transparent); getStatusBarConfig().statusBarDarkFont(false).init(); diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentB.java b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentB.java index 9f2d7527..d2258d84 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentB.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentB.java @@ -7,7 +7,7 @@ import com.hjq.demo.common.CommonLazyFragment; import com.hjq.toast.ToastUtils; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; /** * author : HJQ @@ -18,7 +18,7 @@ public class TestFragmentB extends CommonLazyFragment implements View.OnClickListener { - @BindView(R.id.cv_test_countdown) + @ViewInject(R.id.cv_test_countdown) CountdownView mCountdownView; public static TestFragmentB newInstance() { @@ -40,10 +40,7 @@ protected void initView() { mCountdownView.setOnClickListener(this); } - @Override - protected void initData() { - } /** * {@link View.OnClickListener} diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentC.java b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentC.java index 6604c3e5..9f42c6cc 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentC.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentC.java @@ -13,7 +13,7 @@ import java.util.List; -import butterknife.BindView; +import org.xutils.view.annotation.ViewInject; /** * author : HJQ @@ -24,17 +24,17 @@ public class TestFragmentC extends CommonLazyFragment implements View.OnClickListener { - @BindView(R.id.btn_test_toast) + @ViewInject(R.id.btn_test_toast) Button mToastView; - @BindView(R.id.btn_test_permission) + @ViewInject(R.id.btn_test_permission) Button mPermissionView; - @BindView(R.id.btn_test_state_black) + @ViewInject(R.id.btn_test_state_black) Button mStateBlackView; - @BindView(R.id.btn_test_state_white) + @ViewInject(R.id.btn_test_state_white) Button mStateWhiteView; - @BindView(R.id.btn_test_swipe_enabled) + @ViewInject(R.id.btn_test_swipe_enabled) Button mSwipeEnabledView; - @BindView(R.id.btn_test_swipe_disable) + @ViewInject(R.id.btn_test_swipe_disable) Button mSwipeDisableView; public static TestFragmentC newInstance() { @@ -61,10 +61,7 @@ protected void initView() { mSwipeDisableView.setOnClickListener(this); } - @Override - protected void initData() { - } @Override public boolean isStatusBarEnabled() { diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentD.java b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentD.java index 75abc9b1..409fb687 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentD.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/TestFragmentD.java @@ -8,9 +8,11 @@ import com.hjq.demo.ui.activity.AboutActivity; import com.hjq.demo.ui.activity.LoginActivity; import com.hjq.demo.ui.activity.RegisterActivity; +import com.hjq.demo.ui.activity.RicheditorActivity; import com.hjq.demo.ui.activity.WebActivity; -import butterknife.BindView; +import org.xutils.view.annotation.Event; +import org.xutils.view.annotation.ViewInject; /** * author : HJQ @@ -21,13 +23,13 @@ public class TestFragmentD extends CommonLazyFragment implements View.OnClickListener { - @BindView(R.id.btn_test_login) + @ViewInject(R.id.btn_test_login) Button mLoginView; - @BindView(R.id.btn_test_register) + @ViewInject(R.id.btn_test_register) Button mRegisterView; - @BindView(R.id.btn_test_about) + @ViewInject(R.id.btn_test_about) Button mAboutView; - @BindView(R.id.btn_test_browser) + @ViewInject(R.id.btn_test_browser) Button mBrowserView; public static TestFragmentD newInstance() { @@ -52,11 +54,12 @@ protected void initView() { mBrowserView.setOnClickListener(this); } - @Override - protected void initData() { - + @Event(R.id.btn_test_richeditor) + private void on_btn_test_richeditor(View v){ + startActivity(RicheditorActivity.class); } + /** * {@link View.OnClickListener} */ diff --git a/app/src/main/java/com/hjq/demo/widget/LoadingDialog.java b/app/src/main/java/com/hjq/demo/widget/LoadingDialog.java new file mode 100644 index 00000000..a082dcc3 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/widget/LoadingDialog.java @@ -0,0 +1,31 @@ +package com.hjq.demo.widget; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.PopupWindow; + +import com.hjq.demo.R; + +/** + * Created by Administrator on 2016/3/14. + */ +public class LoadingDialog { + private static PopupWindow pop; + + public static void show(Context context, View parent) { + pop = new PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//这里设置宽高 + View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null); + pop.setContentView(view); + pop.setOutsideTouchable(false);//点击pop外部的空间,可以取消pop + pop.setBackgroundDrawable(new ColorDrawable(-(000000)));//需要这行,才能保证setOutsideTouchable生效 + pop.showAtLocation(parent, Gravity.CENTER, 0, 0); + } + + public static void cancel() { + pop.dismiss(); + } +} diff --git a/app/src/main/java/com/hjq/demo/widget/RichEditor.java b/app/src/main/java/com/hjq/demo/widget/RichEditor.java new file mode 100644 index 00000000..263a8b9b --- /dev/null +++ b/app/src/main/java/com/hjq/demo/widget/RichEditor.java @@ -0,0 +1,453 @@ +package com.hjq.demo.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import com.hjq.demo.tool.RichEditorUtils; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * Copyright (C) 2017 Wasabeef + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class RichEditor extends WebView { + + public enum Type { + BOLD, + ITALIC, + SUBSCRIPT, + SUPERSCRIPT, + STRIKETHROUGH, + UNDERLINE, + H1, + H2, + H3, + H4, + H5, + H6, + ORDEREDLIST, + UNORDEREDLIST, + JUSTIFYCENTER, + JUSTIFYFULL, + JUSTUFYLEFT, + JUSTIFYRIGHT + } + + public interface OnTextChangeListener { + + void onTextChange(String text); + } + + public interface OnDecorationStateListener { + + void onStateChangeListener(String text, List types); + } + + public interface AfterInitialLoadListener { + + void onAfterInitialLoad(boolean isReady); + } + + private static final String SETUP_HTML = "file:///android_asset/editor.html"; + private static final String CALLBACK_SCHEME = "re-callback://"; + private static final String STATE_SCHEME = "re-state://"; + private boolean isReady = false; + private String mContents; + private OnTextChangeListener mTextChangeListener; + private OnDecorationStateListener mDecorationStateListener; + private AfterInitialLoadListener mLoadListener; + + public RichEditor(Context context) { + this(context, null); + } + + public RichEditor(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.webViewStyle); + } + + @SuppressLint("SetJavaScriptEnabled") + public RichEditor(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + setVerticalScrollBarEnabled(false); + setHorizontalScrollBarEnabled(false); + getSettings().setJavaScriptEnabled(true); + setWebChromeClient(new WebChromeClient()); + setWebViewClient(createWebviewClient()); + loadUrl(SETUP_HTML); + + applyAttributes(context, attrs); + } + + protected EditorWebViewClient createWebviewClient() { + return new EditorWebViewClient(); + } + + public void setOnTextChangeListener(OnTextChangeListener listener) { + mTextChangeListener = listener; + } + + public void setOnDecorationChangeListener(OnDecorationStateListener listener) { + mDecorationStateListener = listener; + } + + public void setOnInitialLoadListener(AfterInitialLoadListener listener) { + mLoadListener = listener; + } + + private void callback(String text) { + mContents = text.replaceFirst(CALLBACK_SCHEME, ""); + if (mTextChangeListener != null) { + mTextChangeListener.onTextChange(mContents); + } + } + + private void stateCheck(String text) { + String state = text.replaceFirst(STATE_SCHEME, "").toUpperCase(Locale.ENGLISH); + List types = new ArrayList<>(); + for (Type type : Type.values()) { + if (TextUtils.indexOf(state, type.name()) != -1) { + types.add(type); + } + } + + if (mDecorationStateListener != null) { + mDecorationStateListener.onStateChangeListener(state, types); + } + } + + private void applyAttributes(Context context, AttributeSet attrs) { + final int[] attrsArray = new int[]{ + android.R.attr.gravity + }; + TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray); + + int gravity = ta.getInt(0, NO_ID); + switch (gravity) { + case Gravity.LEFT: + exec("javascript:RE.setTextAlign(\"left\")"); + break; + case Gravity.RIGHT: + exec("javascript:RE.setTextAlign(\"right\")"); + break; + case Gravity.TOP: + exec("javascript:RE.setVerticalAlign(\"top\")"); + break; + case Gravity.BOTTOM: + exec("javascript:RE.setVerticalAlign(\"bottom\")"); + break; + case Gravity.CENTER_VERTICAL: + exec("javascript:RE.setVerticalAlign(\"middle\")"); + break; + case Gravity.CENTER_HORIZONTAL: + exec("javascript:RE.setTextAlign(\"center\")"); + break; + case Gravity.CENTER: + exec("javascript:RE.setVerticalAlign(\"middle\")"); + exec("javascript:RE.setTextAlign(\"center\")"); + break; + } + + ta.recycle(); + } + + public void setHtml(String contents) { + if (contents == null) { + contents = ""; + } + try { + exec("javascript:RE.setHtml('" + URLEncoder.encode(contents, "UTF-8") + "');"); + } catch (UnsupportedEncodingException e) { + // No handling + } + mContents = contents; + } + + public String getHtml() { + return mContents; + } + + public void setEditorFontColor(int color) { + String hex = convertHexColorString(color); + exec("javascript:RE.setBaseTextColor('" + hex + "');"); + } + + public void setEditorFontSize(int px) { + exec("javascript:RE.setBaseFontSize('" + px + "px');"); + } + + @Override + public void setPadding(int left, int top, int right, int bottom) { + super.setPadding(left, top, right, bottom); + exec("javascript:RE.setPadding('" + left + "px', '" + top + "px', '" + right + "px', '" + bottom + + "px');"); + } + + @Override + public void setPaddingRelative(int start, int top, int end, int bottom) { + // still not support RTL. + setPadding(start, top, end, bottom); + } + + public void setEditorBackgroundColor(int color) { + setBackgroundColor(color); + } + + @Override + public void setBackgroundColor(int color) { + super.setBackgroundColor(color); + } + + @Override + public void setBackgroundResource(int resid) { + Bitmap bitmap = RichEditorUtils.decodeResource(getContext(), resid); + String base64 = RichEditorUtils.toBase64(bitmap); + bitmap.recycle(); + + exec("javascript:RE.setBackgroundImage('url(data:image/png;base64," + base64 + ")');"); + } + + @Override + public void setBackground(Drawable background) { + Bitmap bitmap = RichEditorUtils.toBitmap(background); + String base64 = RichEditorUtils.toBase64(bitmap); + bitmap.recycle(); + + exec("javascript:RE.setBackgroundImage('url(data:image/png;base64," + base64 + ")');"); + } + + public void setBackground(String url) { + exec("javascript:RE.setBackgroundImage('url(" + url + ")');"); + } + + public void setEditorWidth(int px) { + exec("javascript:RE.setWidth('" + px + "px');"); + } + + public void setEditorHeight(int px) { + exec("javascript:RE.setHeight('" + px + "px');"); + } + + public void setPlaceholder(String placeholder) { + exec("javascript:RE.setPlaceholder('" + placeholder + "');"); + } + + public void setInputEnabled(Boolean inputEnabled) { + exec("javascript:RE.setInputEnabled(" + inputEnabled + ")"); + } + + public void loadCSS(String cssFile) { + String jsCSSImport = "(function() {" + + " var head = document.getElementsByTagName(\"head\")[0];" + + " var link = document.createElement(\"link\");" + + " link.rel = \"stylesheet\";" + + " link.type = \"text/css\";" + + " link.href = \"" + cssFile + "\";" + + " link.media = \"all\";" + + " head.appendChild(link);" + + "}) ();"; + exec("javascript:" + jsCSSImport + ""); + } + + public void undo() { + exec("javascript:RE.undo();"); + } + + public void redo() { + exec("javascript:RE.redo();"); + } + + public void setBold() { + exec("javascript:RE.setBold();"); + } + + public void setItalic() { + exec("javascript:RE.setItalic();"); + } + + public void setSubscript() { + exec("javascript:RE.setSubscript();"); + } + + public void setSuperscript() { + exec("javascript:RE.setSuperscript();"); + } + + public void setStrikeThrough() { + exec("javascript:RE.setStrikeThrough();"); + } + + public void setUnderline() { + exec("javascript:RE.setUnderline();"); + } + + public void setTextColor(int color) { + exec("javascript:RE.prepareInsert();"); + + String hex = convertHexColorString(color); + exec("javascript:RE.setTextColor('" + hex + "');"); + } + + public void setTextBackgroundColor(int color) { + exec("javascript:RE.prepareInsert();"); + + String hex = convertHexColorString(color); + exec("javascript:RE.setTextBackgroundColor('" + hex + "');"); + } + + public void setFontSize(int fontSize) { + if (fontSize > 7 || fontSize < 1) { + Log.e("RichEditor", "Font size should have a value between 1-7"); + } + exec("javascript:RE.setFontSize('" + fontSize + "');"); + } + + public void removeFormat() { + exec("javascript:RE.removeFormat();"); + } + + public void setHeading(int heading) { + exec("javascript:RE.setHeading('" + heading + "');"); + } + + public void setIndent() { + exec("javascript:RE.setIndent();"); + } + + public void setOutdent() { + exec("javascript:RE.setOutdent();"); + } + + public void setAlignLeft() { + exec("javascript:RE.setJustifyLeft();"); + } + + public void setAlignCenter() { + exec("javascript:RE.setJustifyCenter();"); + } + + public void setAlignRight() { + exec("javascript:RE.setJustifyRight();"); + } + + public void setBlockquote() { + exec("javascript:RE.setBlockquote();"); + } + + public void setBullets() { + exec("javascript:RE.setBullets();"); + } + + public void setNumbers() { + exec("javascript:RE.setNumbers();"); + } + + public void insertImage(String url, String alt) { + exec("javascript:RE.prepareInsert();"); + exec("javascript:RE.insertImage('" + url + "', '" + alt + "');"); + } + + public void insertLink(String href, String title) { + exec("javascript:RE.prepareInsert();"); + exec("javascript:RE.insertLink('" + href + "', '" + title + "');"); + } + + public void insertTodo() { + exec("javascript:RE.prepareInsert();"); + exec("javascript:RE.setTodo('" + RichEditorUtils.getCurrentTime() + "');"); + } + + public void focusEditor() { + requestFocus(); + exec("javascript:RE.focus();"); + } + + public void clearFocusEditor() { + exec("javascript:RE.blurFocus();"); + } + + private String convertHexColorString(int color) { + return String.format("#%06X", (0xFFFFFF & color)); + } + + protected void exec(final String trigger) { + if (isReady) { + load(trigger); + } else { + postDelayed(new Runnable() { + @Override + public void run() { + exec(trigger); + } + }, 100); + } + } + + private void load(String trigger) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + evaluateJavascript(trigger, null); + } else { + loadUrl(trigger); + } + } + + protected class EditorWebViewClient extends WebViewClient { + @Override + public void onPageFinished(WebView view, String url) { + isReady = url.equalsIgnoreCase(SETUP_HTML); + if (mLoadListener != null) { + mLoadListener.onAfterInitialLoad(isReady); + } + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + String decode; + try { + decode = URLDecoder.decode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + // No handling + return false; + } + + if (TextUtils.indexOf(url, CALLBACK_SCHEME) == 0) { + callback(decode); + return true; + } else if (TextUtils.indexOf(url, STATE_SCHEME) == 0) { + stateCheck(decode); + return true; + } + + return super.shouldOverrideUrlLoading(view, url); + } + } +} diff --git a/app/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java b/app/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java new file mode 100644 index 00000000..949a0f57 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java @@ -0,0 +1,11 @@ +package com.hjq.demo.wxapi; + +import com.umeng.socialize.weixin.view.WXCallbackActivity; + +/** + * Created by AFeng on 2018/11/12. + */ +public class WXEntryActivity extends WXCallbackActivity { + + +} diff --git a/app/src/main/res/drawable-xhdpi/icon_close.png b/app/src/main/res/drawable-xhdpi/icon_close.png new file mode 100644 index 00000000..59ab4f03 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_close.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_close_white.png b/app/src/main/res/drawable-xhdpi/icon_close_white.png new file mode 100644 index 00000000..7a61c891 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_close_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_dialog_loading.png b/app/src/main/res/drawable-xhdpi/icon_dialog_loading.png new file mode 100644 index 00000000..697f7d85 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_dialog_loading.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_login_bg.jpg b/app/src/main/res/drawable-xhdpi/icon_login_bg.jpg new file mode 100644 index 00000000..341a94ca Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_login_bg.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/icon_update_dibu.png b/app/src/main/res/drawable-xhdpi/icon_update_dibu.png new file mode 100644 index 00000000..09292554 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_update_dibu.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_update_r.png b/app/src/main/res/drawable-xhdpi/icon_update_r.png new file mode 100644 index 00000000..b054009f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_update_r.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_update_top.png b/app/src/main/res/drawable-xhdpi/icon_update_top.png new file mode 100644 index 00000000..5acfdfd6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_update_top.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_bg.png b/app/src/main/res/drawable-xhdpi/richeditor_bg.png new file mode 100644 index 00000000..edd0fa38 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_bg.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_bg_color.png b/app/src/main/res/drawable-xhdpi/richeditor_bg_color.png new file mode 100644 index 00000000..c6bd0ef6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_bg_color.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_blockquote.png b/app/src/main/res/drawable-xhdpi/richeditor_blockquote.png new file mode 100644 index 00000000..638a40cd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_blockquote.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_bold.png b/app/src/main/res/drawable-xhdpi/richeditor_bold.png new file mode 100644 index 00000000..7184e00b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_bold.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_bullets.png b/app/src/main/res/drawable-xhdpi/richeditor_bullets.png new file mode 100644 index 00000000..91a0fc02 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_bullets.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_h1.png b/app/src/main/res/drawable-xhdpi/richeditor_h1.png new file mode 100644 index 00000000..774786c6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_h1.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_h2.png b/app/src/main/res/drawable-xhdpi/richeditor_h2.png new file mode 100644 index 00000000..3715b7a7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_h2.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_h3.png b/app/src/main/res/drawable-xhdpi/richeditor_h3.png new file mode 100644 index 00000000..4a8915cb Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_h3.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_h4.png b/app/src/main/res/drawable-xhdpi/richeditor_h4.png new file mode 100644 index 00000000..67814476 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_h4.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_h5.png b/app/src/main/res/drawable-xhdpi/richeditor_h5.png new file mode 100644 index 00000000..682a91d5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_h5.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_h6.png b/app/src/main/res/drawable-xhdpi/richeditor_h6.png new file mode 100644 index 00000000..dee7ff49 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_h6.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_html_edit.png b/app/src/main/res/drawable-xhdpi/richeditor_html_edit.png new file mode 100644 index 00000000..3bbdedb6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_html_edit.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_indent.png b/app/src/main/res/drawable-xhdpi/richeditor_indent.png new file mode 100644 index 00000000..77efb718 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_indent.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_insert_image.png b/app/src/main/res/drawable-xhdpi/richeditor_insert_image.png new file mode 100644 index 00000000..3c888424 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_insert_image.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_insert_link.png b/app/src/main/res/drawable-xhdpi/richeditor_insert_link.png new file mode 100644 index 00000000..e86e04c7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_insert_link.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_italic.png b/app/src/main/res/drawable-xhdpi/richeditor_italic.png new file mode 100644 index 00000000..f1a13636 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_italic.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_justify_center.png b/app/src/main/res/drawable-xhdpi/richeditor_justify_center.png new file mode 100644 index 00000000..450ce245 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_justify_center.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_justify_left.png b/app/src/main/res/drawable-xhdpi/richeditor_justify_left.png new file mode 100644 index 00000000..5125d0e8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_justify_left.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_justify_right.png b/app/src/main/res/drawable-xhdpi/richeditor_justify_right.png new file mode 100644 index 00000000..47be92be Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_justify_right.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_numbers.png b/app/src/main/res/drawable-xhdpi/richeditor_numbers.png new file mode 100644 index 00000000..44d388e7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_numbers.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_outdent.png b/app/src/main/res/drawable-xhdpi/richeditor_outdent.png new file mode 100644 index 00000000..3a953ce1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_outdent.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_redo.png b/app/src/main/res/drawable-xhdpi/richeditor_redo.png new file mode 100644 index 00000000..eb9bf475 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_redo.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_strikethrough.png b/app/src/main/res/drawable-xhdpi/richeditor_strikethrough.png new file mode 100644 index 00000000..7f3e4649 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_strikethrough.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_subscript.png b/app/src/main/res/drawable-xhdpi/richeditor_subscript.png new file mode 100644 index 00000000..34d4c575 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_subscript.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_superscript.png b/app/src/main/res/drawable-xhdpi/richeditor_superscript.png new file mode 100644 index 00000000..0ad35765 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_superscript.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_txt_color.png b/app/src/main/res/drawable-xhdpi/richeditor_txt_color.png new file mode 100644 index 00000000..7d0e2ebc Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_txt_color.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_underline.png b/app/src/main/res/drawable-xhdpi/richeditor_underline.png new file mode 100644 index 00000000..24d55a49 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_underline.png differ diff --git a/app/src/main/res/drawable-xhdpi/richeditor_undo.png b/app/src/main/res/drawable-xhdpi/richeditor_undo.png new file mode 100644 index 00000000..9fa457a7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/richeditor_undo.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_push_notification_default_large_icon.png b/app/src/main/res/drawable-xhdpi/umeng_push_notification_default_large_icon.png new file mode 100644 index 00000000..007c5332 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_push_notification_default_large_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_push_notification_default_small_icon.png b/app/src/main/res/drawable-xhdpi/umeng_push_notification_default_small_icon.png new file mode 100644 index 00000000..20c073ff Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_push_notification_default_small_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_socialize_fav.png b/app/src/main/res/drawable-xhdpi/umeng_socialize_fav.png new file mode 100644 index 00000000..20a182b7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_socialize_fav.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_socialize_qq.png b/app/src/main/res/drawable-xhdpi/umeng_socialize_qq.png new file mode 100644 index 00000000..486d55ce Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_socialize_qq.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_socialize_qzone.png b/app/src/main/res/drawable-xhdpi/umeng_socialize_qzone.png new file mode 100644 index 00000000..754597b7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_socialize_qzone.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_socialize_wechat.png b/app/src/main/res/drawable-xhdpi/umeng_socialize_wechat.png new file mode 100644 index 00000000..927952e8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_socialize_wechat.png differ diff --git a/app/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle.png b/app/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle.png new file mode 100644 index 00000000..f9425448 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle.png differ diff --git a/app/src/main/res/drawable/ic_progress_xiazai.xml b/app/src/main/res/drawable/ic_progress_xiazai.xml new file mode 100644 index 00000000..ce32f0e8 --- /dev/null +++ b/app/src/main/res/drawable/ic_progress_xiazai.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_btn_update.xml b/app/src/main/res/drawable/selector_btn_update.xml new file mode 100644 index 00000000..450a72e5 --- /dev/null +++ b/app/src/main/res/drawable/selector_btn_update.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/a_richeditor.xml b/app/src/main/res/layout/a_richeditor.xml new file mode 100644 index 00000000..26ab9571 --- /dev/null +++ b/app/src/main/res/layout/a_richeditor.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/a_update_dialog.xml b/app/src/main/res/layout/a_update_dialog.xml new file mode 100644 index 00000000..c4184304 --- /dev/null +++ b/app/src/main/res/layout/a_update_dialog.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + +