├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ ├── output.json │ └── quickhybrid101.apk └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── quick │ │ └── quickhybrid │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── dist │ │ │ ├── quick.h5.js │ │ │ ├── quick.h5.min.js │ │ │ ├── quick.js │ │ │ ├── quick.min.js │ │ │ ├── quick.native.js │ │ │ └── quick.native.min.js │ │ ├── examples │ │ │ ├── api │ │ │ │ ├── auth.html │ │ │ │ ├── custom.html │ │ │ │ ├── device.html │ │ │ │ ├── navigator.html │ │ │ │ ├── page.html │ │ │ │ ├── runtime.html │ │ │ │ ├── ui.html │ │ │ │ └── util.html │ │ │ ├── callapi.html │ │ │ ├── common │ │ │ │ ├── common.css │ │ │ │ ├── common.js │ │ │ │ ├── mui.picker │ │ │ │ │ ├── mui.picker.css │ │ │ │ │ ├── mui.picker.js │ │ │ │ │ ├── mui.picker.min.css │ │ │ │ │ └── mui.picker.min.js │ │ │ │ ├── mui.poppicker │ │ │ │ │ ├── mui.poppicker.css │ │ │ │ │ ├── mui.poppicker.js │ │ │ │ │ ├── mui.poppicker.min.css │ │ │ │ │ └── mui.poppicker.min.js │ │ │ │ └── mui │ │ │ │ │ ├── fonts │ │ │ │ │ └── mui.ttf │ │ │ │ │ ├── mui.css │ │ │ │ │ ├── mui.extend.css │ │ │ │ │ ├── mui.js │ │ │ │ │ └── mui修改记录.md │ │ │ ├── h5 │ │ │ │ ├── fileinput.js │ │ │ │ └── fileinput2.html │ │ │ ├── index.html │ │ │ ├── promise.html │ │ │ └── simple.html │ │ └── modules.properties │ ├── java │ │ └── com │ │ │ └── quick │ │ │ └── quickhybrid │ │ │ ├── AboutActivity.java │ │ │ ├── AppApplication.java │ │ │ ├── MainActivity.java │ │ │ └── api │ │ │ └── PayApi.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── about_activity.xml │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── quick │ └── quickhybrid │ └── ExampleUnitTest.java ├── build.gradle ├── core ├── .gitignore ├── build.gradle ├── libs │ └── org.apache.http.legacy.jar ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── quick │ │ └── core │ │ ├── application │ │ ├── CrashHandler.java │ │ └── FrmApplication.java │ │ ├── baseapp │ │ ├── baseactivity │ │ │ ├── FrmBaseActivity.java │ │ │ ├── FrmBaseCompatActivity.java │ │ │ ├── FrmBaseFragment.java │ │ │ ├── FrmFragmentActivity.java │ │ │ ├── FrmV4FragmentActivity.java │ │ │ └── control │ │ │ │ ├── NbControl.java │ │ │ │ ├── PageControl.java │ │ │ │ └── StatusControl.java │ │ ├── component │ │ │ ├── FileChooseActivity.java │ │ │ └── scan │ │ │ │ └── ScanCaptureActivity.java │ │ └── theme │ │ │ └── BaseThemeControl.java │ │ ├── net │ │ └── HttpUtil.java │ │ ├── ui │ │ ├── app │ │ │ ├── IErrorControl.java │ │ │ ├── INbControl.java │ │ │ ├── IPageControl.java │ │ │ ├── IThemeControl.java │ │ │ └── ThemeBean.java │ │ └── widget │ │ │ ├── DrawableText.java │ │ │ ├── NbImageView.java │ │ │ ├── NbTextView.java │ │ │ ├── SegActionCallBack.java │ │ │ ├── ToastUtil.java │ │ │ ├── dialog │ │ │ ├── ActionSheet.java │ │ │ ├── DialogSelectAdapter.java │ │ │ ├── QuickDatePickerDialog.java │ │ │ ├── QuickDialog.java │ │ │ └── QuickImageDialog.java │ │ │ ├── popmenu │ │ │ ├── FrmPopMenu.java │ │ │ ├── PopChangedListener.java │ │ │ └── PopClickListener.java │ │ │ └── segbar │ │ │ ├── ActionBarSeg.java │ │ │ └── SegActionCallBack.java │ │ └── util │ │ ├── app │ │ └── AppUtil.java │ │ ├── common │ │ ├── DateUtil.java │ │ ├── DialogUtil.java │ │ ├── JsonUtil.java │ │ ├── QuickUtil.java │ │ └── RuntimeUtil.java │ │ ├── device │ │ ├── DensityUtil.java │ │ ├── DeviceUtil.java │ │ └── PhotoSelector.java │ │ ├── gis │ │ ├── CoordMath.java │ │ └── MyLatLngPoint.java │ │ ├── io │ │ ├── FileSavePath.java │ │ ├── FileSorter.java │ │ ├── FileUtil.java │ │ └── IOUtil.java │ │ ├── jsbridge │ │ └── QuickModulesUtil.java │ │ ├── reflect │ │ ├── ReflectUtil.java │ │ └── ResManager.java │ │ └── security │ │ └── MD5Util.java │ └── res │ ├── drawable │ ├── actionsheet_bottom_normal.9.png │ ├── actionsheet_bottom_pressed.9.png │ ├── actionsheet_middle_normal.9.png │ ├── actionsheet_middle_pressed.9.png │ ├── actionsheet_single_normal.9.png │ ├── actionsheet_single_pressed.9.png │ ├── actionsheet_top_normal.9.png │ ├── actionsheet_top_pressed.9.png │ ├── frm_as_ios7_cancel_bt.xml │ ├── frm_as_ios7_other_bt_bottom.xml │ ├── frm_as_ios7_other_bt_middle.xml │ ├── frm_as_ios7_other_bt_single.xml │ ├── frm_as_ios7_other_bt_top.xml │ ├── frm_blue_btn_bg.xml │ ├── frm_click_dialog_left_btn_bg.xml │ ├── frm_click_dialog_right_btn_bg.xml │ ├── frm_click_dialog_single_btn_bg.xml │ ├── frm_click_dialog_update_bg.xml │ ├── frm_dialog_bg.xml │ ├── frm_dialog_btn_bg.xml │ ├── frm_dialog_btn_press_bg.xml │ ├── frm_dialog_left_btn_bg.xml │ ├── frm_dialog_left_btn_press_bg.xml │ ├── frm_dialog_press_bg.xml │ ├── frm_dialog_right_btn_bg.xml │ ├── frm_dialog_right_btn_press_bg.xml │ ├── frm_dialog_title_bg.xml │ ├── frm_dialog_updatebtn_bg.xml │ ├── frm_dialog_updatebtn_press_bg.xml │ ├── frm_edittext_bg.xml │ ├── frm_edittext_cursor_color.xml │ ├── frm_nav_tab_bg.xml │ └── frm_nav_tab_btn_bg.xml │ ├── layout │ ├── frm_base.xml │ ├── frm_dialog.xml │ ├── frm_image_dialog.xml │ ├── frm_list_pop_adapter.xml │ ├── frm_localfilelist_activity.xml │ ├── frm_localfilelist_adapter.xml │ ├── frm_nb_style1.xml │ ├── frm_prompt.xml │ ├── frm_scan_activity.xml │ ├── frm_select_adapter.xml │ ├── frm_simple_adapter.xml │ └── frm_status.xml │ ├── mipmap │ ├── img_arrow_black_down.png │ ├── img_arrow_black_up.png │ ├── img_arrow_blue_down.png │ ├── img_arrow_blue_up.png │ ├── img_arrows_btn.png │ ├── img_back_nav_btn.png │ ├── img_back_nav_btn_white.png │ ├── img_checked_btn.png │ ├── img_default.png │ ├── img_exit_btn.png │ ├── img_exit_nav_btn.png │ ├── img_fc_back.png │ ├── img_fc_dir.png │ ├── img_fc_file.png │ ├── img_fc_sdcard.png │ ├── img_fc_system.png │ ├── img_file.png │ ├── img_net_none_bg.png │ ├── img_net_wrong_bg.png │ ├── img_server_wrong_bg.png │ └── img_unchecked_btn.png │ └── values │ ├── frm_attrs.xml │ ├── frm_colors.xml │ ├── frm_dimens.xml │ ├── frm_strings.xml │ ├── frm_styles.xml │ └── strings.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── jsbridge ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── quick │ │ └── jsbridge │ │ ├── api │ │ ├── AuthApi.java │ │ ├── DeviceApi.java │ │ ├── NavigatorApi.java │ │ ├── PageApi.java │ │ ├── RuntimeApi.java │ │ ├── UIApi.java │ │ └── UtilApi.java │ │ ├── bean │ │ └── QuickBean.java │ │ ├── bridge │ │ ├── Callback.java │ │ ├── IBridgeImpl.java │ │ └── JSBridge.java │ │ ├── control │ │ ├── AutoCallbackDefined.java │ │ ├── AutoCallbackEvent.java │ │ ├── FileChooser.java │ │ ├── PageLoad.java │ │ └── WebloaderControl.java │ │ └── view │ │ ├── IQuickFragment.java │ │ ├── QuickFragment.java │ │ ├── QuickWebLoader.java │ │ └── webview │ │ ├── IActivityResult.java │ │ ├── IFileChooser.java │ │ ├── ILoadPage.java │ │ ├── IWebviewScrollChanged.java │ │ ├── QuickWebChromeClient.java │ │ ├── QuickWebView.java │ │ └── QuickWebviewClient.java │ └── res │ ├── drawable │ └── quick_progress_bar_states.xml │ ├── layout │ ├── quick_activity.xml │ └── quick_fragment.xml │ └── values │ └── strings.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | .project 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | *.pid.lock 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # nyc test coverage 22 | .nyc_output 23 | 24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 25 | .grunt 26 | 27 | # Bower dependency directory (https://bower.io/) 28 | bower_components 29 | 30 | # node-waf configuration 31 | .lock-wscript 32 | 33 | # Compiled binary addons (http://nodejs.org/api/addons.html) 34 | build/Release 35 | 36 | # Dependency directories 37 | node_modules/ 38 | jspm_packages/ 39 | 40 | # Typescript v1 declaration files 41 | typings/ 42 | 43 | # Optional npm cache directory 44 | .npm 45 | 46 | # Optional eslint cache 47 | .eslintcache 48 | 49 | # Optional REPL history 50 | .node_repl_history 51 | 52 | # Output of 'npm pack' 53 | *.tgz 54 | 55 | # Yarn Integrity file 56 | .yarn-integrity 57 | 58 | # dotenv environment variables file 59 | .env 60 | 61 | *.iml 62 | .gradle 63 | /local.properties 64 | /.idea/workspace.xml 65 | /.idea/libraries 66 | /.idea/misc.xml 67 | /.idea/modules.xml 68 | /.idea/vcs.xml 69 | .idea 70 | .DS_Store 71 | /build 72 | /captures 73 | .externalNativeBuild 74 | 75 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, quickhybrid 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # quickhybrid-android 2 | 混合开发框架quickhybrid的android版本 3 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | defaultConfig { 6 | applicationId "com.quick.quickhybrid" 7 | minSdkVersion 16 8 | targetSdkVersion 22 9 | versionCode 1 10 | versionName "1.0.1" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation project(':core') 23 | implementation project(':jsbridge') 24 | implementation fileTree(dir: 'libs', include: ['*.jar']) 25 | // implementation 'com.jakewharton:butterknife:8.6.0' 26 | // butterknife8.0+版本支持控件注解必须在可运行的model加上 27 | annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0' 28 | 29 | testImplementation 'junit:junit:4.12' 30 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 31 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"com.quick.quickhybrid","split":"","minSdkVersion":"16"}}] -------------------------------------------------------------------------------- /app/release/quickhybrid101.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quickhybrid/quickhybrid-android/e45a018fe57d0c1e6b9eeaea6092793ba4268a27/app/release/quickhybrid101.apk -------------------------------------------------------------------------------- /app/src/androidTest/java/com/quick/quickhybrid/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.quick.quickhybrid; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.quick.quickhybrid", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/api/auth.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | auth 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/api/custom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | auth 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/callapi.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 组件(自定义)API 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/common.css: -------------------------------------------------------------------------------- 1 | /** 2 | * 作者: 郭天琦 3 | * 创建时间: 2017/06/27 4 | * 版本: [1.0, 2017/06/27 ] 5 | * 版权: 江苏国泰新点软件有限公司 6 | * 描述: 拓展框架的一些通用样式 7 | * 为了方便维护,单独提取出来了,打包时会与mui.css合并 8 | */ 9 | 10 | ul, 11 | li { 12 | padding: 0; 13 | margin: 0; 14 | list-style: none; 15 | } 16 | 17 | em, 18 | u { 19 | font-style: normal; 20 | } 21 | 22 | .l { 23 | float: left; 24 | } 25 | 26 | .r { 27 | float: right; 28 | } 29 | 30 | .center-block { 31 | display: block; 32 | margin-left: auto; 33 | margin-right: auto; 34 | } 35 | 36 | .clearfix:before, 37 | .clearfix:after { 38 | display: table; 39 | line-height: 0; 40 | content: ""; 41 | } 42 | 43 | .clearfix:after { 44 | clear: both; 45 | } 46 | 47 | .hidden { 48 | display: none !important; 49 | } 50 | 51 | .invisible { 52 | visibility: hidden; 53 | } 54 | 55 | .can-select { 56 | -webkit-user-select: text; 57 | } 58 | 59 | .fullscreen { 60 | position: absolute; 61 | top: 0; 62 | right: 0; 63 | bottom: 0; 64 | left: 0; 65 | } 66 | 67 | .text-center { 68 | text-align: center !important; 69 | } 70 | 71 | .text-left { 72 | text-align: left !important; 73 | } 74 | 75 | .text-right { 76 | text-align: right !important; 77 | } 78 | 79 | .text-justify { 80 | text-align: justify !important; 81 | } 82 | 83 | .text-nowrap { 84 | white-space: nowrap !important; 85 | } 86 | 87 | .text-ellipsis { 88 | white-space: nowrap; 89 | text-overflow: ellipsis; 90 | overflow: hidden; 91 | } 92 | 93 | .bg-gray { 94 | background-color: #f5f5f5; 95 | } 96 | 97 | .bg-white { 98 | background-color: #fff; 99 | } 100 | 101 | .padding10 { 102 | padding: 10px; 103 | } 104 | 105 | .padding0 { 106 | padding: 0; 107 | } 108 | 109 | .pt10 { 110 | padding: 10px; 111 | } 112 | 113 | .pl10 { 114 | padding-left: 10px; 115 | } 116 | 117 | .pr10 { 118 | padding-right: 10px; 119 | } 120 | 121 | .pb10 { 122 | padding-bottom: 10px; 123 | } 124 | 125 | .margin10 { 126 | margin: 10px; 127 | } 128 | 129 | .margin0 { 130 | margin: 0; 131 | } 132 | 133 | .mt10 { 134 | margin-top: 10px; 135 | } 136 | 137 | .ml10 { 138 | margin-left: 10px; 139 | } 140 | 141 | .mb10 { 142 | margin-bottom: 10px; 143 | } 144 | 145 | .mr10 { 146 | margin-right: 10px; 147 | } 148 | 149 | .border-none { 150 | border: none; 151 | } 152 | 153 | .clamp2 { 154 | display: -webkit-box; 155 | -webkit-line-clamp: 2; 156 | overflow: hidden; 157 | -webkit-box-orient: vertical; 158 | text-overflow: ellipsis; 159 | } 160 | 161 | .uppercase { 162 | text-transform: uppercase; 163 | } 164 | 165 | .lowercase { 166 | text-transform: lowercase; 167 | } 168 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/common.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | if (!quick.os.h5) { 3 | document.querySelector('.mui-content').style.paddingTop = 0; 4 | } else { 5 | var html = ' \ 6 | \ 11 | '; 12 | 13 | var fileName = window.location.href.match(/([^/]+).html/)[1]; 14 | 15 | if (!fileName || fileName === 'index') { 16 | fileName = 'Quick Hybrid API'; 17 | } 18 | 19 | html = html.replace('{{TITLE}}', fileName); 20 | 21 | var div = document.createElement('div'); 22 | 23 | div.innerHTML = html; 24 | 25 | document.body.insertBefore(div, document.body.children[0]); 26 | document.querySelector('.mui-content').style.paddingTop = '45px'; 27 | } 28 | 29 | mui('.mui-table-view').on('tap', '.api-class', function() { 30 | window.runApi && runApi(this.id); 31 | }); 32 | 33 | window.showTips = function(msg, isAlert) { 34 | if (isAlert) { 35 | quick.ui.alert(msg, '提示'); 36 | } else { 37 | quick.ui.toast(msg); 38 | } 39 | }; 40 | })(); -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/mui.poppicker/mui.poppicker.css: -------------------------------------------------------------------------------- 1 | .mui-poppicker { 2 | position: fixed; 3 | left: 0px; 4 | width: 100%; 5 | z-index: 999; 6 | background-color: #eee; 7 | border-top: solid 1px #ccc; 8 | box-shadow: 0px -5px 7px 0px rgba(0, 0, 0, 0.1); 9 | -webkit-transition: .3s; 10 | bottom: 0px; 11 | -webkit-transform: translateY(300px); 12 | } 13 | 14 | .mui-poppicker.mui-active { 15 | -webkit-transform: translateY(0px); 16 | } 17 | 18 | .mui-android-5-1 .mui-poppicker { 19 | bottom: -300px; 20 | -webkit-transition-property: bottom; 21 | -webkit-transform: none; 22 | } 23 | 24 | .mui-android-5-1 .mui-poppicker.mui-active { 25 | bottom: 0px; 26 | -webkit-transition-property: bottom; 27 | -webkit-transform: none; 28 | } 29 | 30 | .mui-poppicker-header { 31 | padding: 6px; 32 | font-size: 14px; 33 | color: #888; 34 | } 35 | 36 | .mui-poppicker-header .mui-btn { 37 | font-size: 12px; 38 | padding: 5px 10px; 39 | } 40 | 41 | .mui-poppicker-btn-cancel { 42 | float: left; 43 | } 44 | 45 | .mui-poppicker-btn-ok { 46 | float: right; 47 | } 48 | 49 | .mui-poppicker-clear { 50 | clear: both; 51 | height: 0px; 52 | line-height: 0px; 53 | font-size: 0px; 54 | overflow: hidden; 55 | } 56 | 57 | .mui-poppicker-body { 58 | position: relative; 59 | width: 100%; 60 | height: 200px; 61 | border-top: solid 1px #ddd; 62 | /*-webkit-perspective: 1200px; 63 | perspective: 1200px; 64 | -webkit-transform-style: preserve-3d; 65 | transform-style: preserve-3d;*/ 66 | } 67 | 68 | .mui-poppicker-body .mui-picker { 69 | width: 100%; 70 | height: 100%; 71 | margin: 0px; 72 | border: none; 73 | float: left; 74 | } -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/mui.poppicker/mui.poppicker.min.css: -------------------------------------------------------------------------------- 1 | .mui-poppicker{position:fixed;left:0;width:100%;z-index:999;background-color:#eee;border-top:solid 1px #ccc;box-shadow:0 -5px 7px 0 rgba(0,0,0,.1);-webkit-transition:.3s;bottom:0;-webkit-transform:translateY(300px)}.mui-poppicker.mui-active{-webkit-transform:translateY(0)}.mui-android-5-1 .mui-poppicker{bottom:-300px;-webkit-transition-property:bottom;-webkit-transform:none}.mui-android-5-1 .mui-poppicker.mui-active{bottom:0;-webkit-transition-property:bottom;-webkit-transform:none}.mui-poppicker-header{padding:6px;font-size:14px;color:#888}.mui-poppicker-header .mui-btn{font-size:12px;padding:5px 10px}.mui-poppicker-btn-cancel{float:left}.mui-poppicker-btn-ok{float:right}.mui-poppicker-clear{clear:both;height:0;line-height:0;font-size:0;overflow:hidden}.mui-poppicker-body{position:relative;width:100%;height:200px;border-top:solid 1px #ddd}.mui-poppicker-body .mui-picker{width:100%;height:100%;margin:0;border:none;float:left} -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/mui.poppicker/mui.poppicker.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){e.dom=function(i){return"string"!=typeof i?i instanceof Array||i[0]&&i.length?[].slice.call(i):[i]:(e.__create_dom_div__||(e.__create_dom_div__=t.createElement("div")),e.__create_dom_div__.innerHTML=i,[].slice.call(e.__create_dom_div__.childNodes))};var i='
\t\t
\t\t\t\t\t\t\t\t\t
\t\t
\t\t
\t\t
\t
',c='
\t\t
\t\t\t
\t\t\t\t\t\t
\t\t
\t
';e.PopPicker=e.Class.extend({init:function(c){var a=this;a.options=c||{},a.options.buttons=a.options.buttons||["取消","确定"],a.panel=e.dom(i)[0],t.body.appendChild(a.panel),a.ok=a.panel.querySelector(".mui-poppicker-btn-ok"),a.cancel=a.panel.querySelector(".mui-poppicker-btn-cancel"),a.body=a.panel.querySelector(".mui-poppicker-body"),a.mask=e.createMask(),a.cancel.innerText=a.options.buttons[0],a.ok.innerText=a.options.buttons[1],a.cancel.addEventListener("tap",function(e){a.hide()},!1),a.ok.addEventListener("tap",function(e){if(a.callback){var t=a.callback(a.getSelectedItems());t!==!1&&a.hide()}},!1),a.mask[0].addEventListener("tap",function(){a.hide()},!1),a._createPicker(),a.panel.addEventListener("touchstart",function(e){e.preventDefault()},!1),a.panel.addEventListener("touchmove",function(e){e.preventDefault()},!1)},_createPicker:function(){var t=this,i=t.options.layer||1,a=100/i+"%";t.pickers=[];for(var n=1;n<=i;n++){var s=e.dom(c)[0];s.style.width=a,t.body.appendChild(s);var r=e(s).picker();t.pickers.push(r),s.addEventListener("change",function(e){var t=this.nextSibling;if(t&&t.picker){var i=e.detail||{},c=i.item||{};t.picker.setItems(c.children)}},!1)}},setData:function(e){var t=this;e=e||[],t.pickers[0].setItems(e)},getSelectedItems:function(){var e=this,t=[];for(var i in e.pickers){var c=e.pickers[i];t.push(c.getSelectedItem()||{})}return t},show:function(i){var c=this;c.callback=i,c.mask.show(),t.body.classList.add(e.className("poppicker-active-for-page")),c.panel.classList.add(e.className("active")),c.__back=e.back,e.back=function(){c.hide()}},hide:function(){var i=this;i.disposed||(i.panel.classList.remove(e.className("active")),i.mask.close(),t.body.classList.remove(e.className("poppicker-active-for-page")),e.back=i.__back)},dispose:function(){var e=this;e.hide(),setTimeout(function(){e.panel.parentNode.removeChild(e.panel);for(var t in e)e[t]=null,delete e[t];e.disposed=!0},300)}})}(mui,document); -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/mui/fonts/mui.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quickhybrid/quickhybrid-android/e45a018fe57d0c1e6b9eeaea6092793ba4268a27/app/src/main/assets/examples/common/mui/fonts/mui.ttf -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/mui/mui.extend.css: -------------------------------------------------------------------------------- 1 | /** 2 | * 作者: 郭天琦 3 | * 创建时间: 2017/06/27 4 | * 版本: [1.0, 2017/06/27 ] 5 | * 版权: 江苏国泰新点软件有限公司 6 | * 描述: 拓展框架的一些通用样式 7 | * 为了方便维护,单独提取出来了,打包时会与mui.css合并 8 | */ 9 | 10 | ul, 11 | li { 12 | padding: 0; 13 | margin: 0; 14 | list-style: none; 15 | } 16 | 17 | em, 18 | u { 19 | font-style: normal; 20 | } 21 | 22 | .l { 23 | float: left; 24 | } 25 | 26 | .r { 27 | float: right; 28 | } 29 | 30 | .center-block { 31 | display: block; 32 | margin-left: auto; 33 | margin-right: auto; 34 | } 35 | 36 | .clearfix:before, 37 | .clearfix:after { 38 | display: table; 39 | line-height: 0; 40 | content: ""; 41 | } 42 | 43 | .clearfix:after { 44 | clear: both; 45 | } 46 | 47 | .hidden { 48 | display: none !important; 49 | } 50 | 51 | .invisible { 52 | visibility: hidden; 53 | } 54 | 55 | .can-select { 56 | -webkit-user-select: text; 57 | } 58 | 59 | .fullscreen { 60 | position: absolute; 61 | top: 0; 62 | right: 0; 63 | bottom: 0; 64 | left: 0; 65 | } 66 | 67 | .text-center { 68 | text-align: center !important; 69 | } 70 | 71 | .text-left { 72 | text-align: left !important; 73 | } 74 | 75 | .text-right { 76 | text-align: right !important; 77 | } 78 | 79 | .text-justify { 80 | text-align: justify !important; 81 | } 82 | 83 | .text-nowrap { 84 | white-space: nowrap !important; 85 | } 86 | 87 | .text-ellipsis { 88 | white-space: nowrap; 89 | text-overflow: ellipsis; 90 | overflow: hidden; 91 | } 92 | 93 | .bg-gray { 94 | background-color: #f5f5f5; 95 | } 96 | 97 | .bg-white { 98 | background-color: #fff; 99 | } 100 | 101 | .padding10 { 102 | padding: 10px; 103 | } 104 | 105 | .padding0 { 106 | padding: 0; 107 | } 108 | 109 | .pt10 { 110 | padding: 10px; 111 | } 112 | 113 | .pl10 { 114 | padding-left: 10px; 115 | } 116 | 117 | .pr10 { 118 | padding-right: 10px; 119 | } 120 | 121 | .pb10 { 122 | padding-bottom: 10px; 123 | } 124 | 125 | .margin10 { 126 | margin: 10px; 127 | } 128 | 129 | .margin0 { 130 | margin: 0; 131 | } 132 | 133 | .mt10 { 134 | margin-top: 10px; 135 | } 136 | 137 | .ml10 { 138 | margin-left: 10px; 139 | } 140 | 141 | .mb10 { 142 | margin-bottom: 10px; 143 | } 144 | 145 | .mr10 { 146 | margin-right: 10px; 147 | } 148 | 149 | .border-none { 150 | border: none; 151 | } 152 | 153 | .clamp2 { 154 | display: -webkit-box; 155 | -webkit-line-clamp: 2; 156 | overflow: hidden; 157 | -webkit-box-orient: vertical; 158 | text-overflow: ellipsis; 159 | } 160 | 161 | .uppercase { 162 | text-transform: uppercase; 163 | } 164 | 165 | .lowercase { 166 | text-transform: lowercase; 167 | } 168 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/common/mui/mui修改记录.md: -------------------------------------------------------------------------------- 1 | ### mui重新编译修改记录 2 | 3 | 在集成到`hybrid`框架时,mui中有很多功能可以进行删除或者独立提取,以此来减少核心代码的体积,以下是修改记录 4 | 5 | 项目svn: `svn://192.168.0.51/2014/T10/新点微门户平台/trunk/dcloud/跨平台框架/code/mui` 6 | 7 | #### 删除的文件 8 | 9 | | 文件名| 功能 | 删除原因| 10 | | :------------- |:-------------:| -----:| 11 | | xxx.5+.js | 5+相关的js文件 | 遗弃5+ | 12 | | mui.dialog.xxx.js | mui的弹窗 | 采用ejs的弹窗 | 13 | | mui.popup.js | mui模拟弹窗的实现 | 采用ejs的弹窗 | 14 | | mui.pullrefresh.js | mui的下拉刷新 | 采用框架基于IScroll5的下拉刷新 | 15 | | mui.class.scroll.pullrefresh.js | iscroll里的下拉刷新实现 | 遗弃mui下拉刷新 | 16 | | mui.init.pullrefresh.js | 下拉刷新初始化相关 | 遗弃mui下拉刷新 | 17 | | mui.jsonp.js | mui ajax的jsonp实现 | 采用CROS方法 | 18 | | mui.transparent.js | mui 头部渐变功能 | 采用原生导航栏 | 19 | | mui.ajax.js | ajax请求 | 改用了Zepto的ajax | 20 | 21 | #### 提取的文件 22 | 23 | 将一些不常用的组件提取出去,单独按需引入 24 | 25 | | 文件名| 功能 | 提取原因| 26 | | :------------- |:-------------:| -----:| 27 | | mui.offcanvas.js | 侧滑相关 | 侧滑很少用到 | 28 | 29 | #### 修改的文件 30 | 31 | | 文件名| 功能 | 修改原因| 32 | | :------------- |:-------------:| -----:| 33 | | mui.class.js | mui的基础类 | 修改严格模式下的calllee报错 | 34 | | tableviews.js | 包括一些列表ui等操作 | 兼容严格模式 | 35 | | mui.js | mui核心代码 | 在es6下暴露mui全局变量 | 36 | | mui.class.scroll.js | mui的iscroll4代码 | 兼容严格模式 | 37 | | mui.init.js | mui的init文件 | 删除iframe创建代码 | 38 | | input.plugin.js | input的插件 | 删除5+相关的语言插件功能 | 39 | 40 | 41 | ### 更新记录 42 | 43 | * 2017/06/06 44 | * 重新编译mui.js 45 | * 去除了5+代码 46 | * 去除了下拉刷新,去除了弹窗相关 47 | * 将offcanvas等单独提取 48 | * 兼容严格模式,修改mui.class、scroll、tableview、ajax等文件 49 | * 2017/06/16 50 | * init文件删除iframe代码 -------------------------------------------------------------------------------- /app/src/main/assets/examples/h5/fileinput2.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | File Input 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Quick Hybrid API 11 | 12 | 13 | 14 | 15 | 16 |
17 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/promise.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Promise调用 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /app/src/main/assets/examples/simple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 示例页面 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/assets/modules.properties: -------------------------------------------------------------------------------- 1 | ui = com.quick.jsbridge.api.UIApi 2 | page = com.quick.jsbridge.api.PageApi 3 | pay = com.quick.quickhybrid.api.PayApi -------------------------------------------------------------------------------- /app/src/main/java/com/quick/quickhybrid/AboutActivity.java: -------------------------------------------------------------------------------- 1 | package com.quick.quickhybrid; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import com.quick.core.baseapp.baseactivity.FrmBaseActivity; 7 | 8 | public class AboutActivity extends FrmBaseActivity { 9 | 10 | 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setLayout(R.layout.about_activity); 16 | 17 | setTitle(getString(R.string.about_title)); 18 | 19 | } 20 | 21 | public static void go(Context context) { 22 | context.startActivity(new Intent(context, AboutActivity.class)); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/quick/quickhybrid/AppApplication.java: -------------------------------------------------------------------------------- 1 | package com.quick.quickhybrid; 2 | 3 | 4 | import com.quick.core.application.FrmApplication; 5 | import com.quick.core.baseapp.theme.BaseThemeControl; 6 | 7 | 8 | public class AppApplication extends FrmApplication { 9 | 10 | @Override 11 | public void onCreate() { 12 | super.onCreate(); 13 | 14 | if (BuildConfig.BUILD_TYPE.equals("release")) { 15 | // 可以防止二次打包 16 | 17 | } else { 18 | 19 | //保存所有log日志,调试时可开启,正式包不允许开启 20 | // LogUtil.autoLog(); 21 | 22 | //开启ButterKnife的日志输出 23 | // ButterKnife.setDebug(true); 24 | 25 | //是否开启下载日志 26 | // FileDownloadLog.NEED_LOG = true; 27 | 28 | 29 | } 30 | 31 | //初始化默认主题 32 | BaseThemeControl.getInstance().initTheme(BaseThemeControl.getDefaultThemes()); 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/quick/quickhybrid/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.quick.quickhybrid; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | 7 | import com.google.zxing.integration.android.IntentIntegrator; 8 | import com.google.zxing.integration.android.IntentResult; 9 | import com.quick.core.baseapp.baseactivity.FrmBaseActivity; 10 | import com.quick.core.baseapp.component.scan.ScanCaptureActivity; 11 | import com.quick.core.ui.widget.ToastUtil; 12 | import com.quick.jsbridge.bean.QuickBean; 13 | import com.quick.jsbridge.view.QuickWebLoader; 14 | 15 | import butterknife.OnClick; 16 | 17 | public class MainActivity extends FrmBaseActivity { 18 | 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setLayout(R.layout.activity_main); 24 | 25 | pageControl.getNbBar().hideNbBack(); 26 | setTitle("Quick Hybrid"); 27 | } 28 | 29 | 30 | @OnClick(R.id.btn) 31 | public void openPage() { 32 | // 打开一个新的混合开发页面 33 | ToastUtil.toastShort(MainActivity.this, "open2"); 34 | 35 | Intent mintent = new Intent(MainActivity.this, QuickWebLoader.class); 36 | QuickBean bean = new QuickBean("file:///android_asset/examples/index.html"); 37 | mintent.putExtra("bean", bean); 38 | startActivity(mintent); 39 | } 40 | 41 | @OnClick(R.id.btn_scan) 42 | public void scan() { 43 | IntentIntegrator integrator = null; 44 | Activity activity = MainActivity.this; 45 | 46 | integrator = new IntentIntegrator(activity); 47 | 48 | if (integrator != null) { 49 | integrator.setCaptureActivity(ScanCaptureActivity.class); 50 | integrator.initiateScan(); 51 | } 52 | } 53 | 54 | @OnClick(R.id.btn_about) 55 | public void about() { 56 | AboutActivity.go(MainActivity.this); 57 | } 58 | 59 | @Override 60 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 61 | if (resultCode == RESULT_OK) { 62 | 63 | if (requestCode == IntentIntegrator.REQUEST_CODE) { 64 | // 扫描二维码回传值 65 | IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 66 | String ewmString = result.getContents(); 67 | 68 | Intent mintent = new Intent(MainActivity.this, QuickWebLoader.class); 69 | QuickBean bean = new QuickBean(ewmString); 70 | mintent.putExtra("bean", bean); 71 | startActivity(mintent); 72 | } 73 | } 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/quick/quickhybrid/api/PayApi.java: -------------------------------------------------------------------------------- 1 | package com.quick.quickhybrid.api; 2 | 3 | import android.webkit.WebView; 4 | 5 | import com.quick.jsbridge.bridge.Callback; 6 | import com.quick.jsbridge.bridge.IBridgeImpl; 7 | import com.quick.jsbridge.view.IQuickFragment; 8 | 9 | import org.json.JSONObject; 10 | 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | 15 | /** 16 | * Created by dailichun on 2017/12/6. 17 | * 测试的支付组件(自定义)API 18 | */ 19 | public class PayApi implements IBridgeImpl { 20 | 21 | /** 22 | * 注册API的别名 23 | */ 24 | public static String RegisterName = "pay"; 25 | 26 | /** 27 | * 测试支付 28 | *

29 | * 返回: 30 | * access_token 31 | */ 32 | public static void testPay(IQuickFragment webLoader, WebView wv, JSONObject param, Callback callback) { 33 | Map map = new HashMap<>(); 34 | map.put("message", "pay success"); 35 | callback.applySuccess(map); 36 | } 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 22 |