├── .gitignore ├── .idea ├── caches │ └── build_file_checksums.ser ├── gradle.xml ├── misc.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── debug │ └── output-metadata.json ├── gradlew ├── gradlew.bat ├── local.properties ├── multidex-config.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── pandamvp │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── pandamvp │ │ │ ├── EmptyLauncherActivity.kt │ │ │ ├── base │ │ │ ├── Constants.kt │ │ │ └── app │ │ │ │ ├── AppLifecycle.kt │ │ │ │ └── LifeCycleInjector.kt │ │ │ ├── template │ │ │ ├── AppBaseActivity.kt │ │ │ ├── AppBaseFragment.kt │ │ │ ├── AppBasePresenter.kt │ │ │ └── refresh │ │ │ │ ├── AppBaseRefreshActivity.kt │ │ │ │ ├── AppBaseRefreshFragment.kt │ │ │ │ └── AppBaseRefreshPresenter.kt │ │ │ └── wxapi │ │ │ └── WXPayEntryActivity.java │ └── res │ │ ├── drawable-hdpi │ │ ├── ic_action_arrow_left.png │ │ └── shadow.png │ │ ├── drawable-xhdpi │ │ ├── ic_action_arrow_left.png │ │ └── shadow.png │ │ ├── drawable-xxhdpi │ │ ├── ic_action_arrow_left.png │ │ └── shadow.png │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── shadow_left.png │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ └── navigation_home.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── pandamvp │ └── ExampleUnitTest.java ├── app_bmodule ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── app_bmodule │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── app_bmodule │ │ │ ├── MainActivity.kt │ │ │ └── app │ │ │ ├── Constant.java │ │ │ └── lifecycle │ │ │ ├── ActivityLifeCycle.java │ │ │ ├── AppLifeCycle.java │ │ │ ├── FragmentLifeCycle.java │ │ │ └── LifeCycleInjector.java │ └── res │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── b_activity_main.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── app_bmodule │ └── ExampleUnitTest.kt ├── app_jetpack ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── app_jetpack │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── app_jetpack │ │ │ ├── MainActivity.kt │ │ │ └── app │ │ │ ├── Constant.java │ │ │ ├── TestTask.java │ │ │ ├── entity │ │ │ ├── Response.kt │ │ │ └── WanApiData.kt │ │ │ ├── lifecycle │ │ │ ├── ActivityLifeCycle.java │ │ │ ├── AppLifeCycle.java │ │ │ ├── FragmentLifeCycle.java │ │ │ └── LifeCycleInjector.java │ │ │ ├── net │ │ │ ├── ApiService.kt │ │ │ ├── AppCallBack.kt │ │ │ └── ExceptionCode.java │ │ │ └── ui │ │ │ ├── adapters │ │ │ └── ZhihuNewsAdapter.kt │ │ │ ├── base │ │ │ └── BaseViewModel.kt │ │ │ └── zhihu │ │ │ ├── ZhihuListActivity.kt │ │ │ └── ZhihuViewModel.kt │ └── res │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── a_activity_main.xml │ │ ├── a_activity_zhihu_list.xml │ │ ├── a_item_zhihu.xml │ │ └── a_motion_layout.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── app_jetpack │ └── ExampleUnitTest.kt ├── app_launcher ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── app_launcher │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── app_launcher │ │ │ ├── app │ │ │ ├── ActivityLifeCycle.java │ │ │ ├── AppLifeCycle.java │ │ │ ├── Constant.java │ │ │ ├── FragmentLifeCycle.java │ │ │ └── LifeCycleInjector.java │ │ │ ├── entites │ │ │ ├── WanApiData.kt │ │ │ ├── WxArticle.kt │ │ │ └── Zhihu.kt │ │ │ ├── framework │ │ │ ├── AppBaseActivity.kt │ │ │ ├── AppBaseFragment.kt │ │ │ ├── AppBasePresenter.kt │ │ │ └── refresh │ │ │ │ ├── AppBaseRefreshActivity.kt │ │ │ │ ├── AppBaseRefreshFragment.kt │ │ │ │ └── AppBaseRefreshPresenter.kt │ │ │ ├── net │ │ │ ├── ApiService.java │ │ │ ├── AppCallBack.kt │ │ │ ├── ExceptionCode.java │ │ │ └── intercepter │ │ │ │ └── DelayRequestInterceptor.kt │ │ │ └── ui │ │ │ ├── home │ │ │ └── HomeActivity.kt │ │ │ ├── launch │ │ │ ├── FlashActivity.kt │ │ │ ├── FlashPresenter.kt │ │ │ └── IFlashView.kt │ │ │ └── zhihu │ │ │ ├── IZhihuView.kt │ │ │ ├── ZhihuListActivity.kt │ │ │ └── ZhihuListPresenter.kt │ └── res │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ ├── icon_panda_01.png │ │ ├── icon_panda_02.png │ │ ├── icon_panda_03.png │ │ ├── icon_panda_04.png │ │ ├── icon_panda_05.png │ │ ├── icon_panda_06.png │ │ ├── icon_panda_07.png │ │ └── icon_panda_08.png │ │ ├── layout │ │ ├── launcher_activity_flash.xml │ │ ├── launcher_activity_home.xml │ │ ├── launcher_activity_list_test.xml │ │ ├── launcher_activity_plan_b.xml │ │ ├── launcher_activity_zhihu_list.xml │ │ ├── launcher_item_homepage.xml │ │ └── launcher_item_zhihu.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── app_launcher │ └── ExampleUnitTest.java ├── build.gradle ├── components_app_build.gradle ├── config.gradle ├── database ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── router │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── router │ │ │ ├── common │ │ │ ├── Configs.kt │ │ │ ├── NotFoundPage.kt │ │ │ └── PubData.kt │ │ │ ├── database │ │ │ ├── dao │ │ │ │ ├── ConfigDataDao.java │ │ │ │ ├── DaoMaster.java │ │ │ │ └── DaoSession.java │ │ │ ├── entity │ │ │ │ └── ConfigData.java │ │ │ └── helper │ │ │ │ └── ConfigTbHelper.kt │ │ │ └── route │ │ │ ├── RouterPath.kt │ │ │ ├── degrade │ │ │ └── DegradeServiceImpl.kt │ │ │ ├── interceptor │ │ │ └── RouteInterceptor.kt │ │ │ └── service │ │ │ ├── AModuleService.kt │ │ │ └── BModuleService.kt │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── router │ └── ExampleUnitTest.java ├── functionlibs └── pay │ ├── .gitignore │ ├── build.gradle │ ├── libs │ └── alipaySdk-20180601.jar │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── thirdsdk │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── mobilepay │ │ │ ├── PayCallBack.java │ │ │ ├── PayType.java │ │ │ ├── PayUtils.java │ │ │ ├── alipay │ │ │ ├── AliPay.java │ │ │ ├── AliPayData.java │ │ │ └── PayResult.java │ │ │ └── wechatpay │ │ │ ├── WeChatPay.java │ │ │ ├── WeChatPayActivity.java │ │ │ └── WeChatPayData.java │ └── res │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── thirdsdk │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystore.jks ├── sdk_core ├── .gitignore ├── README.md ├── build.gradle ├── libs │ ├── BaiduLBS_Android.jar │ └── armeabi │ │ ├── libBaiduMapSDK_base_v7_3_0.so │ │ ├── libBaiduMapSDK_map_for_bikenavi_v7_3_0.so │ │ ├── libgnustl_shared.so │ │ ├── liblocSDK8a.so │ │ └── libmtttrace.so ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── pandaq │ │ └── appcore │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── pandaq │ │ │ └── appcore │ │ │ ├── api │ │ │ ├── Entity.kt │ │ │ ├── Rows.kt │ │ │ └── SdsCallback.kt │ │ │ ├── browser │ │ │ ├── HtmlMaker.java │ │ │ ├── PandaReaderView.kt │ │ │ ├── ProcessWebView.kt │ │ │ ├── WebFragment.kt │ │ │ └── bridge │ │ │ │ ├── BridgeData.kt │ │ │ │ └── JavaScriptApis.kt │ │ │ ├── cache │ │ │ ├── CacheTool.java │ │ │ ├── CacheUtils.java │ │ │ ├── DiskLruCache.java │ │ │ └── StrictLineReader.java │ │ │ ├── event │ │ │ ├── ApiConfigChange.kt │ │ │ ├── NetworkChange.kt │ │ │ └── NetworkState.kt │ │ │ ├── framework │ │ │ ├── annotation │ │ │ │ └── DateFormatStr.java │ │ │ └── app │ │ │ │ ├── ActivityTask.java │ │ │ │ ├── BaseApp.java │ │ │ │ ├── lifecycle │ │ │ │ ├── IAppLifeCycle.java │ │ │ │ ├── ILifecycleInjector.java │ │ │ │ └── ManifestParser.java │ │ │ │ └── lifecycleimpl │ │ │ │ ├── AppProxy.kt │ │ │ │ └── DefaultActivityLifecycle.java │ │ │ ├── imageloader │ │ │ ├── ImageUtils.java │ │ │ ├── PicLoaderConfig.java │ │ │ ├── core │ │ │ │ ├── IExecutor.java │ │ │ │ ├── ILoadCallBack.java │ │ │ │ ├── PicLoader.java │ │ │ │ ├── Request.java │ │ │ │ └── ScaleType.java │ │ │ └── glide │ │ │ │ ├── BlurTransformation.java │ │ │ │ ├── GlideLoader.java │ │ │ │ └── LocalGlideModule.java │ │ │ ├── log │ │ │ ├── PLogger.java │ │ │ └── bugly │ │ │ │ └── CrashCallback.kt │ │ │ ├── permission │ │ │ ├── Action.java │ │ │ ├── Executor.java │ │ │ ├── ISettingAction.java │ │ │ ├── PermissionActivity.java │ │ │ ├── Rationale.java │ │ │ ├── RequestBuilder.java │ │ │ ├── RtPermission.java │ │ │ ├── SettingActionImp.java │ │ │ ├── SettingDialogUtils.java │ │ │ ├── install │ │ │ │ ├── BaseInstallRequest.java │ │ │ │ ├── FileProvider.java │ │ │ │ ├── InstallRequest.java │ │ │ │ ├── NInstallRequest.java │ │ │ │ └── OInstallRequest.java │ │ │ ├── runtime │ │ │ │ ├── BaseRuntimeRequest.java │ │ │ │ ├── LRuntimeRequest.java │ │ │ │ ├── MRuntimeRequest.java │ │ │ │ └── RuntimeRequest.java │ │ │ ├── source │ │ │ │ ├── ContextSource.java │ │ │ │ └── Source.java │ │ │ └── test │ │ │ │ ├── AddVoiceMailTest.java │ │ │ │ ├── CalendarReadTest.java │ │ │ │ ├── CalendarWriteTest.java │ │ │ │ ├── CallLogReadTest.java │ │ │ │ ├── CallLogWriteTest.java │ │ │ │ ├── CameraTest.java │ │ │ │ ├── ContactsReadTest.java │ │ │ │ ├── ContactsWriteTest.java │ │ │ │ ├── LocationTest.java │ │ │ │ ├── PermissionTest.java │ │ │ │ ├── PhoneStateReadTest.java │ │ │ │ ├── RecordAudioTest.java │ │ │ │ ├── SensorsTest.java │ │ │ │ ├── SipTest.java │ │ │ │ ├── SmsReadTest.java │ │ │ │ ├── StorageReadTest.java │ │ │ │ ├── StorageWriteTest.java │ │ │ │ └── checker │ │ │ │ ├── DoubleChecker.java │ │ │ │ ├── PermissionChecker.java │ │ │ │ ├── RealChecker.java │ │ │ │ └── SystemChecker.java │ │ │ ├── service │ │ │ ├── IUpdateService.kt │ │ │ ├── UpdateService.java │ │ │ └── UpdateServiceHelper.kt │ │ │ └── utils │ │ │ ├── CameraUtils.kt │ │ │ ├── EventUtils.java │ │ │ ├── FixedCountDownTimer.java │ │ │ ├── NetWorkUtils.kt │ │ │ ├── StorageUtils.java │ │ │ ├── UpdateUtils.kt │ │ │ ├── crypto │ │ │ ├── CodeFactory.java │ │ │ ├── CodeType.java │ │ │ └── coders │ │ │ │ ├── AESCoder.java │ │ │ │ ├── Base64Coder.java │ │ │ │ ├── DesCoder.java │ │ │ │ ├── Md5Coder.java │ │ │ │ └── SHA1Coder.java │ │ │ ├── ext │ │ │ └── Ext.kt │ │ │ ├── format │ │ │ ├── FormatFactory.java │ │ │ └── formaters │ │ │ │ ├── DateFormatter.java │ │ │ │ ├── NumInputFormatter.java │ │ │ │ ├── PriceFormatter.java │ │ │ │ └── SizeFormatter.java │ │ │ ├── regex │ │ │ ├── RegexConstants.java │ │ │ └── RegexUtils.java │ │ │ ├── sharepreference │ │ │ ├── Constant.kt │ │ │ └── PreferenceUtil.kt │ │ │ └── system │ │ │ ├── AppUtils.java │ │ │ ├── ContactUtils.java │ │ │ ├── DisplayUtils.java │ │ │ ├── FileUtils.java │ │ │ ├── ResourceUtils.java │ │ │ └── SoftInputUtils.java │ └── res │ │ ├── anim │ │ ├── core_setting_dialog_appear.xml │ │ ├── core_setting_dialog_disappear.xml │ │ ├── swipe_back_slide_right_in.xml │ │ └── swipe_back_slide_right_out.xml │ │ ├── drawable │ │ ├── core_webview_process_state.xml │ │ └── shadow_left.png │ │ ├── values │ │ ├── attrs_theme.xml │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── core_permission_file_path.xml │ │ └── network_security_config.xml │ └── test │ └── java │ └── com │ └── pandaq │ └── appcore │ └── ExampleUnitTest.java ├── settings.gradle └── uires ├── .gitignore ├── build.gradle ├── gradlew ├── gradlew.bat ├── libs └── core_3.0.1.jar ├── proguard-rules.pro └── src ├── androidTest └── java │ └── com │ └── pandaq │ └── uires │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── java │ └── com │ │ └── pandaq │ │ └── uires │ │ ├── commonpage │ │ ├── html │ │ │ ├── HtmlActivity.kt │ │ │ └── HtmlNoTitleActivity.kt │ │ └── notfound │ │ │ └── NotFoundActivity.kt │ │ ├── configs │ │ ├── SnackerConfig.kt │ │ ├── ToastConfig.kt │ │ └── UiConfigs.kt │ │ ├── lifecycle │ │ ├── LifeCycleInjector.java │ │ └── ResAppLifeCycle.java │ │ ├── loading │ │ ├── LoadingDialog.java │ │ ├── LoadingDialogUtil.java │ │ └── LoadingView.java │ │ ├── msgwindow │ │ ├── Snacker.java │ │ └── Toaster.java │ │ ├── mvp │ │ ├── BaseActivity.kt │ │ ├── BaseFragment.kt │ │ ├── core │ │ │ ├── BasePresenter.kt │ │ │ ├── CoreBaseActivity.kt │ │ │ ├── CoreBaseFragment.kt │ │ │ ├── IListVIew.kt │ │ │ └── IView.kt │ │ └── refresh │ │ │ ├── BaseRefreshActivity.kt │ │ │ └── BaseRefreshFragment.kt │ │ ├── popupwindows │ │ ├── ItemData.java │ │ ├── ListSelectPopupWindow.java │ │ └── adapters │ │ │ ├── AbsPopupSelectAdapter.kt │ │ │ └── ListSelectAdapter.java │ │ ├── router │ │ ├── RouteRoot.kt │ │ ├── degrade │ │ │ └── DegradeServiceImpl.kt │ │ └── service │ │ │ ├── ICashierService.kt │ │ │ └── IUserService.kt │ │ ├── update │ │ ├── ProgressButton.kt │ │ └── UpdatePopup.kt │ │ ├── utils │ │ ├── Ext.kt │ │ ├── Glide4Engine.java │ │ ├── SpanClickListener.kt │ │ ├── TextClickSpan.kt │ │ └── picker │ │ │ ├── PickerItem.kt │ │ │ └── PickerUtils.java │ │ ├── widget │ │ ├── CountChangeView.java │ │ ├── ExpandTextView.java │ │ ├── FlowTabLayout.kt │ │ ├── MaxHeightScrollView.kt │ │ ├── MultiRadioGroup.java │ │ ├── RationFrameLayout.kt │ │ ├── ShadowLayout.java │ │ ├── banner │ │ │ ├── Banner.java │ │ │ ├── SelfLoopTimeItem.kt │ │ │ ├── adapter │ │ │ │ ├── BannerAdapter.java │ │ │ │ └── BannerImageAdapter.java │ │ │ ├── config │ │ │ │ ├── BannerConfig.java │ │ │ │ └── IndicatorConfig.java │ │ │ ├── holder │ │ │ │ ├── BannerImageHolder.java │ │ │ │ └── IViewHolder.java │ │ │ ├── indicator │ │ │ │ ├── BaseIndicator.java │ │ │ │ ├── CircleIndicator.java │ │ │ │ ├── DrawableIndicator.java │ │ │ │ ├── Indicator.java │ │ │ │ ├── RectangleIndicator.java │ │ │ │ └── RoundLinesIndicator.java │ │ │ ├── itemdecoration │ │ │ │ └── MarginDecoration.java │ │ │ ├── listener │ │ │ │ ├── OnBannerListener.java │ │ │ │ └── OnPageChangeListener.java │ │ │ ├── transformer │ │ │ │ ├── AlphaPageTransformer.java │ │ │ │ ├── BasePageTransformer.java │ │ │ │ ├── DepthPageTransformer.java │ │ │ │ ├── MZScaleInTransformer.java │ │ │ │ ├── RotateDownPageTransformer.java │ │ │ │ ├── RotateUpPageTransformer.java │ │ │ │ ├── RotateYTransformer.java │ │ │ │ ├── ScaleInTransformer.java │ │ │ │ └── ZoomOutPageTransformer.java │ │ │ └── util │ │ │ │ ├── BannerLifecycleObserver.java │ │ │ │ ├── BannerLifecycleObserverAdapter.java │ │ │ │ ├── BannerUtils.java │ │ │ │ ├── LogUtils.java │ │ │ │ └── ScrollSpeedManger.java │ │ ├── cardview │ │ │ ├── PandaCardView.java │ │ │ ├── PandaCardViewDelegate.java │ │ │ ├── PandaCardViewEclairMr1.java │ │ │ ├── PandaCardViewImpl.java │ │ │ ├── PandaCardViewJellybeanMr1.java │ │ │ ├── PandaNestedCardView.java │ │ │ └── PandaRoundRectDrawableWithShadow.java │ │ ├── floatingmenu │ │ │ ├── AddFloatingActionButton.java │ │ │ ├── FloatingActionButton.java │ │ │ ├── FloatingActionsMenu.java │ │ │ └── TouchDelegateGroup.java │ │ ├── guide │ │ │ └── GuideCoverView.java │ │ ├── imageview │ │ │ ├── RatioImageView.java │ │ │ ├── RoundImageView.java │ │ │ ├── ShadowImageView.java │ │ │ └── round │ │ │ │ └── AbsRoundImageView.java │ │ ├── marqueeview │ │ │ ├── IMarqueeItem.kt │ │ │ ├── LoopLayoutManager.kt │ │ │ └── MarqueeView.kt │ │ ├── numberkeyboard │ │ │ ├── NumberInputListener.kt │ │ │ └── NumberKeyboard.kt │ │ ├── popup │ │ │ ├── EditNoticePopup.kt │ │ │ ├── PandaXPopupCallback.kt │ │ │ └── PlayAdNoticePopup.kt │ │ ├── recyclerview │ │ │ ├── BindingQuickAdapter.kt │ │ │ ├── NestedScrollWhenTouchRecyclerView.kt │ │ │ ├── RefreshRecyclerView.java │ │ │ ├── decoration │ │ │ │ └── ItemDecoration.java │ │ │ ├── loadfooter │ │ │ │ ├── BallPulseView.java │ │ │ │ ├── PandaFooter.java │ │ │ │ └── PandaHeader.kt │ │ │ └── managers │ │ │ │ ├── NestedFlowLayoutManager.java │ │ │ │ ├── NoScrollLinearLayoutManager.kt │ │ │ │ └── NoScrollScrollGridLayoutManager.java │ │ ├── stateview │ │ │ ├── DefaultStateClickListener.kt │ │ │ ├── LoadState.kt │ │ │ └── StateLayout.kt │ │ └── toolbar │ │ │ └── CNToolbar.kt │ │ └── zxing │ │ ├── activity │ │ ├── CaptureActivity.java │ │ ├── CaptureFragment.kt │ │ └── ZxingUtils.java │ │ ├── camera │ │ ├── AutoFocusCallback.java │ │ ├── BitmapLuminanceSource.java │ │ ├── CameraConfigurationManager.java │ │ ├── CameraManager.java │ │ ├── FlashlightManager.java │ │ ├── PlanarYUVLuminanceSource.java │ │ └── PreviewCallback.java │ │ ├── decoding │ │ ├── CaptureActivityHandler.java │ │ ├── DecodeFormatManager.java │ │ ├── DecodeHandler.java │ │ ├── DecodeThread.java │ │ ├── FinishListener.java │ │ ├── InactivityTimer.java │ │ └── Intents.java │ │ ├── encoding │ │ └── EncodingHandler.java │ │ └── view │ │ ├── ViewfinderResultPointCallback.java │ │ └── ViewfinderView.java └── res │ ├── anim │ ├── res_dialog_appear.xml │ ├── res_dialog_disappear.xml │ ├── res_in_from_bottom.xml │ └── res_out_from_bottom.xml │ ├── color │ ├── res_checkable_text_color.xml │ ├── res_clickable_text_color_deep.xml │ └── res_clickable_text_color_light.xml │ ├── drawable-v21 │ ├── res_ripple_primary.xml │ ├── res_ripple_white.xml │ ├── res_stateful_ripple_eee_round_4.xml │ ├── res_stateful_ripple_green_round_8.xml │ ├── res_stateful_ripple_primary.xml │ ├── res_stateful_ripple_primary_round_4.xml │ ├── res_stateful_ripple_primary_round_8.xml │ ├── res_stateful_ripple_white.xml │ ├── res_stateful_ripple_white_round_20.xml │ ├── res_stateful_ripple_white_round_4.xml │ └── res_stateful_ripple_white_round_8.xml │ ├── drawable-xhdpi │ ├── fab_bg_mini.png │ ├── fab_bg_normal.png │ ├── ic_arrow_back.png │ ├── ic_arrow_back_ios.png │ ├── ic_arrow_back_ios_white.png │ ├── ic_toast_error.png │ ├── ic_toast_success.png │ ├── ic_toast_warning.png │ ├── icon_alipay.png │ ├── icon_arrow_gray.png │ ├── icon_checkbox_checked.png │ ├── icon_checkbox_normal.png │ ├── icon_clear.png │ ├── icon_count_decrease.webp │ ├── icon_count_increase.webp │ ├── icon_default_error.png │ ├── icon_default_holder.png │ ├── icon_menu_back.png │ ├── icon_menu_close.png │ ├── icon_menu_home.png │ ├── icon_wepay.png │ ├── img_holder_289x192.png │ ├── img_holder_550x225.png │ ├── img_holder_avatar.png │ ├── img_holder_full.png │ └── shadow.png │ ├── drawable-xxhdpi │ ├── fab_bg_mini.png │ ├── fab_bg_normal.png │ ├── ic_arrow_back.png │ ├── ic_arrow_back_ios.png │ ├── ic_arrow_back_ios_white.png │ ├── ic_toast_error.png │ ├── ic_toast_success.png │ ├── ic_toast_warning.png │ ├── icon_arrow_gray.png │ ├── icon_count_decrease.webp │ ├── icon_count_increase.webp │ └── shadow.png │ ├── drawable-xxxhdpi │ ├── ic_arrow_back.png │ ├── ic_arrow_back_ios.png │ ├── ic_arrow_back_ios_white.png │ ├── ic_toast_error.png │ ├── ic_toast_success.png │ ├── ic_toast_warning.png │ ├── icon_arrow_gray.png │ ├── icon_blue_closspe.png │ ├── icon_blue_expand.png │ ├── icon_count_decrease.webp │ ├── icon_count_increase.webp │ ├── pic_flash.jpg │ └── shadow.png │ ├── drawable │ ├── bg_banner_title_cover.xml │ ├── bg_shadow_pink.9.png │ ├── bg_shadow_white.9.png │ ├── default_loading.gif │ ├── icon_page_404.png │ ├── load_dialog_bg.xml │ ├── res_bg_check_item.xml │ ├── res_checkbox.xml │ ├── res_dividing_drawable.xml │ ├── res_loading_anim.xml │ ├── res_loading_icon.png │ ├── res_ripple_primary.xml │ ├── res_ripple_white.xml │ ├── res_round_6_pink.xml │ ├── res_round_6_white.xml │ ├── res_shape_999999_round_4.xml │ ├── res_shape_eee_round_4.xml │ ├── res_shape_primary_round_8.xml │ ├── res_shape_white_round_12.xml │ ├── res_shape_white_round_12_top.xml │ ├── res_stateful_ripple_primary.xml │ ├── res_stateful_ripple_primary_round_4.xml │ ├── res_stateful_ripple_primary_round_8.xml │ ├── res_stateful_ripple_red_round_4.xml │ ├── res_stateful_ripple_white.xml │ ├── res_stateful_ripple_white_round_20.xml │ ├── res_stateful_ripple_white_round_4.xml │ ├── res_stateful_ripple_white_round_8.xml │ ├── res_stoke_666_round_6_grey.xml │ ├── res_stoke_666_round_6_white.xml │ ├── res_stoke_red_round_4.xml │ ├── scan_light.png │ └── shape_notice_tag.xml │ ├── layout │ ├── activity_html.xml │ ├── activity_route_404.xml │ ├── camera.xml │ ├── default_empty_layout.xml │ ├── default_error_layout.xml │ ├── default_loading_layout.xml │ ├── default_neterror_layout.xml │ ├── default_refresh_view.xml │ ├── dialog_loading.xml │ ├── fragment_capture.xml │ ├── layout_common_views.xml │ ├── layout_expand_text.xml │ ├── layout_keyboard_with_input.xml │ ├── layout_menu.xml │ ├── no_view_page.xml │ ├── pickerview_layout.xml │ ├── popup_exit_notice.xml │ ├── popup_play_ad_notice.xml │ ├── popup_update.xml │ ├── popup_update_notice.xml │ ├── res_cn_title.xml │ ├── res_cn_toolbar.xml │ ├── res_common_title_bar.xml │ ├── res_count_view.xml │ ├── res_empty_view.xml │ ├── res_error_view.xml │ ├── res_item_gallery.xml │ ├── res_item_list_select_popup.xml │ ├── res_marquee_item.xml │ ├── res_panda_refresh_header.xml │ ├── res_popup_list_select.xml │ ├── res_refresh_recyclerview.xml │ ├── res_state_layout.xml │ └── view_number_keyboard.xml │ ├── raw │ └── beep.ogg │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── colors_theme.xml │ ├── dimens.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml └── test └── java └── com └── pandaq └── uires └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | ======= 10 | # built application files 11 | *.apk 12 | *.ap_ 13 | 14 | # files for the dex VM 15 | *.dex 16 | 17 | # Java class files 18 | *.class 19 | 20 | # generated files 21 | bin/ 22 | gen/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Eclipse project files 28 | .classpath 29 | .project 30 | 31 | # Proguard folder generated by Eclipse 32 | proguard/ 33 | 34 | # Intellij project files 35 | *.iml 36 | *.ipr 37 | *.iws 38 | .idea/ -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 说明文档 2 | 组件化思路参考文章 3 | ## app 不包含任何业务代码的壳工程 4 | ## sdk_core 5 | 基础 SDK 6 | ## uires 7 | 公共 ui 部分如全局的 titlebar 全局的弹窗风格等 8 | ## functionlibs 9 | 功能独立的功能组件库 10 | - pay 移动支付相关集成 `因微信支付 SDK 路径及类名限制使用微信支付必须在主 App java源码根目录新 11 | 建包 wxapi 再创建 WXPayEntryActivity.java 类继承 WeChatPayActivity manifest 中` 12 | ## components_app_build.gradle 13 | 组件 App 的公共 build.gradle 配置部分 14 | ## config.gradle 15 | 使用到的各种版本信息及依赖库信息统一管理配置文件 16 | ## gradle.properties 17 | 自定义 gradle 参数 18 | 19 | # 接入步骤 20 | 1、导入 sdk_code、uires、router、functionlibs 几个基础库 21 | 2、复制项目级别的 build.gradle、components_app_build.gradle、config.gradle 到新项目 22 | 3、复制 gradle.properties 配置内容到项目 23 | 4、业务组件增加 apply from: "../components_app_build.gradle" 24 | 5、app module build.gradle 和 manifest 文件参考 app module 进行修改 -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | ======= 10 | # built application files 11 | *.apk 12 | *.ap_ 13 | 14 | # files for the dex VM 15 | *.dex 16 | 17 | # Java class files 18 | *.class 19 | 20 | # generated files 21 | bin/ 22 | gen/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Eclipse project files 28 | .classpath 29 | .project 30 | 31 | # Proguard folder generated by Eclipse 32 | proguard/ 33 | 34 | # Intellij project files 35 | *.iml 36 | *.ipr 37 | *.iws 38 | .idea/ -------------------------------------------------------------------------------- /app/debug/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "com.pandaq.pandamvp", 8 | "variantName": "processDebugResources", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "versionCode": 10100, 14 | "versionName": "1.1.0", 15 | "outputFile": "sds_v1.1.0_dev.apk" 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /app/local.properties: -------------------------------------------------------------------------------- 1 | ## This file must *NOT* be checked into Version Control Systems, 2 | # as it contains information specific to your local configuration. 3 | # 4 | # Location of the SDK. This is only used by Gradle. 5 | # For customization when using a Version Control System, please read the 6 | # header note. 7 | #Tue Jul 17 15:53:57 CST 2018 8 | ndk.dir=D\:\\AndroidSDK\\ndk-bundle 9 | sdk.dir=D\:\\AndroidSDK 10 | isShellApp=true 11 | -------------------------------------------------------------------------------- /app/multidex-config.pro: -------------------------------------------------------------------------------- 1 | # https://www.apkdv.com/android-5-the-latest-solution-to-subcontract.html -------------------------------------------------------------------------------- /app/src/androidTest/java/com/pandaq/pandamvp/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp; 2 | 3 | import android.content.Context; 4 | 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | 8 | import androidx.test.InstrumentationRegistry; 9 | import androidx.test.ext.junit.runners.AndroidJUnit4; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() throws Exception { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getTargetContext(); 24 | 25 | assertEquals("com.pandaq.pandamvp", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/EmptyLauncherActivity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp 2 | 3 | import android.app.Activity 4 | import android.os.Bundle 5 | import com.alibaba.android.arouter.launcher.ARouter 6 | import com.pandaq.router.route.RouterPath 7 | 8 | /** 9 | * Created by huxinyu on 2019/6/3. 10 | * Email : panda.h@foxmail.com 11 | * Description :shell empty launcher 12 | */ 13 | class EmptyLauncherActivity : Activity() { 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | ARouter.getInstance() 17 | .build(RouterPath.LAUNCH_ACTIVITY_FLASH) 18 | .navigation() 19 | this.finish() 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/base/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.partbuilding.base 2 | 3 | /** 4 | * Created by huxinyu on 2019/7/8. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description : 8 | */ 9 | class Constants { 10 | companion object { 11 | const val CACHE_NAME: String = "partbuilding" 12 | const val CACHE_KEY_USER: String = "user" 13 | 14 | const val CACHE_KEY_ACCOUNT: String = "account" 15 | const val CACHE_KEY_PWD: String = "password" 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/base/app/AppLifecycle.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.base.app 2 | 3 | import android.app.Application 4 | import android.content.Context 5 | import com.alibaba.android.arouter.launcher.ARouter 6 | import com.pandaq.appcore.BuildConfig 7 | import com.pandaq.appcore.framework.app.lifecycle.IAppLifeCycle 8 | 9 | /** 10 | * Created by huxinyu on 2019/7/8. 11 | * Email : panda.h@foxmail.com 12 | *

13 | * Description : 14 | */ 15 | class AppLifecycle : IAppLifeCycle { 16 | override fun attachBaseContext(base: Context) { 17 | 18 | } 19 | 20 | override fun onCreate(application: Application) { 21 | 22 | } 23 | 24 | override fun onTerminate(application: Application) { 25 | 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/base/app/LifeCycleInjector.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.base.app 2 | 3 | import android.app.Application 4 | import androidx.fragment.app.FragmentManager 5 | import com.pandaq.appcore.framework.app.lifecycle.IAppLifeCycle 6 | import com.pandaq.appcore.framework.app.lifecycle.ILifecycleInjector 7 | 8 | /** 9 | * Created by huxinyu on 2019/7/8. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description : 13 | */ 14 | class LifeCycleInjector : ILifecycleInjector { 15 | override fun injectAppLifeCycle(application: Application?, appLifeCycles: MutableList?) { 16 | appLifeCycles?.add(AppLifecycle()) 17 | } 18 | 19 | override fun injectActivityLifeCycle( 20 | application: Application?, 21 | activityLifecycleCallbacks: MutableList? 22 | ) { 23 | 24 | } 25 | 26 | override fun injectFragmentLifeCycle( 27 | application: Application?, 28 | fragmentLifecycleCallbacks: MutableList? 29 | ) { 30 | 31 | } 32 | 33 | override fun priority(): Int = 0 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/template/AppBaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.template 2 | 3 | import androidx.viewbinding.ViewBinding 4 | import com.pandaq.uires.mvp.BaseActivity 5 | 6 | 7 | /** 8 | * Created by huxinyu on 2019/7/8. 9 | * Email : panda.h@foxmail.com 10 | *

11 | * Description : 12 | */ 13 | abstract class AppBaseActivity

,VB: ViewBinding> : BaseActivity() { 14 | 15 | 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/template/AppBaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.template 2 | 3 | import androidx.viewbinding.ViewBinding 4 | import com.pandaq.uires.mvp.BaseFragment 5 | 6 | /** 7 | * Created by huxinyu on 2019/7/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description : 11 | */ 12 | abstract class AppBaseFragment

,VB:ViewBinding> : BaseFragment() { 13 | 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/template/AppBasePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.template 2 | 3 | import com.pandaq.uires.mvp.core.BasePresenter 4 | import com.pandaq.uires.mvp.core.IView 5 | 6 | /** 7 | * Created by huxinyu on 2019/7/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description : 11 | */ 12 | open class AppBasePresenter : BasePresenter() { 13 | 14 | override fun refreshApiConfig() { 15 | 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/template/refresh/AppBaseRefreshPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.template.refresh 2 | 3 | import com.pandaq.uires.mvp.core.IListVIew 4 | import com.pandaq.pandamvp.template.AppBasePresenter 5 | 6 | /** 7 | * Created by huxinyu on 5/11/21. 8 | * Email : panda.h@foxmail.com 9 | * Description : 10 | */ 11 | class AppBaseRefreshPresenter: AppBasePresenter() { 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/pandaq/pandamvp/wxapi/WXPayEntryActivity.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp.wxapi; 2 | 3 | import com.pandaq.mobilepay.wechatpay.WeChatPayActivity; 4 | 5 | /** 6 | * Created by huxinyu on 2018/6/19. 7 | * Email : panda.h@foxmail.com 8 | *

9 | * Description : 微信支付本地 SDK 支付回调, 10 | * 因微信限制了回调 BaseActivity 的路径因此需空继承修改 BaseActivity 包路径 11 | */ 12 | public class WXPayEntryActivity extends WeChatPayActivity { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable-hdpi/ic_action_arrow_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable-hdpi/shadow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable-xhdpi/ic_action_arrow_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable-xhdpi/shadow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable-xxhdpi/ic_action_arrow_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable-xxhdpi/shadow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/drawable/shadow_left.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/navigation/navigation_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4dp 4 | 3dp 5 | 6 | 16dp 7 | 16dp 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/test/java/com/pandaq/pandamvp/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.pandamvp; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app_bmodule/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app_bmodule/build.gradle: -------------------------------------------------------------------------------- 1 | apply from: "../components_app_build.gradle" 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 28 6 | 7 | resourcePrefix "b_" 8 | 9 | buildTypes { 10 | release { 11 | debuggable inDebug.toBoolean() 12 | signingConfig signingConfigs.release 13 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 14 | } 15 | 16 | appTest { 17 | debuggable inDebug.toBoolean() 18 | signingConfig signingConfigs.debug 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | 22 | debug { 23 | debuggable inDebug.toBoolean() 24 | signingConfig signingConfigs.debug 25 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 26 | } 27 | } 28 | } 29 | 30 | dependencies { 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app_bmodule/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_bmodule/src/androidTest/java/com/pandaq/app_bmodule/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_bmodule 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Test 6 | import org.junit.runner.RunWith 7 | 8 | import org.junit.Assert.* 9 | 10 | /** 11 | * Instrumented test, which will execute on an Android device. 12 | * 13 | * See [testing documentation](http://d.android.com/tools/testing). 14 | */ 15 | @RunWith(AndroidJUnit4::class) 16 | class ExampleInstrumentedTest { 17 | @Test 18 | fun useAppContext() { 19 | // Context of the app under test. 20 | val appContext = InstrumentationRegistry.getInstrumentation().context 21 | assertEquals("com.pandaq.app_bmodule", appContext.packageName) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app_bmodule/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app_bmodule/src/main/java/com/pandaq/app_bmodule/app/Constant.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_bmodule.app; 2 | 3 | /** 4 | * Created by huxinyu on 2018/1/22. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | 9 | public class Constant { 10 | public static class Cache { 11 | public final static String CACHE_FILE_NAME = "cache"; 12 | public final static String CACHE_USEINFO_KEY = "userInfo"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app_bmodule/src/main/java/com/pandaq/app_bmodule/app/lifecycle/ActivityLifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_bmodule.app.lifecycle; 2 | 3 | import android.app.Activity; 4 | import android.app.Application; 5 | import android.os.Bundle; 6 | 7 | /** 8 | * Created by huxinyu on 2018/12/25. 9 | * Email : panda.h@foxmail.com 10 | *

11 | * Description :this module's lifecycle 12 | */ 13 | public class ActivityLifeCycle implements Application.ActivityLifecycleCallbacks { 14 | @Override 15 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 16 | 17 | } 18 | 19 | @Override 20 | public void onActivityStarted(Activity activity) { 21 | 22 | } 23 | 24 | @Override 25 | public void onActivityResumed(Activity activity) { 26 | 27 | } 28 | 29 | @Override 30 | public void onActivityPaused(Activity activity) { 31 | 32 | } 33 | 34 | @Override 35 | public void onActivityStopped(Activity activity) { 36 | 37 | } 38 | 39 | @Override 40 | public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 41 | 42 | } 43 | 44 | @Override 45 | public void onActivityDestroyed(Activity activity) { 46 | 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app_bmodule/src/main/java/com/pandaq/app_bmodule/app/lifecycle/AppLifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_bmodule.app.lifecycle; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.pandaq.appcore.framework.app.lifecycle.IAppLifeCycle; 7 | import com.pandaq.appcore.log.PLogger; 8 | 9 | import androidx.annotation.NonNull; 10 | 11 | /** 12 | * Created by huxinyu on 2018/12/25. 13 | * Email : panda.h@foxmail.com 14 | *

15 | * Description :this module' appLifeCycle impl.the methods will called in global application 16 | */ 17 | public class AppLifeCycle implements IAppLifeCycle { 18 | 19 | @Override 20 | public void attachBaseContext(@NonNull Context base) { 21 | 22 | } 23 | 24 | @Override 25 | public void onCreate(@NonNull Application application) { 26 | PLogger.d("AppInit", "----BModule"); 27 | } 28 | 29 | @Override 30 | public void onTerminate(@NonNull Application application) { 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app_bmodule/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /app_bmodule/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | app_bmodule 3 | 4 | -------------------------------------------------------------------------------- /app_bmodule/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app_bmodule/src/test/java/com/pandaq/app_bmodule/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_bmodule 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app_jetpack/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app_jetpack/build.gradle: -------------------------------------------------------------------------------- 1 | apply from: "../components_app_build.gradle" 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | resourcePrefix "a_" 6 | 7 | defaultConfig { 8 | 9 | } 10 | 11 | buildTypes { 12 | release { 13 | debuggable inDebug.toBoolean() 14 | signingConfig signingConfigs.release 15 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 16 | } 17 | 18 | appTest { 19 | debuggable inDebug.toBoolean() 20 | signingConfig signingConfigs.debug 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | 24 | debug { 25 | debuggable inDebug.toBoolean() 26 | signingConfig signingConfigs.debug 27 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 28 | } 29 | } 30 | } 31 | 32 | dependencies { 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app_jetpack/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_jetpack/src/androidTest/java/com/pandaq/app_jetpack/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack 2 | 3 | 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | import androidx.test.platform.app.InstrumentationRegistry 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.pandaq.app_jetpack", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app_jetpack/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 14 | 15 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import androidx.appcompat.app.AppCompatActivity 7 | import com.alibaba.android.arouter.facade.annotation.Route 8 | import com.pandaq.router.route.RouterPath 9 | 10 | @Route(path = RouterPath.JETPACK_MAIN) 11 | class MainActivity : AppCompatActivity() { 12 | 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(R.layout.a_activity_main) 17 | val intent = Intent() 18 | intent.putExtra("data", "MainActivity") 19 | setResult(Activity.RESULT_OK, intent) 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/Constant.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app; 2 | 3 | /** 4 | * Created by huxinyu on 2018/1/22. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | 9 | public class Constant { 10 | public static class Cache { 11 | public final static String CACHE_FILE_NAME = "cache"; 12 | public final static String CACHE_USEINFO_KEY = "userInfo"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/TestTask.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app; 2 | 3 | import android.os.AsyncTask; 4 | 5 | /** 6 | * Created by huxinyu on 2020/10/29. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | public class TestTask extends AsyncTask { 11 | 12 | 13 | @Override 14 | protected void onPreExecute() { 15 | super.onPreExecute(); 16 | } 17 | 18 | @Override 19 | protected String doInBackground(String... strings) { 20 | return null; 21 | } 22 | 23 | @Override 24 | protected void onPostExecute(String s) { 25 | super.onPostExecute(s); 26 | } 27 | 28 | @Override 29 | protected void onProgressUpdate(Integer... values) { 30 | super.onProgressUpdate(values); 31 | } 32 | 33 | @Override 34 | protected void onCancelled(String s) { 35 | super.onCancelled(s); 36 | } 37 | 38 | @Override 39 | protected void onCancelled() { 40 | super.onCancelled(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/entity/WanApiData.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.entity 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.pandaq.rxpanda.entity.IApiData 5 | 6 | /** 7 | * Created by huxinyu on 2019/6/18. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description : 11 | */ 12 | data class WanApiData(@SerializedName("errorCode") private val code: String, 13 | @SerializedName("errorMsg") private val msg: String, 14 | @SerializedName("data") private val data: T) : IApiData { 15 | override fun getCode(): String { 16 | return code 17 | } 18 | 19 | override fun getMsg(): String { 20 | return msg 21 | } 22 | 23 | override fun getData(): T { 24 | return data 25 | } 26 | 27 | override fun isSuccess(): Boolean { 28 | return code.toInt() == 0 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/lifecycle/ActivityLifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.lifecycle; 2 | 3 | import android.app.Activity; 4 | import android.app.Application; 5 | import android.os.Bundle; 6 | 7 | /** 8 | * Created by huxinyu on 2018/12/25. 9 | * Email : panda.h@foxmail.com 10 | *

11 | * Description :this module's lifecycle 12 | */ 13 | public class ActivityLifeCycle implements Application.ActivityLifecycleCallbacks { 14 | @Override 15 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 16 | 17 | } 18 | 19 | @Override 20 | public void onActivityStarted(Activity activity) { 21 | 22 | } 23 | 24 | @Override 25 | public void onActivityResumed(Activity activity) { 26 | 27 | } 28 | 29 | @Override 30 | public void onActivityPaused(Activity activity) { 31 | 32 | } 33 | 34 | @Override 35 | public void onActivityStopped(Activity activity) { 36 | 37 | } 38 | 39 | @Override 40 | public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 41 | 42 | } 43 | 44 | @Override 45 | public void onActivityDestroyed(Activity activity) { 46 | 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/lifecycle/AppLifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.lifecycle; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.pandaq.appcore.framework.app.lifecycle.IAppLifeCycle; 7 | import com.pandaq.appcore.log.PLogger; 8 | 9 | import androidx.annotation.NonNull; 10 | 11 | /** 12 | * Created by huxinyu on 2018/12/25. 13 | * Email : panda.h@foxmail.com 14 | *

15 | * Description :this module' appLifeCycle impl.the methods will called in global application 16 | */ 17 | public class AppLifeCycle implements IAppLifeCycle { 18 | 19 | @Override 20 | public void attachBaseContext(@NonNull Context base) { 21 | 22 | } 23 | 24 | @Override 25 | public void onCreate(@NonNull Application application) { 26 | PLogger.d("AppInit", "----AModule"); 27 | } 28 | 29 | @Override 30 | public void onTerminate(@NonNull Application application) { 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/net/ApiService.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.net 2 | 3 | import com.pandaq.app_jetpack.app.entity.WanAndroidData 4 | import com.pandaq.app_jetpack.app.entity.WanApiData 5 | import com.pandaq.app_jetpack.app.entity.ZhihuData 6 | import com.pandaq.rxpanda.annotation.ApiData 7 | import com.pandaq.rxpanda.annotation.RealEntity 8 | import io.reactivex.Observable 9 | import retrofit2.http.GET 10 | import retrofit2.http.Path 11 | 12 | /** 13 | * Created by huxinyu on 2018/4/2. 14 | * Email : panda.h@foxmail.com 15 | * Description : retrofit api 接口 16 | */ 17 | interface ApiService { 18 | @RealEntity 19 | @GET("news/latest") 20 | suspend fun test(): ZhihuData? 21 | 22 | @RealEntity 23 | @GET("news/before/{date}") 24 | fun history(@Path("date") date: String?): Observable 25 | 26 | @ApiData(clazz = WanApiData::class) 27 | @GET("https://wanandroid.com/article/listproject/0/json") 28 | suspend fun wanAndroid(): WanAndroidData? 29 | } -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/net/AppCallBack.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.net 2 | 3 | import com.pandaq.rxpanda.exception.ApiException 4 | import com.pandaq.rxpanda.observer.ApiObserver 5 | 6 | /** 7 | * Created by huxinyu on 2019/3/8. 8 | * Email : panda.h@foxmail.com 9 | * Description :自定义的处理类 10 | */ 11 | abstract class AppCallBack : ApiObserver() { 12 | override fun finished(success: Boolean) { 13 | finish(success) 14 | } 15 | 16 | override fun onError(exception: ApiException?) { 17 | fail(exception) 18 | } 19 | 20 | override fun onSuccess(data: T) { 21 | success(data) 22 | } 23 | 24 | abstract fun success(data: T) 25 | 26 | abstract fun fail(exception: ApiException?) 27 | 28 | abstract fun finish(success: Boolean) 29 | } -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/net/ExceptionCode.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.net; 2 | 3 | /** 4 | * Created by huxinyu on 2019/3/8. 5 | * Email : panda.h@foxmail.com 6 | * Description :与后端服务器约定的异常 code 7 | */ 8 | public class ExceptionCode { 9 | 10 | public static Long TOKEN_INVALID = 10000001L; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/ui/adapters/ZhihuNewsAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.ui.adapters 2 | 3 | import com.pandaq.app_jetpack.R 4 | import com.pandaq.app_jetpack.app.entity.Story 5 | import com.pandaq.app_jetpack.databinding.AItemZhihuBinding 6 | import com.pandaq.appcore.imageloader.core.PicLoader 7 | import com.pandaq.uires.widget.recyclerview.BindingQuickAdapter 8 | 9 | /** 10 | * Created by huxinyu on 2020/4/27. 11 | * Email : panda.h@foxmail.com 12 | * Description : 13 | */ 14 | class ZhihuNewsAdapter : BindingQuickAdapter() { 15 | 16 | init { 17 | addChildClickViewIds(R.id.item_cardview) 18 | } 19 | 20 | override fun convert(holder: BindingHolder, item: Story) { 21 | holder.binding.let { 22 | PicLoader.with(context) 23 | .load(item.images[0]) 24 | .into(it.newsImage) 25 | it.newsTitle.text = item.title 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /app_jetpack/src/main/java/com/pandaq/app_jetpack/app/ui/base/BaseViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack.app.ui.base 2 | 3 | import androidx.lifecycle.ViewModel 4 | import com.pandaq.app_jetpack.app.net.ApiService 5 | import com.pandaq.rxpanda.RxPanda 6 | import io.reactivex.disposables.CompositeDisposable 7 | import io.reactivex.disposables.Disposable 8 | 9 | /** 10 | * Created by huxinyu on 2020/3/30. 11 | * Email : panda.h@foxmail.com 12 | * Description : 13 | */ 14 | open class BaseViewModel : ViewModel() { 15 | 16 | private var mCompositeDisposable: CompositeDisposable? = null 17 | 18 | protected val api by lazy { 19 | RxPanda.retrofit() 20 | .baseUrl("http://news-at.zhihu.com/api/4/") 21 | .create(ApiService::class.java) 22 | } 23 | 24 | fun addDisposable(disposable: Disposable?) { 25 | if (mCompositeDisposable == null || mCompositeDisposable!!.isDisposed) { //csb 如果解绑了的话添加 sb 需要新的实例否则绑定时无效的 26 | mCompositeDisposable = CompositeDisposable() 27 | } 28 | mCompositeDisposable?.add(disposable!!) 29 | } 30 | 31 | override fun onCleared() { 32 | super.onCleared() 33 | mCompositeDisposable?.dispose() 34 | } 35 | } -------------------------------------------------------------------------------- /app_jetpack/src/main/res/layout/a_activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | -------------------------------------------------------------------------------- /app_jetpack/src/main/res/layout/a_activity_zhihu_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app_jetpack/src/main/res/layout/a_motion_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /app_jetpack/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /app_jetpack/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | app_jetpack 3 | 4 | -------------------------------------------------------------------------------- /app_jetpack/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app_jetpack/src/test/java/com/pandaq/app_jetpack/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_jetpack 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app_launcher/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app_launcher/build.gradle: -------------------------------------------------------------------------------- 1 | apply from: "../components_app_build.gradle" 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | 6 | resourcePrefix "launcher_" 7 | 8 | defaultConfig { 9 | 10 | } 11 | 12 | buildTypes { 13 | release { 14 | debuggable inDebug.toBoolean() 15 | signingConfig signingConfigs.release 16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 | } 18 | 19 | appTest { 20 | debuggable inDebug.toBoolean() 21 | signingConfig signingConfigs.debug 22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 23 | } 24 | 25 | debug { 26 | debuggable inDebug.toBoolean() 27 | signingConfig signingConfigs.debug 28 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 29 | } 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation project(':functionlibs:pay') 35 | } 36 | -------------------------------------------------------------------------------- /app_launcher/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_launcher/src/androidTest/java/com/pandaq/app_launcher/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher; 2 | 3 | import android.content.Context; 4 | 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | 8 | import androidx.test.InstrumentationRegistry; 9 | import androidx.test.runner.AndroidJUnit4; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getTargetContext(); 24 | 25 | assertEquals("com.pandaq.app_launcher", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app_launcher/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/app/Constant.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.app; 2 | 3 | /** 4 | * Created by huxinyu on 2018/1/22. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | 9 | public class Constant { 10 | public static class Cache { 11 | public final static String CACHE_FILE_NAME = "cache"; 12 | public final static String CACHE_USEINFO_KEY = "userInfo"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/entites/WanApiData.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.entites 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.pandaq.rxpanda.entity.IApiData 5 | 6 | /** 7 | * Created by huxinyu on 2019/6/18. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description : 11 | */ 12 | data class WanApiData( 13 | @SerializedName("errorCode") private val code: String, 14 | @SerializedName("errorMsg") private val msg: String, 15 | @SerializedName("data") private val data: T 16 | ) : IApiData { 17 | override fun getCode(): String { 18 | return code 19 | } 20 | 21 | override fun getMsg(): String { 22 | return msg 23 | } 24 | 25 | override fun getData(): T { 26 | return data 27 | } 28 | 29 | override fun isSuccess(): Boolean { 30 | return code.toInt() == 0 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/entites/WxArticle.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.entites 2 | 3 | /** 4 | * Created by huxinyu on 2019/6/18. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description : 8 | */ 9 | data class WxArticle( 10 | val children: List?, 11 | val courseId: Int?, 12 | val id: Int?, 13 | val name: String?, 14 | val order: Int?, 15 | val parentChapterId: Int?, 16 | val userControlSetTop: Boolean?, 17 | val visible: Int? 18 | ) -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/entites/Zhihu.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.entites 2 | 3 | /** 4 | * Created by huxinyu on 2019/6/13. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description : 8 | */ 9 | data class Zhihu( 10 | val date: String?, 11 | val stories: MutableList?, 12 | val top_stories: MutableList? 13 | ) 14 | 15 | data class TopStory( 16 | val ga_prefix: String?, 17 | val id: Int?, 18 | val image: String?, 19 | val title: String?, 20 | val type: Int? 21 | ) 22 | 23 | data class Story( 24 | val ga_prefix: String?, 25 | val id: Int?, 26 | val images: List?, 27 | val title: String?, 28 | val type: Int? 29 | ) -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/framework/AppBaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.framework 2 | 3 | import androidx.viewbinding.ViewBinding 4 | import com.pandaq.uires.mvp.BaseActivity 5 | 6 | 7 | /** 8 | * Created by huxinyu on 2019/7/8. 9 | * Email : panda.h@foxmail.com 10 | *

11 | * Description : 12 | */ 13 | abstract class AppBaseActivity

,VB: ViewBinding> : BaseActivity() { 14 | 15 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/framework/AppBaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.framework 2 | 3 | import androidx.viewbinding.ViewBinding 4 | import com.pandaq.uires.mvp.BaseFragment 5 | 6 | /** 7 | * Created by huxinyu on 2019/7/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description : 11 | */ 12 | abstract class AppBaseFragment

,VB:ViewBinding> : BaseFragment() { 13 | 14 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/framework/AppBasePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.framework 2 | 3 | import com.pandaq.app_launcher.net.ApiService 4 | import com.pandaq.uires.mvp.core.BasePresenter 5 | import com.pandaq.uires.mvp.core.IView 6 | import com.pandaq.rxpanda.RxPanda 7 | 8 | /** 9 | * Created by huxinyu on 2019/7/8. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description : 13 | */ 14 | open class AppBasePresenter : BasePresenter() { 15 | 16 | protected var api: ApiService = RxPanda.retrofit().create(ApiService::class.java) 17 | 18 | override fun refreshApiConfig() { 19 | api = RxPanda.retrofit().create(ApiService::class.java) 20 | } 21 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/framework/refresh/AppBaseRefreshActivity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.framework.refresh 2 | 3 | import androidx.viewbinding.ViewBinding 4 | import com.pandaq.uires.mvp.refresh.BaseRefreshActivity 5 | 6 | 7 | /** 8 | * Created by huxinyu on 2019/7/8. 9 | * Email : panda.h@foxmail.com 10 | *

11 | * Description :模板类 12 | */ 13 | abstract class AppBaseRefreshActivity

, VB : ViewBinding> : 14 | BaseRefreshActivity() { 16 | 17 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/framework/refresh/AppBaseRefreshFragment.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.framework.refresh 2 | 3 | import androidx.viewbinding.ViewBinding 4 | import com.pandaq.uires.mvp.refresh.BaseRefreshFragment 5 | 6 | /** 7 | * Created by huxinyu on 2019/7/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description :模板类 11 | */ 12 | abstract class AppBaseRefreshFragment

, VB : ViewBinding> : 13 | BaseRefreshFragment() { 14 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/framework/refresh/AppBaseRefreshPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.framework.refresh 2 | 3 | import com.pandaq.app_launcher.framework.AppBasePresenter 4 | import com.pandaq.uires.mvp.core.IListVIew 5 | 6 | /** 7 | * Created by huxinyu on 5/11/21. 8 | * Email : panda.h@foxmail.com 9 | * Description : 10 | */ 11 | open class AppBaseRefreshPresenter: AppBasePresenter() { 12 | 13 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/net/ApiService.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.net; 2 | 3 | import com.pandaq.app_launcher.entites.Zhihu; 4 | import com.pandaq.rxpanda.annotation.RealEntity; 5 | 6 | import io.reactivex.Observable; 7 | import retrofit2.http.GET; 8 | 9 | /** 10 | * Created by huxinyu on 2018/4/2. 11 | * Email : panda.h@foxmail.com 12 | * Description : retrofit api 接口 13 | */ 14 | public interface ApiService { 15 | String BASE_URL = "https://wanandroid.com/"; 16 | 17 | /** 18 | * 知乎日报 api 测试 @RealEntity注解不进行脱壳 19 | */ 20 | @RealEntity 21 | @GET("http://news-at.zhihu.com/api/4/news/latest") 22 | Observable zhihu(); 23 | } 24 | -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/net/AppCallBack.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.net 2 | 3 | import com.pandaq.rxpanda.observer.ApiObserver 4 | import com.pandaq.rxpanda.exception.ApiException 5 | import com.pandaq.appcore.log.PLogger 6 | 7 | /** 8 | * Created by huxinyu on 2019/3/8. 9 | * Email : panda.h@foxmail.com 10 | * Description :自定义的处理类 11 | */ 12 | abstract class AppCallBack : ApiObserver() { 13 | override fun onSuccess(data: T) { 14 | success(data) 15 | } 16 | 17 | override fun onError(e: ApiException) { 18 | handleException(e) 19 | fail(e) 20 | } 21 | 22 | override fun finished(success: Boolean) { 23 | finish(success) 24 | } 25 | 26 | private fun handleException(e: ApiException) { 27 | if (e.code === ExceptionCode.TOKEN_INVALID) { 28 | PLogger.e("TOKEN 已过期") 29 | } 30 | } 31 | 32 | protected abstract fun success(data: T) 33 | protected abstract fun fail(e: ApiException?) 34 | protected abstract fun finish(success: Boolean) 35 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/net/ExceptionCode.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.net; 2 | 3 | /** 4 | * Created by huxinyu on 2019/3/8. 5 | * Email : panda.h@foxmail.com 6 | * Description :与后端服务器约定的异常 code 7 | */ 8 | public class ExceptionCode { 9 | 10 | public static String TOKEN_INVALID = "10000001L"; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/net/intercepter/DelayRequestInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.net.intercepter 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Response 5 | 6 | /** 7 | * Created by huxinyu on 2019/6/13. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description : 11 | */ 12 | class DelayRequestInterceptor : Interceptor { 13 | override fun intercept(chain: Interceptor.Chain): Response { 14 | //请求头好了之后等待 2000 毫秒再真实请求 15 | Thread.sleep(2000) 16 | return chain.proceed(chain.request()) 17 | } 18 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/ui/launch/FlashPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.ui.launch 2 | 3 | import com.pandaq.app_launcher.framework.AppBasePresenter 4 | 5 | /** 6 | * Created by huxinyu on 2019/3/25. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | class FlashPresenter : AppBasePresenter() { 11 | 12 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/ui/launch/IFlashView.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.ui.launch 2 | 3 | import com.pandaq.uires.mvp.core.IView 4 | 5 | /** 6 | * Created by huxinyu on 2019/3/25. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | interface IFlashView: IView { 11 | 12 | } -------------------------------------------------------------------------------- /app_launcher/src/main/java/com/pandaq/app_launcher/ui/zhihu/IZhihuView.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher.ui.zhihu 2 | 3 | import com.pandaq.uires.mvp.core.IListVIew 4 | 5 | /** 6 | * Created by huxinyu on 5/11/21. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | interface IZhihuView : IListVIew { 11 | 12 | } -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_01.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_02.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_03.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_04.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_05.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_06.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_07.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/drawable/icon_panda_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/app_launcher/src/main/res/drawable/icon_panda_08.png -------------------------------------------------------------------------------- /app_launcher/src/main/res/layout/launcher_activity_flash.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/layout/launcher_activity_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/layout/launcher_activity_list_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/layout/launcher_activity_plan_b.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/layout/launcher_activity_zhihu_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4dp 4 | 3dp 5 | 6 | 16dp 7 | 16dp 8 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Launcher 3 | 4 | -------------------------------------------------------------------------------- /app_launcher/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app_launcher/src/test/java/com/pandaq/app_launcher/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.app_launcher; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | apply from: "config.gradle" 3 | apply plugin: 'com.alibaba.arouter' 4 | buildscript { 5 | ext.kotlin_version = '1.6.10' 6 | repositories { 7 | mavenCentral() 8 | maven { url 'https://repo1.maven.org/maven2/' } 9 | google() 10 | jcenter() 11 | } 12 | dependencies { 13 | classpath 'com.android.tools.build:gradle:7.0.4' 14 | // NOTE: Do not place your application dependencies here; they belong 15 | // in the individual module build.gradle files 16 | classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin 17 | // add kotlin support 18 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 19 | classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" 20 | classpath "com.alibaba:arouter-register:1.0.2" 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } 27 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /database/src/androidTest/java/com/pandaq/router/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.router; 2 | 3 | import android.content.Context; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | 7 | 8 | import androidx.test.InstrumentationRegistry; 9 | import androidx.test.runner.AndroidJUnit4; 10 | 11 | import static org.junit.Assert.assertEquals; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getTargetContext(); 24 | 25 | assertEquals("com.pandaq.router.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /database/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /database/src/main/java/com/pandaq/router/common/Configs.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.router.common 2 | 3 | import com.pandaq.router.database.entity.ConfigData 4 | 5 | class Configs { 6 | var mainBiz: ConfigData? = null 7 | var bucketName: ConfigData? = null 8 | var bucketUrl: ConfigData? = null 9 | var ossKey: ConfigData? = null 10 | var ossSecret: ConfigData? = null 11 | var sso: ConfigData? = null 12 | var endPoint: ConfigData? = null 13 | var h5: ConfigData? = null 14 | var mobileKey: ConfigData? = null 15 | var protocol: ConfigData? = null 16 | var apiAesKey: ConfigData? = null 17 | } -------------------------------------------------------------------------------- /database/src/main/java/com/pandaq/router/common/NotFoundPage.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.router.common 2 | 3 | import com.pandaq.uires.mvp.core.BasePresenter 4 | import com.pandaq.uires.databinding.ActivityRoute404Binding 5 | import com.pandaq.uires.mvp.BaseActivity 6 | 7 | /** 8 | * Created by huxinyu on 4/23/21. 9 | * Email : panda.h@foxmail.com 10 | * Description :路由丢失页面 11 | */ 12 | class NotFoundPage : BaseActivity, ActivityRoute404Binding>() { 13 | override fun initVariable() { 14 | 15 | } 16 | 17 | override fun initView() { 18 | 19 | } 20 | 21 | override fun loadData() { 22 | 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /database/src/main/java/com/pandaq/router/route/degrade/DegradeServiceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.router.route.degrade 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import com.alibaba.android.arouter.facade.Postcard 6 | import com.alibaba.android.arouter.facade.annotation.Route 7 | import com.alibaba.android.arouter.facade.service.DegradeService 8 | import com.pandaq.router.common.NotFoundPage 9 | 10 | /** 11 | * Created by huxinyu on 4/23/21. 12 | * Email : panda.h@foxmail.com 13 | * Description : 路由全局降级策略 14 | */ 15 | @Route(path = "/xxx/xxx") 16 | class DegradeServiceImpl : DegradeService { 17 | override fun onLost(context: Context?, postcard: Postcard?) { 18 | val notFoundIntent = Intent(context, NotFoundPage::class.java) 19 | context?.startActivity(notFoundIntent) 20 | } 21 | 22 | override fun init(context: Context?) { 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /database/src/main/java/com/pandaq/router/route/interceptor/RouteInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.router.route.interceptor 2 | 3 | import android.content.Context 4 | import com.alibaba.android.arouter.facade.Postcard 5 | import com.alibaba.android.arouter.facade.annotation.Interceptor 6 | import com.alibaba.android.arouter.facade.callback.InterceptorCallback 7 | import com.alibaba.android.arouter.facade.template.IInterceptor 8 | import com.pandaq.appcore.log.PLogger 9 | 10 | /** 11 | * Created by huxinyu on 4/23/21. 12 | * Email : panda.h@foxmail.com 13 | * Description : 14 | */ 15 | @Interceptor(priority = 1, name = "基础拦截器") 16 | class RouteInterceptor : IInterceptor { 17 | 18 | override fun process(postcard: Postcard?, callback: InterceptorCallback?) { 19 | callback?.onContinue(postcard) 20 | } 21 | 22 | override fun init(context: Context?) { 23 | PLogger.d("RouteInterceptor init finished") 24 | } 25 | } -------------------------------------------------------------------------------- /database/src/main/java/com/pandaq/router/route/service/AModuleService.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.router.route.service 2 | 3 | import com.alibaba.android.arouter.facade.template.IProvider 4 | 5 | 6 | /** 7 | * Created by huxinyu on 2019/4/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description :路由服务方法暴露 11 | */ 12 | interface AModuleService: IProvider { 13 | 14 | } -------------------------------------------------------------------------------- /database/src/main/java/com/pandaq/router/route/service/BModuleService.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.router.route.service 2 | 3 | import com.alibaba.android.arouter.facade.template.IProvider 4 | 5 | /** 6 | * Created by huxinyu on 2019/4/8. 7 | * Email : panda.h@foxmail.com 8 | *

9 | * Description :路由服务方法暴露 10 | */ 11 | interface BModuleService: IProvider { 12 | } -------------------------------------------------------------------------------- /database/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | router 3 | 4 | -------------------------------------------------------------------------------- /database/src/test/java/com/pandaq/router/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.router; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /functionlibs/pay/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | ======= 10 | # built application files 11 | *.apk 12 | *.ap_ 13 | 14 | # files for the dex VM 15 | *.dex 16 | 17 | # Java class files 18 | *.class 19 | 20 | # generated files 21 | bin/ 22 | gen/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Eclipse project files 28 | .classpath 29 | .project 30 | 31 | # Proguard folder generated by Eclipse 32 | proguard/ 33 | 34 | # Intellij project files 35 | *.iml 36 | *.ipr 37 | *.iws 38 | .idea/ -------------------------------------------------------------------------------- /functionlibs/pay/libs/alipaySdk-20180601.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/functionlibs/pay/libs/alipaySdk-20180601.jar -------------------------------------------------------------------------------- /functionlibs/pay/src/androidTest/java/com/pandaq/thirdsdk/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.thirdsdk; 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 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getTargetContext(); 24 | 25 | assertEquals("com.pandaq.thridmodules.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /functionlibs/pay/src/main/java/com/pandaq/mobilepay/PayCallBack.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.mobilepay; 2 | 3 | /** 4 | * Created by huxinyu on 2018/9/5. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description :支付结果回调,根据回调结果去请求服务器查询支付结果。判断标准以服务器查询结果为准 8 | */ 9 | public interface PayCallBack { 10 | 11 | /** 12 | * 支付成功 13 | * 14 | * @param payType 支付类型(微信支付,支付宝){@link PayType} 15 | * @param msg 支付成功信息 16 | */ 17 | void paySuccess(int payType, String msg); 18 | 19 | /** 20 | * 支付失败 21 | * 22 | * @param payType 支付类型(微信支付,支付宝) {@link PayType} 23 | * @param errorCode 错误码 24 | * @param msg 错误消息 25 | */ 26 | void payFail(int payType, int errorCode, String msg); 27 | } 28 | -------------------------------------------------------------------------------- /functionlibs/pay/src/main/java/com/pandaq/mobilepay/PayType.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.mobilepay; 2 | 3 | /** 4 | * Created by huxinyu on 2018/9/5. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description :支付类型常量 8 | */ 9 | public class PayType { 10 | public static final int WXPAY = 0; 11 | public static final int ALIPAY = 1; 12 | } 13 | -------------------------------------------------------------------------------- /functionlibs/pay/src/main/java/com/pandaq/mobilepay/alipay/PayResult.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.mobilepay.alipay; import android.text.TextUtils; import java.util.Map; public class PayResult { private String resultStatus; private String result; private String memo; PayResult(Map rawResult) { if (rawResult == null) { return; } for (String key : rawResult.keySet()) { if (TextUtils.equals(key, "resultStatus")) { resultStatus = rawResult.get(key); } else if (TextUtils.equals(key, "result")) { result = rawResult.get(key); } else if (TextUtils.equals(key, "memo")) { memo = rawResult.get(key); } } } @Override public String toString() { return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}"; } /** * @return the resultStatus */ public String getResultStatus() { return resultStatus; } /** * @return the memo */ public String getMemo() { return memo; } /** * @return the result */ public String getResult() { return result; } } -------------------------------------------------------------------------------- /functionlibs/pay/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /functionlibs/pay/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 支付成功 3 | 支付失败 4 | 支付取消 5 | 未安装微信或微信版本过低 6 | 7 | -------------------------------------------------------------------------------- /functionlibs/pay/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | -------------------------------------------------------------------------------- /functionlibs/pay/src/test/java/com/pandaq/thirdsdk/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.thirdsdk; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu May 13 09:18:57 CST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip 7 | -------------------------------------------------------------------------------- /keystore.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/keystore.jks -------------------------------------------------------------------------------- /sdk_core/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | ======= 10 | # built application files 11 | *.apk 12 | *.ap_ 13 | 14 | # files for the dex VM 15 | *.dex 16 | 17 | # Java class files 18 | *.class 19 | 20 | # generated files 21 | bin/ 22 | gen/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Eclipse project files 28 | .classpath 29 | .project 30 | 31 | # Proguard folder generated by Eclipse 32 | proguard/ 33 | 34 | # Intellij project files 35 | *.iml 36 | *.ipr 37 | *.iws 38 | .idea/ -------------------------------------------------------------------------------- /sdk_core/README.md: -------------------------------------------------------------------------------- 1 | # appcore 2 | 整套框架的基础核心库,包含一些基础框架的封装 3 | ## cache 4 | 磁盘缓存工具封装,基于 DiskLruCache 封装 5 | ## eventbus 6 | eventbus3.0 注册工具类,避免多次调用注册、注销时抛出异常 7 | ## framework 8 | mvp 框架包 9 | ### annotation :注解 10 | ### app :生命周期管理核心 11 | ### base :mvp 基类 12 | ## http 13 | 网络请求库 14 | ## imageloader 15 | 图片加载库封装 16 | ## permission 17 | 权限请求库封装,包含:6.0+ 运行时权限、8.0+ 应用安装权限 18 | ## transmitter 19 | 简单上传下载封装 20 | ## utils 21 | 常用工具类 22 | ### code 23 | 加解密工具包 24 | ### format 25 | 格式 format 工具包 26 | ### log 27 | 日志工具包 28 | ### system 29 | 系统工具包 30 | - AppUtils:可获取全局的 Context 及应用版本信息等等 31 | - ContactUtils:系统联系人工具类,打电话发短息功能 32 | - ResourceUtils:资源工具类,通过 id 直接获取资源对象 33 | - SoftInputUtils:软键盘工具类,显示隐藏软键盘、获取软键盘显示状态 -------------------------------------------------------------------------------- /sdk_core/libs/BaiduLBS_Android.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/libs/BaiduLBS_Android.jar -------------------------------------------------------------------------------- /sdk_core/libs/armeabi/libBaiduMapSDK_base_v7_3_0.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/libs/armeabi/libBaiduMapSDK_base_v7_3_0.so -------------------------------------------------------------------------------- /sdk_core/libs/armeabi/libBaiduMapSDK_map_for_bikenavi_v7_3_0.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/libs/armeabi/libBaiduMapSDK_map_for_bikenavi_v7_3_0.so -------------------------------------------------------------------------------- /sdk_core/libs/armeabi/libgnustl_shared.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/libs/armeabi/libgnustl_shared.so -------------------------------------------------------------------------------- /sdk_core/libs/armeabi/liblocSDK8a.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/libs/armeabi/liblocSDK8a.so -------------------------------------------------------------------------------- /sdk_core/libs/armeabi/libmtttrace.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/libs/armeabi/libmtttrace.so -------------------------------------------------------------------------------- /sdk_core/src/androidTest/java/com/pandaq/appcore/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | 12 | import static org.junit.Assert.assertEquals; 13 | 14 | /** 15 | * Instrumented test, which will execute on an Android device. 16 | * 17 | * @see Testing documentation 18 | */ 19 | @RunWith(AndroidJUnit4.class) 20 | public class ExampleInstrumentedTest { 21 | @Test 22 | public void useAppContext() { 23 | // Context of the app under test. 24 | Context appContext = InstrumentationRegistry.getTargetContext(); 25 | 26 | assertEquals("com.pandaq.pandacore.test", appContext.getPackageName()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/api/Entity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Entity( 6 | @SerializedName("entity") val entity: T 7 | ) -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/api/Rows.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.api 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | /** 6 | * Created by huxinyu on 2021/10/18. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | data class Rows( 11 | @SerializedName("rows") val rows: T 12 | ) -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/api/SdsCallback.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.api 2 | 3 | import com.pandaq.rxpanda.exception.ApiException 4 | import com.pandaq.rxpanda.observer.ApiObserver 5 | 6 | /** 7 | * Created by huxinyu on 2021/9/10. 8 | * Email : panda.h@foxmail.com 9 | * Description :仅用于 Sds 特定数据结构,ApiData 内部还封装了一层 "entity" 对象 10 | */ 11 | abstract class SdsCallback : ApiObserver() { 12 | 13 | override fun finished(success: Boolean) { 14 | finish(success) 15 | } 16 | 17 | override fun onError(exception: ApiException?) { 18 | fail(exception) 19 | } 20 | 21 | override fun onSuccess(data: T) { 22 | success(data) 23 | } 24 | 25 | abstract fun success(data: T) 26 | 27 | abstract fun fail(exception: ApiException?) 28 | 29 | abstract fun finish(success: Boolean) 30 | 31 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/browser/bridge/BridgeData.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.browser.bridge 2 | 3 | /** 4 | * Created by huxinyu on 2020/3/3. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | 9 | /** 10 | * @param methodName 调用 JS 的方法名 11 | * @param data 回调返回的数据 12 | */ 13 | data class BridgeData(val methodName: String?, 14 | val data: Any?) -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/event/ApiConfigChange.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.event 2 | 3 | /** 4 | * Created by huxinyu on 7/30/21. 5 | * Email : panda.h@foxmail.com 6 | * Description :base API url 发生变化时需要触发进行刷新 7 | */ 8 | class ApiConfigChange { 9 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/event/NetworkChange.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.event 2 | 3 | /** 4 | * Created by huxinyu on 7/27/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | data class NetworkChange(val state: NetworkState) -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/event/NetworkState.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.event 2 | 3 | /** 4 | * Created by huxinyu on 7/27/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | enum class NetworkState { 9 | CONNECTED, 10 | LOSING, 11 | LOST 12 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/framework/annotation/DateFormatStr.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.framework.annotation; 2 | 3 | import androidx.annotation.StringDef; 4 | 5 | import com.pandaq.appcore.utils.format.formaters.DateFormatter; 6 | 7 | import java.lang.annotation.ElementType; 8 | import java.lang.annotation.Retention; 9 | import java.lang.annotation.RetentionPolicy; 10 | import java.lang.annotation.Target; 11 | 12 | 13 | /** 14 | * Created by huxinyu on 2018/12/24. 15 | * Email : panda.h@foxmail.com 16 | *

17 | * Description : MakeDateFormatString Rule 18 | */ 19 | 20 | @Retention(RetentionPolicy.SOURCE) 21 | @StringDef({DateFormatter.FORMAT_MONTH, DateFormatter.FORMAT_MONTH_NO_SPLIT, DateFormatter.FORMAT_DAY_CN, DateFormatter.FORMAT_DAY, DateFormatter.FORMAT_DHM, DateFormatter.FORMAT_DHMS, 22 | DateFormatter.FORMAT_HM, DateFormatter.FORMAT_HMS, DateFormatter.FORMAT_WD, 23 | DateFormatter.FORMAT_WDHM, DateFormatter.FORMAT_WDHMS}) 24 | @Target({ElementType.PARAMETER}) 25 | public @interface DateFormatStr { 26 | 27 | } 28 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/framework/app/lifecycle/IAppLifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.framework.app.lifecycle; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | 9 | /** 10 | * Created by huxinyu on 2018/12/25. 11 | * Email : panda.h@foxmail.com 12 | *

13 | * Description : Application lifecycle methods 14 | */ 15 | public interface IAppLifeCycle { 16 | 17 | void attachBaseContext(@NonNull Context base); 18 | 19 | void onCreate(@NonNull Application application); 20 | 21 | void onTerminate(@NonNull Application application); 22 | } 23 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/imageloader/PicLoaderConfig.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.imageloader; 2 | 3 | 4 | import androidx.annotation.DrawableRes; 5 | 6 | /** 7 | * Created by huxinyu on 2019/9/29. 8 | * Email : panda.h@foxmail.com 9 | * Description :图片加载库配置 10 | */ 11 | public class PicLoaderConfig { 12 | 13 | private static PicLoaderConfig sPicLoaderConfig; 14 | 15 | public static PicLoaderConfig get() { 16 | if (sPicLoaderConfig == null) { 17 | sPicLoaderConfig = new PicLoaderConfig(); 18 | } 19 | return sPicLoaderConfig; 20 | } 21 | 22 | @DrawableRes 23 | private int placeHolder = -1; 24 | 25 | @DrawableRes 26 | private int error = -1; 27 | 28 | public int getPlaceHolder() { 29 | return placeHolder; 30 | } 31 | 32 | public void setPlaceHolder(int placeHolder) { 33 | this.placeHolder = placeHolder; 34 | } 35 | 36 | public int getError() { 37 | return error; 38 | } 39 | 40 | public void setError(int error) { 41 | this.error = error; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/imageloader/core/IExecutor.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.imageloader.core; 2 | 3 | /** 4 | * Created by huxinyu on 2018/7/4. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description :切换第三方的图片加载框架需实现的接口方法 8 | */ 9 | public interface IExecutor { 10 | 11 | /** 12 | * 执行加载请求 13 | * 14 | * @param request 配置对象 15 | */ 16 | void execute(Request request); 17 | } 18 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/imageloader/core/ILoadCallBack.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.imageloader.core; 2 | 3 | import android.graphics.drawable.Drawable; 4 | 5 | /** 6 | * Created by huxinyu on 2018/7/4. 7 | * Email : panda.h@foxmail.com 8 | *

9 | * Description :图片加载后的回调 10 | */ 11 | public interface ILoadCallBack { 12 | void loaded(Drawable drawable); 13 | } 14 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/imageloader/core/ScaleType.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.imageloader.core; 2 | 3 | /** 4 | * Created by huxinyu on 2018/6/27. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description : 图片加载时的显示方式 8 | */ 9 | public enum ScaleType { 10 | FIT_CENTER, 11 | CENTER_INSIDE, 12 | CENTER_CROP, 13 | CIRCLE_CROP 14 | } 15 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/imageloader/glide/LocalGlideModule.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.imageloader.glide; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import com.bumptech.glide.GlideBuilder; 8 | import com.bumptech.glide.annotation.GlideModule; 9 | import com.bumptech.glide.load.engine.cache.LruResourceCache; 10 | import com.bumptech.glide.module.AppGlideModule; 11 | 12 | 13 | /** 14 | * Created by huxinyu on 2018/6/8. 15 | * Email : panda.h@foxmail.com 16 | *

17 | * Description :Glide 4.0+ 触发注解生成 GlideApp 类 18 | */ 19 | @GlideModule 20 | public class LocalGlideModule extends AppGlideModule { 21 | 22 | @Override 23 | public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { 24 | int memoryCacheSizeBytes = 1024 * 1024 * 10; // 10mb 内存缓存 25 | builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes)); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/log/bugly/CrashCallback.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.log.bugly 2 | 3 | import com.tencent.bugly.crashreport.CrashReport 4 | 5 | /** 6 | * Created by huxinyu on 2021/12/16. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | class CrashCallback : CrashReport.CrashHandleCallback() { 11 | 12 | override fun onCrashHandleStart( 13 | crashType: Int, 14 | errorType: String?, 15 | errorMessage: String?, 16 | errorStack: String? 17 | ): MutableMap { 18 | //todo 错误日志增加网络状态、存储空间等数据 19 | val logMap = hashMapOf() 20 | return super.onCrashHandleStart(crashType, errorType, errorMessage, errorStack) 21 | } 22 | 23 | override fun onCrashHandleStart2GetExtraDatas( 24 | crashType: Int, 25 | errorType: String?, 26 | errorMessage: String?, 27 | errorStack: String? 28 | ): ByteArray { 29 | return super.onCrashHandleStart2GetExtraDatas( 30 | crashType, 31 | errorType, 32 | errorMessage, 33 | errorStack 34 | ) 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/Action.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission; 3 | 4 | /** 5 | * Created by huxinyu on 2018/12/18. 6 | * Email : panda.h@foxmail.com 7 | *

8 | * Description :action interface for request callback 9 | */ 10 | public interface Action { 11 | 12 | /** 13 | * An action. 14 | * 15 | * @param permissions the current action under permissions. 16 | */ 17 | void onAction(T permissions); 18 | } 19 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/Executor.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission; 3 | 4 | /** 5 | * Created by huxinyu on 2018/12/20. 6 | * Email : panda.h@foxmail.com 7 | *

8 | * Description : 9 | */ 10 | public interface Executor { 11 | 12 | /** 13 | * Go request permission. 14 | */ 15 | void execute(); 16 | } 17 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/ISettingAction.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.permission; 2 | 3 | /** 4 | * Created by huxinyu on 2018/12/18. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description :the attention dialog'actions witch is showing when denied permission 8 | */ 9 | public interface ISettingAction { 10 | /** 11 | * open system permission manage page 12 | */ 13 | void openSetting(); 14 | } 15 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/Rationale.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission; 3 | 4 | import android.content.Context; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by huxinyu on 2018/12/20. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description : 13 | */ 14 | public interface Rationale { 15 | 16 | /** 17 | * Show rationale of permissions to user. 18 | * 19 | * @param context context. 20 | * @param permissions show rationale permissions. 21 | * @param executor executor. 22 | */ 23 | void showRationale(Context context,T permissions, Executor executor); 24 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/install/InstallRequest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.permission.install; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.pandaq.appcore.permission.Action; 6 | 7 | import java.io.File; 8 | 9 | /** 10 | * Created by huxinyu on 2018/12/20. 11 | * Email : panda.h@foxmail.com 12 | *

13 | * Description :install request 14 | */ 15 | public interface InstallRequest { 16 | 17 | /** 18 | * Action to be taken when all permissions are denied. 19 | */ 20 | @NonNull 21 | InstallRequest onDenied(Action denied); 22 | 23 | void start(); 24 | } 25 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/install/NInstallRequest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.permission.install; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.pandaq.appcore.permission.source.Source; 6 | 7 | import java.io.File; 8 | 9 | 10 | /** 11 | * Created by huxinyu on 2018/12/20. 12 | * Email : panda.h@foxmail.com 13 | *

14 | * Description :request install permission for Android O- 15 | */ 16 | public class NInstallRequest extends BaseInstallRequest { 17 | 18 | public NInstallRequest(Source source) { 19 | super.source(source); 20 | } 21 | 22 | 23 | @Override 24 | public void start() { 25 | installExecute(); 26 | } 27 | 28 | @NonNull 29 | @Override 30 | public final InstallRequest file(File apk) { 31 | mFile = apk; 32 | return this; 33 | } 34 | 35 | @NonNull 36 | @Override 37 | public final InstallRequest file(String path) { 38 | mFile = new File(path); 39 | return this; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/runtime/BaseRuntimeRequest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.permission.runtime; 2 | 3 | /** 4 | * Created by huxinyu on 2018/12/24. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description : 8 | */ 9 | abstract class BaseRuntimeRequest implements RuntimeRequest { 10 | /** 11 | * One or more permissions. 12 | */ 13 | abstract RuntimeRequest permission(String... permissions); 14 | 15 | /** 16 | * One or more permission groups. 17 | */ 18 | abstract RuntimeRequest permission(String[]... groups); 19 | } 20 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/source/ContextSource.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission.source; 3 | 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | /** 8 | * Created by huxinyu on 2018/12/18. 9 | * Email : panda.h@foxmail.com 10 | *

11 | * Description :source from context 12 | */ 13 | public class ContextSource extends Source { 14 | 15 | private Context mContext; 16 | 17 | public ContextSource(Context context) { 18 | this.mContext = context; 19 | } 20 | 21 | @Override 22 | public Context getContext() { 23 | return mContext; 24 | } 25 | 26 | @Override 27 | public void startActivity(Intent intent) { 28 | mContext.startActivity(intent); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/test/PermissionTest.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission.test; 3 | 4 | import android.database.Cursor; 5 | 6 | /** 7 | * Created by huxinyu on 2018/12/20. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description :permission test class 11 | */ 12 | public abstract class PermissionTest { 13 | 14 | public abstract boolean test() throws Throwable; 15 | 16 | public void read(Cursor cursor) { 17 | int count = cursor.getCount(); 18 | if (count > 0) { 19 | cursor.moveToFirst(); 20 | int type = cursor.getType(0); 21 | switch (type) { 22 | case Cursor.FIELD_TYPE_BLOB: 23 | case Cursor.FIELD_TYPE_NULL: { 24 | break; 25 | } 26 | case Cursor.FIELD_TYPE_INTEGER: 27 | case Cursor.FIELD_TYPE_FLOAT: 28 | case Cursor.FIELD_TYPE_STRING: 29 | default: { 30 | cursor.getString(0); 31 | break; 32 | } 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/test/PhoneStateReadTest.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission.test; 3 | 4 | import android.annotation.SuppressLint; 5 | import android.content.Context; 6 | import android.telephony.TelephonyManager; 7 | import android.text.TextUtils; 8 | 9 | /** 10 | * Created by huxinyu on 2018/12/20. 11 | * Email : panda.h@foxmail.com 12 | *

13 | * Description :phone state permission tester 14 | */ 15 | public class PhoneStateReadTest extends PermissionTest { 16 | 17 | private Context mContext; 18 | 19 | public PhoneStateReadTest(Context context) { 20 | this.mContext = context; 21 | } 22 | 23 | @SuppressLint({"HardwareIds", "MissingPermission"}) 24 | @Override 25 | public boolean test() throws Throwable { 26 | TelephonyManager service = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); 27 | return !TextUtils.isEmpty(service.getDeviceId()) || !TextUtils.isEmpty(service.getSubscriberId()); 28 | } 29 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/test/SipTest.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission.test; 3 | 4 | import android.content.Context; 5 | import android.net.sip.SipManager; 6 | import android.net.sip.SipProfile; 7 | 8 | /** 9 | * Created by huxinyu on 2018/12/20. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description :sip permission tester 13 | */ 14 | 15 | public class SipTest extends PermissionTest { 16 | 17 | private Context mContext; 18 | 19 | public SipTest(Context context) { 20 | this.mContext = context; 21 | } 22 | 23 | @Override 24 | public boolean test() throws Throwable { 25 | if (!SipManager.isApiSupported(mContext)) { 26 | return true; 27 | } 28 | SipManager manager = SipManager.newInstance(mContext); 29 | if (manager == null) { 30 | return true; 31 | } 32 | SipProfile.Builder builder = new SipProfile.Builder("Permission", "127.0.0.1"); 33 | builder.setPassword("password"); 34 | SipProfile profile = builder.build(); 35 | manager.open(profile); 36 | manager.close(profile.getUriString()); 37 | return true; 38 | } 39 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/test/StorageReadTest.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission.test; 3 | 4 | import android.os.Environment; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * Created by huxinyu on 2018/12/20. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description :read storage permission tester 13 | */ 14 | public class StorageReadTest extends PermissionTest { 15 | 16 | public StorageReadTest() { 17 | } 18 | 19 | @Override 20 | public boolean test() throws Throwable { 21 | File directory = Environment.getExternalStorageDirectory(); 22 | if (directory.exists() && directory.canRead()) { 23 | long modified = directory.lastModified(); 24 | String[] pathList = directory.list(); 25 | return modified > 0 && pathList != null; 26 | } 27 | return false; 28 | } 29 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/test/StorageWriteTest.java: -------------------------------------------------------------------------------- 1 | 2 | package com.pandaq.appcore.permission.test; 3 | 4 | import android.os.Environment; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * Created by huxinyu on 2018/12/20. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description :write storage permission tester 13 | */ 14 | public class StorageWriteTest extends PermissionTest { 15 | 16 | public StorageWriteTest() { 17 | } 18 | 19 | @Override 20 | public boolean test() throws Throwable { 21 | File directory = Environment.getExternalStorageDirectory(); 22 | if (!directory.exists() || !directory.canWrite()) return false; 23 | File file = new File(directory, "ANDROID.PERMISSION.TEST"); 24 | if (file.exists()) { 25 | return file.delete(); 26 | } else { 27 | // try create file,if success delete it 28 | boolean result = file.createNewFile(); 29 | return file.delete(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/permission/test/checker/PermissionChecker.java: -------------------------------------------------------------------------------- 1 | 2 | 3 | package com.pandaq.appcore.permission.test.checker; 4 | 5 | import android.content.Context; 6 | 7 | import androidx.annotation.NonNull; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Created by huxinyu on 2018/12/18. 13 | * Email : panda.h@foxmail.com 14 | *

15 | * Description :permission checker 16 | */ 17 | public interface PermissionChecker { 18 | 19 | /** 20 | * Check if the calling context has a set of permissions. 21 | * 22 | * @param context {@link Context}. 23 | * @param permissions one or more permissions. 24 | * @return true, other wise is false. 25 | */ 26 | boolean hasPermission(@NonNull Context context, @NonNull String... permissions); 27 | 28 | /** 29 | * Check if the calling context has a set of permissions. 30 | * 31 | * @param context {@link Context}. 32 | * @param permissions one or more permissions. 33 | * @return true, other wise is false. 34 | */ 35 | boolean hasPermission(@NonNull Context context, @NonNull List permissions); 36 | 37 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/service/IUpdateService.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.service 2 | 3 | /** 4 | * Created by ZhaoShulin on 2018/6/10 下午12:35. 5 | *
6 | * Desc: 7 | *
8 | */ 9 | interface IUpdateService { 10 | fun onServiceConnected() 11 | fun onServiceDisconnected() 12 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/utils/EventUtils.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.utils; 2 | 3 | import org.greenrobot.eventbus.EventBus; 4 | 5 | /** 6 | * Created by huxinyu on 2018/5/27. 7 | * Email : panda.h@foxmail.com 8 | *

9 | * Description :EventBus 的注册发送工具类,做了重复注册及取消注册的判断 10 | */ 11 | public class EventUtils { 12 | 13 | private static EventUtils sEventUtils; 14 | 15 | public synchronized static EventUtils getDefault() { 16 | if (sEventUtils == null) { 17 | sEventUtils = new EventUtils(); 18 | } 19 | return sEventUtils; 20 | } 21 | 22 | /** 23 | * 注册方法,加判断避免重复注册 24 | * 25 | * @param subscriber 观察者 26 | */ 27 | public void register(Object subscriber) { 28 | if (!EventBus.getDefault().isRegistered(subscriber)) { 29 | EventBus.getDefault().register(subscriber); 30 | } 31 | } 32 | 33 | /** 34 | * 取消注册方法,加判断避免取消未注册观察这 35 | * 36 | * @param subscriber 观察者 37 | */ 38 | public void unregister(Object subscriber) { 39 | if (EventBus.getDefault().isRegistered(subscriber)) { 40 | EventBus.getDefault().unregister(subscriber); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/utils/NetWorkUtils.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.utils 2 | 3 | import android.content.Context 4 | import android.net.ConnectivityManager 5 | import com.pandaq.appcore.utils.system.AppUtils 6 | 7 | /** 8 | * Created by huxinyu on 5/10/21. 9 | * Email : panda.h@foxmail.com 10 | * Description :网络连接工具类 11 | */ 12 | class NetWorkUtils { 13 | 14 | companion object { 15 | fun isNetworkConnected(): Boolean { 16 | val manager = AppUtils.getContext() 17 | .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager 18 | val networks = manager.allNetworks 19 | networks.forEach { 20 | val info = manager.getNetworkInfo(it) 21 | return info?.isConnected ?: false 22 | } 23 | return false 24 | } 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/utils/crypto/CodeFactory.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.utils.crypto; 2 | 3 | import com.pandaq.appcore.utils.crypto.coders.AESCoder; 4 | import com.pandaq.appcore.utils.crypto.coders.Base64Coder; 5 | import com.pandaq.appcore.utils.crypto.coders.DESCoder; 6 | import com.pandaq.appcore.utils.crypto.coders.MD5Coder; 7 | import com.pandaq.appcore.utils.crypto.coders.SHA1Coder; 8 | 9 | /** 10 | * Created by huxinyu on 2018/7/5. 11 | * Email : panda.h@foxmail.com 12 | *

13 | * Description :加密/解密、编码/解码入口工厂类 14 | */ 15 | public class CodeFactory { 16 | private CodeFactory() { 17 | // private constructor 18 | } 19 | 20 | 21 | public static MD5Coder MD5 = MD5Coder.getDefault(); 22 | 23 | public static Base64Coder BASE64 = Base64Coder.getDefault(); 24 | 25 | public static SHA1Coder SHA1 = SHA1Coder.getDefault(); 26 | 27 | public static DESCoder DES = DESCoder.getDefault(); 28 | 29 | public static AESCoder AES = AESCoder.getDefault(); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/utils/crypto/CodeType.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.utils.crypto; 2 | 3 | /** 4 | * Created by huxinyu on 2018/7/6. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description :加密方式类型 8 | */ 9 | public enum CodeType { 10 | SHA("SHA-1"), 11 | MD5("MD5"), 12 | DES("DES"); 13 | 14 | private String type; 15 | 16 | CodeType(String type) { 17 | this.type = type; 18 | } 19 | 20 | public String getType() { 21 | return type; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/utils/format/FormatFactory.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.utils.format; 2 | 3 | import com.pandaq.appcore.utils.format.formaters.DateFormatter; 4 | import com.pandaq.appcore.utils.format.formaters.NumInputFormatter; 5 | import com.pandaq.appcore.utils.format.formaters.PriceFormatter; 6 | import com.pandaq.appcore.utils.format.formaters.SizeFormatter; 7 | 8 | /** 9 | * Created by huxinyu on 2018/7/5. 10 | * Email : panda.h@foxmail.com 11 | *

12 | * Description :Format格式化工具入口类 13 | */ 14 | public class FormatFactory { 15 | 16 | private FormatFactory() { 17 | // private constructor 18 | } 19 | 20 | public static PriceFormatter PRICE = PriceFormatter.getDefault(); 21 | 22 | public static DateFormatter DATE = DateFormatter.getDefault(); 23 | 24 | public static NumInputFormatter NUMBER = NumInputFormatter.getDefault(); 25 | 26 | public static SizeFormatter SIZE = SizeFormatter.getDefault(); 27 | } 28 | -------------------------------------------------------------------------------- /sdk_core/src/main/java/com/pandaq/appcore/utils/format/formaters/PriceFormatter.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore.utils.format.formaters; 2 | 3 | /** 4 | * Created by huxinyu on 2018/7/5. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description :金钱显示格式工具类 8 | */ 9 | public class PriceFormatter { 10 | 11 | private static PriceFormatter sPriceFormatter; 12 | 13 | private PriceFormatter() { 14 | } 15 | 16 | public static synchronized PriceFormatter getDefault() { 17 | if (sPriceFormatter == null) { 18 | sPriceFormatter = new PriceFormatter(); 19 | } 20 | return sPriceFormatter; 21 | } 22 | 23 | /** 24 | * 精确到分 25 | * 26 | * @param money 钱 27 | * @return 钱大写 28 | */ 29 | public String formatRmb(double money) { 30 | return money + ""; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/anim/core_setting_dialog_appear.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/anim/core_setting_dialog_disappear.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/anim/swipe_back_slide_right_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/anim/swipe_back_slide_right_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/drawable/core_webview_process_state.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/drawable/shadow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/sdk_core/src/main/res/drawable/shadow_left.png -------------------------------------------------------------------------------- /sdk_core/src/main/res/values/attrs_theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #CD1103 4 | #9bCD1103 5 | #b4CD1103 6 | #CD1103 7 | #00FFFFFF 8 | #b9b9b9 9 | 10 | @color/colorPrimary 11 | #EEEEEE 12 | 13 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | PandaCore 3 | AppInjector 4 | 5 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/xml/core_permission_file_path.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 10 | 11 | 14 | 15 | 18 | 19 | 22 | 23 | 26 | 27 | 30 | -------------------------------------------------------------------------------- /sdk_core/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | android.bugly.qq.com 10 | 11 | -------------------------------------------------------------------------------- /sdk_core/src/test/java/com/pandaq/appcore/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.appcore; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 3 | repositories { 4 | mavenCentral() 5 | maven { url uri('/Users/pandaq/Desktop/Maven') } 6 | maven { url "https://jitpack.io" } 7 | maven { url 'https://repo1.maven.org/maven2/' } 8 | maven { url "https://oss.sonatype.org/content/repositories/snapshots" } 9 | maven { url "https://s01.oss.sonatype.org/content/groups/public" } 10 | google() 11 | jcenter() 12 | } 13 | } 14 | rootProject.name = "PandaMvp" 15 | include ':app', 16 | ':app_launcher', 17 | ':app_jetpack', 18 | ':app_bmodule', 19 | ':functionlibs:pay', 20 | ':database', 21 | ':sdk_core', 22 | ':uires' 23 | 24 | -------------------------------------------------------------------------------- /uires/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | ======= 10 | # built application files 11 | *.apk 12 | *.ap_ 13 | 14 | # files for the dex VM 15 | *.dex 16 | 17 | # Java class files 18 | *.class 19 | 20 | # generated files 21 | bin/ 22 | gen/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Eclipse project files 28 | .classpath 29 | .project 30 | 31 | # Proguard folder generated by Eclipse 32 | proguard/ 33 | 34 | # Intellij project files 35 | *.iml 36 | *.ipr 37 | *.iws 38 | .idea/ -------------------------------------------------------------------------------- /uires/libs/core_3.0.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/libs/core_3.0.1.jar -------------------------------------------------------------------------------- /uires/src/androidTest/java/com/pandaq/uires/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static junit.framework.TestCase.assertEquals; 12 | 13 | 14 | /** 15 | * Instrumented test, which will execute on an Android device. 16 | * 17 | * @see Testing documentation 18 | */ 19 | @RunWith(AndroidJUnit4.class) 20 | public class ExampleInstrumentedTest { 21 | @Test 22 | public void useAppContext() { 23 | // Context of the app under test. 24 | Context appContext = InstrumentationRegistry.getTargetContext(); 25 | 26 | assertEquals("com.pandaq.commonui.test", appContext.getPackageName()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/commonpage/notfound/NotFoundActivity.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.commonpage.notfound 2 | 3 | import com.alibaba.android.arouter.facade.annotation.Route 4 | import com.pandaq.uires.databinding.ActivityRoute404Binding 5 | import com.pandaq.uires.mvp.BaseActivity 6 | import com.pandaq.uires.mvp.core.BasePresenter 7 | 8 | /** 9 | * Created by huxinyu on 4/23/21. 10 | * Email : panda.h@foxmail.com 11 | * Description :路由丢失页面 12 | */ 13 | @Route(path = "/uires/NotFoundActivity") 14 | class NotFoundActivity : BaseActivity, ActivityRoute404Binding>() { 15 | override fun initVariable() { 16 | 17 | } 18 | 19 | override fun initView() { 20 | 21 | } 22 | 23 | override fun loadData() { 24 | 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/configs/UiConfigs.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.configs 2 | 3 | import com.pandaq.appcore.imageloader.PicLoaderConfig 4 | 5 | /** 6 | * Created by huxinyu on 2019/8/8. 7 | * Email : panda.h@foxmail.com 8 | * Description :公共 ui 的 配置类 9 | */ 10 | class UiConfigs { 11 | 12 | companion object { 13 | 14 | /** 15 | * toast 全局配置 16 | */ 17 | fun toast() = ToastConfig.get() 18 | 19 | /** 20 | * snackbar 全局配置 21 | */ 22 | fun snackbar() = SnackerConfig.get() 23 | 24 | /** 25 | * 图片加载的全局配置 26 | */ 27 | fun imageLoader() = PicLoaderConfig.get() 28 | 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/loading/LoadingView.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.loading; 2 | 3 | /** 4 | * Created by huxinyu on 2018/5/21. 5 | * Email : panda.h@foxmail.com 6 | *

7 | * Description : 加载 dialog 中加入的 LoadingView 需要实现此接口,与加载生命周期相关联 8 | */ 9 | public interface LoadingView { 10 | 11 | void start(); 12 | 13 | void loading(); 14 | 15 | void finish(); 16 | } 17 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/mvp/core/IListVIew.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.mvp.core 2 | 3 | /** 4 | * Created by huxinyu on 5/11/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | interface IListVIew : IView { 9 | 10 | /** 11 | * 显示内容页面,列表分页加载页面使用 12 | */ 13 | fun showContent(hasMore: Boolean) 14 | 15 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/mvp/core/IView.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.mvp.core 2 | 3 | /** 4 | * Created by huxinyu on 2018/9/14. 5 | * Email : panda.h@foxmail.com 6 | * 7 | * 8 | * Description :V 层基础接口实现 9 | * 10 | * 11 | * module 中让 Mvp 的 baseView 实现此接口(app 中将给出实现模板) 12 | */ 13 | interface IView { 14 | 15 | /** 16 | * 显示加载 Loading 17 | */ 18 | fun dialogLoading(cancelAble: Boolean = true, msg: String? = null) 19 | 20 | /** 21 | * 显示加载 Loading 22 | */ 23 | fun dialogLoadingWithCover(msg: String? = null) 24 | 25 | /** 26 | * 出错回调 27 | * 28 | * @param showErrorPage 是否展示错误页面 29 | * @param errMsg 错误信息 30 | */ 31 | fun showError(showErrorPage: Boolean, errMsg: String? = null) 32 | 33 | /** 34 | * 显示空页面 35 | */ 36 | fun showEmpty(msg: String? = null) 37 | 38 | /** 39 | * 显示加载中页面 40 | */ 41 | fun showLoading() 42 | 43 | /** 44 | * 显示内容页面,非分页加载使用 45 | */ 46 | fun showContent() 47 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/popupwindows/ItemData.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.popupwindows; 2 | 3 | /** 4 | * Created by huxinyu on 2019/3/26. 5 | * Email : panda.h@foxmail.com 6 | * Description :列表 popupwindow 的 Item 数据对象 7 | */ 8 | public abstract class ItemData { 9 | private boolean isChecked; 10 | 11 | public boolean isChecked() { 12 | return isChecked; 13 | } 14 | 15 | public void setChecked(boolean checked) { 16 | isChecked = checked; 17 | } 18 | 19 | public abstract String getTitleStr(); 20 | 21 | public abstract int getDrawableRes(); 22 | } 23 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/router/RouteRoot.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.router 2 | 3 | /** 4 | * Created by huxinyu on 2022/2/8. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | class RouteRoot { 9 | companion object { 10 | // 用户组件路由分组 11 | const val USER = "/user" 12 | 13 | // 便民信息组件路由分组 14 | const val INFO = "/information" 15 | 16 | // im 组件路由分组 17 | const val IM = "/im" 18 | 19 | // 收银台组件路由分组 20 | const val CASHIER = "/cashier" 21 | 22 | /** 23 | * 以下为主工程内的模块分组 24 | */ 25 | 26 | // 主模块路由分组 27 | const val MAIN = "/main" 28 | 29 | // 跑腿模块路由分组 30 | const val ERRAND = "/errand" 31 | 32 | // 外卖模块路由分组 33 | const val TAKEOUT = "/takeout" 34 | 35 | // 商城模块路由分组 36 | const val MALL = "/mall" 37 | 38 | 39 | } 40 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/router/degrade/DegradeServiceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.router.degrade 2 | 3 | import android.content.Context 4 | import com.alibaba.android.arouter.facade.Postcard 5 | import com.alibaba.android.arouter.facade.annotation.Route 6 | import com.alibaba.android.arouter.facade.service.DegradeService 7 | import com.alibaba.android.arouter.launcher.ARouter 8 | 9 | /** 10 | * Created by huxinyu on 4/23/21. 11 | * Email : panda.h@foxmail.com 12 | * Description : 路由全局降级策略 13 | */ 14 | @Route(path = "/xxx/xxx") 15 | class DegradeServiceImpl : DegradeService { 16 | override fun onLost(context: Context?, postcard: Postcard?) { 17 | ARouter.getInstance().build("/uires/NotFoundActivity").navigation() 18 | } 19 | 20 | override fun init(context: Context?) { 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/router/service/ICashierService.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.router.service 2 | 3 | import com.alibaba.android.arouter.facade.template.IProvider 4 | 5 | 6 | /** 7 | * Created by huxinyu on 2019/4/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description :收银台组件跨组件路由服务方法暴露 11 | */ 12 | interface ICashierService : IProvider { 13 | 14 | companion object { 15 | const val path = "/service/cashier" 16 | } 17 | 18 | /** 19 | * 支付订单 20 | */ 21 | fun pay(orderId: String) 22 | 23 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/router/service/IUserService.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.router.service 2 | 3 | import com.alibaba.android.arouter.facade.template.IProvider 4 | 5 | 6 | /** 7 | * Created by huxinyu on 2019/4/8. 8 | * Email : panda.h@foxmail.com 9 | *

10 | * Description :用户信息组件跨组件路由服务方法暴露 11 | */ 12 | interface IUserService : IProvider { 13 | 14 | companion object { 15 | const val path = "/service/user" 16 | } 17 | 18 | /** 19 | * 跨组件获取用户 Id 20 | */ 21 | fun getUserId(): String 22 | 23 | /** 24 | * 跨组件获取登陆状态 25 | */ 26 | fun isLogin(): Boolean 27 | 28 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/update/UpdatePopup.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.update 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.Activity 5 | import android.view.LayoutInflater 6 | import com.lxj.xpopup.core.CenterPopupView 7 | import com.pandaq.appcore.utils.system.DisplayUtils 8 | import com.pandaq.uires.R 9 | import com.pandaq.uires.databinding.PopupUpdateBinding 10 | 11 | /** 12 | * Created by huxinyu on 4/27/21. 13 | * Email : panda.h@foxmail.com 14 | * Description : 15 | */ 16 | @SuppressLint("ViewConstructor") 17 | class UpdatePopup(context: Activity, url: String) : CenterPopupView(context) { 18 | 19 | private val apkUrl: String = url 20 | 21 | override fun getImplLayoutId(): Int { 22 | return R.layout.popup_update 23 | } 24 | 25 | override fun offsetLeftAndRight(offset: Int) { 26 | super.offsetLeftAndRight(DisplayUtils.dp2px(32f)) 27 | } 28 | 29 | override fun initPopupContent() { 30 | super.initPopupContent() 31 | val binding = PopupUpdateBinding.inflate(LayoutInflater.from(context)) 32 | binding.btnDownload.setOnClickListener { 33 | // RxPanda.download(url) 34 | // . 35 | } 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/utils/SpanClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.utils 2 | 3 | import android.view.View 4 | 5 | /** 6 | * Created by huxinyu on 2019/8/22. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | interface SpanClickListener { 11 | fun onClick(clickStr: String, widget: View?) 12 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/utils/TextClickSpan.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.utils 2 | 3 | import android.text.TextPaint 4 | import android.text.style.ClickableSpan 5 | import android.view.View 6 | import com.pandaq.appcore.utils.system.AppUtils 7 | import com.pandaq.uires.R 8 | 9 | /** 10 | * Created by huxinyu on 2019/8/22. 11 | * Email : panda.h@foxmail.com 12 | * Description : 13 | */ 14 | /** 15 | * Created by huxinyu on 2019/3/12. 16 | * Email : panda.h@foxmail.com 17 | * Description :TextView 部分文本响应点击事件 18 | */ 19 | open class TextClickSpan(click: SpanClickListener, spanStr: String = "") : ClickableSpan() { 20 | 21 | private var mHighLightColor = AppUtils.getContext().resources.getColor(R.color.res_colorTextMinor) 22 | 23 | private var mClickListener: SpanClickListener? = click 24 | private var mSpanStr: String = spanStr 25 | 26 | 27 | override fun onClick(widget: View) { 28 | mClickListener?.onClick(mSpanStr, widget) 29 | } 30 | 31 | override fun updateDrawState(ds: TextPaint) { 32 | ds.color = mHighLightColor 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/utils/picker/PickerItem.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.utils.picker 2 | 3 | import com.contrarywind.interfaces.IPickerViewData 4 | 5 | /** 6 | * Created by huxinyu on 2020/1/12. 7 | * Email : panda.h@foxmail.com 8 | * Description : 9 | */ 10 | data class PickerItem(val id: String, val value: String) : IPickerViewData { 11 | override fun getPickerViewText(): String = value 12 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/FlowTabLayout.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.ViewGroup 6 | 7 | /** 8 | * Created by huxinyu on 2020/11/30. 9 | * Email : panda.h@foxmail.com 10 | * Description : 11 | */ 12 | class FlowTabLayout @JvmOverloads constructor( 13 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 14 | ) : ViewGroup(context, attrs, defStyleAttr) { 15 | 16 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 17 | // 先计算子 children 尺寸 18 | measureChildren(widthMeasureSpec, heightMeasureSpec) 19 | super.onMeasure(widthMeasureSpec, heightMeasureSpec) 20 | } 21 | 22 | override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/SelfLoopTimeItem.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner 2 | 3 | /** 4 | * Created by huxinyu on 2021/9/8. 5 | * Email : panda.h@foxmail.com 6 | * Description :每个 Item 有独立的停留时间的 banner Item 7 | */ 8 | interface SelfLoopTimeItem { 9 | 10 | fun getPlayTime():Long 11 | 12 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/adapter/BannerImageAdapter.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.adapter; 2 | 3 | import android.view.ViewGroup; 4 | import android.widget.ImageView; 5 | 6 | import com.pandaq.uires.widget.banner.holder.BannerImageHolder; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 默认实现的图片适配器,图片加载需要自己实现 12 | */ 13 | public abstract class BannerImageAdapter extends BannerAdapter { 14 | 15 | public BannerImageAdapter(List mData) { 16 | super(mData); 17 | } 18 | 19 | @Override 20 | public BannerImageHolder onCreateHolder(ViewGroup parent, int viewType) { 21 | ImageView imageView = new ImageView(parent.getContext()); 22 | //注意,必须设置为match_parent,这个是viewpager2强制要求的 23 | ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( 24 | ViewGroup.LayoutParams.MATCH_PARENT, 25 | ViewGroup.LayoutParams.MATCH_PARENT); 26 | imageView.setLayoutParams(params); 27 | imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 28 | return new BannerImageHolder(imageView); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/holder/BannerImageHolder.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.holder; 2 | 3 | import android.view.View; 4 | import android.widget.ImageView; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.recyclerview.widget.RecyclerView; 8 | 9 | public 10 | class BannerImageHolder extends RecyclerView.ViewHolder { 11 | public ImageView imageView; 12 | 13 | public BannerImageHolder(@NonNull View view) { 14 | super(view); 15 | this.imageView = (ImageView) view; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/holder/IViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.holder; 2 | 3 | import android.view.ViewGroup; 4 | 5 | public interface IViewHolder { 6 | 7 | /** 8 | * 创建ViewHolder 9 | * 10 | * @return XViewHolder 11 | */ 12 | VH onCreateHolder(ViewGroup parent, int viewType); 13 | 14 | /** 15 | * 绑定布局数据 16 | * 17 | * @param holder XViewHolder 18 | * @param data 数据实体 19 | * @param position 当前位置 20 | * @param size 总数 21 | */ 22 | void onBindView(VH holder, T data, int position, int size); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/indicator/Indicator.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.indicator; 2 | 3 | import android.view.View; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import com.pandaq.uires.widget.banner.config.IndicatorConfig; 8 | import com.pandaq.uires.widget.banner.listener.OnPageChangeListener; 9 | 10 | public interface Indicator extends OnPageChangeListener { 11 | @NonNull 12 | View getIndicatorView(); 13 | 14 | IndicatorConfig getIndicatorConfig(); 15 | 16 | void onPageChanged(int count, int currentPosition); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/listener/OnBannerListener.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.listener; 2 | 3 | public interface OnBannerListener { 4 | 5 | /** 6 | * 点击事件 7 | * 8 | * @param data 数据实体 9 | * @param position 当前位置 10 | */ 11 | void onBannerClick(T data, int position); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/transformer/BasePageTransformer.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.transformer; 2 | 3 | import androidx.viewpager2.widget.ViewPager2; 4 | 5 | public abstract class BasePageTransformer implements ViewPager2.PageTransformer { 6 | public static final float DEFAULT_CENTER = 0.5f; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/util/BannerLifecycleObserver.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.util; 2 | 3 | import androidx.lifecycle.LifecycleObserver; 4 | import androidx.lifecycle.LifecycleOwner; 5 | 6 | public interface BannerLifecycleObserver extends LifecycleObserver { 7 | 8 | void onStop(LifecycleOwner owner); 9 | 10 | void onStart(LifecycleOwner owner); 11 | 12 | void onDestroy(LifecycleOwner owner); 13 | } 14 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/banner/util/LogUtils.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.banner.util; 2 | 3 | import android.util.Log; 4 | 5 | import com.pandaq.appcore.BuildConfig; 6 | 7 | 8 | public class LogUtils { 9 | public static final String TAG = "banner_log"; 10 | 11 | private static final boolean DEBUG = BuildConfig.IN_DEBUG; 12 | 13 | public static void d(String msg) { 14 | if (DEBUG) { 15 | Log.d(TAG, msg); 16 | } 17 | } 18 | 19 | public static void e(String msg) { 20 | if (DEBUG) { 21 | Log.e(TAG, msg); 22 | } 23 | } 24 | 25 | public static void i(String msg) { 26 | if (DEBUG) { 27 | Log.i(TAG, msg); 28 | } 29 | } 30 | 31 | public static void v( String msg) { 32 | if (DEBUG) { 33 | Log.v(TAG, msg); 34 | } 35 | } 36 | 37 | public static void w(String msg) { 38 | if (DEBUG) { 39 | Log.w(TAG, msg); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/marqueeview/IMarqueeItem.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.marqueeview 2 | 3 | /** 4 | * Created by huxinyu on 5/20/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | interface IMarqueeItem { 9 | 10 | fun getTitle(): String 11 | 12 | fun getTag():String 13 | 14 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/numberkeyboard/NumberInputListener.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.numberkeyboard 2 | 3 | /** 4 | * Created by huxinyu on 6/11/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | interface NumberInputListener { 9 | fun onInputChanged(value:String?) 10 | fun onConfirmed(value:String) 11 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/popup/EditNoticePopup.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.popup 2 | 3 | import android.content.Context 4 | import android.widget.TextView 5 | import com.lxj.xpopup.core.PositionPopupView 6 | import com.pandaq.uires.R 7 | 8 | /** 9 | * Created by huxinyu on 6/11/21. 10 | * Email : panda.h@foxmail.com 11 | * Description : 12 | */ 13 | class EditNoticePopup(context: Context, private val confirmListener: OnClickListener) : 14 | PositionPopupView(context) { 15 | 16 | private lateinit var exit: TextView 17 | private lateinit var cancel: TextView 18 | 19 | override fun initPopupContent() { 20 | super.initPopupContent() 21 | exit = findViewById(R.id.tv_exit) 22 | cancel = findViewById(R.id.tv_cancel) 23 | 24 | cancel.setOnClickListener { 25 | dismiss() 26 | } 27 | 28 | exit.setOnClickListener { 29 | dismiss() 30 | confirmListener.onClick(it) 31 | } 32 | } 33 | 34 | override fun getImplLayoutId(): Int { 35 | return R.layout.popup_exit_notice 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/popup/PandaXPopupCallback.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.popup 2 | 3 | import com.lxj.xpopup.core.BasePopupView 4 | import com.lxj.xpopup.interfaces.XPopupCallback 5 | 6 | /** 7 | * Created by huxinyu on 6/11/21. 8 | * Email : panda.h@foxmail.com 9 | * Description : 10 | */ 11 | abstract class PandaXPopupCallback : XPopupCallback { 12 | override fun onCreated(popupView: BasePopupView?) { 13 | 14 | } 15 | 16 | override fun beforeShow(popupView: BasePopupView?) { 17 | 18 | } 19 | 20 | override fun onShow(popupView: BasePopupView?) { 21 | 22 | } 23 | 24 | override fun onDismiss(popupView: BasePopupView?) { 25 | 26 | } 27 | 28 | override fun beforeDismiss(popupView: BasePopupView?) { 29 | 30 | } 31 | 32 | override fun onBackPressed(popupView: BasePopupView?): Boolean { 33 | return false 34 | } 35 | 36 | override fun onKeyBoardStateChanged(popupView: BasePopupView?, height: Int) { 37 | 38 | } 39 | 40 | override fun onDrag(popupView: BasePopupView?, value: Int, percent: Float, upOrLeft: Boolean) { 41 | 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/recyclerview/managers/NoScrollLinearLayoutManager.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.recyclerview.managers 2 | 3 | import android.content.Context 4 | import androidx.recyclerview.widget.LinearLayoutManager 5 | 6 | /** 7 | * Created by huxinyu on 2019/7/24. 8 | * Email : panda.h@foxmail.com 9 | * Description :可禁止滚动的 layoutManager 10 | */ 11 | class NoScrollLinearLayoutManager : LinearLayoutManager { 12 | 13 | constructor(context: Context) : super(context) 14 | 15 | constructor(context: Context?, orientation: Int, reverseLayout: Boolean) : super(context, orientation, reverseLayout) 16 | 17 | 18 | private var canScrollVertically = false 19 | private var canScrollHorizontally = false 20 | 21 | override fun canScrollVertically(): Boolean { 22 | return canScrollVertically && super.canScrollVertically() 23 | } 24 | 25 | override fun canScrollHorizontally(): Boolean { 26 | return canScrollHorizontally && super.canScrollHorizontally() 27 | } 28 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/recyclerview/managers/NoScrollScrollGridLayoutManager.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.recyclerview.managers; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.recyclerview.widget.GridLayoutManager; 6 | 7 | /** 8 | * Created by huxinyu on 2019/7/24. 9 | * Email : panda.h@foxmail.com 10 | * Description :可禁止滚动的 layoutManager 11 | */ 12 | 13 | public class NoScrollScrollGridLayoutManager extends GridLayoutManager { 14 | private boolean isScrollEnabled = true; 15 | public NoScrollScrollGridLayoutManager(Context context, int spanCount) { 16 | super(context, spanCount); 17 | } 18 | 19 | public void setScrollEnabled(boolean flag) { 20 | this.isScrollEnabled = flag; 21 | } 22 | 23 | @Override 24 | public boolean canScrollVertically() { 25 | //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll 26 | return isScrollEnabled && super.canScrollVertically(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/stateview/DefaultStateClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.stateview 2 | 3 | /** 4 | * Created by huxinyu on 5/7/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 状态布局,异常情况点击回调 7 | */ 8 | interface DefaultStateClickListener { 9 | 10 | fun onEmptyClick() { 11 | 12 | } 13 | 14 | fun onErrorClick() { 15 | 16 | } 17 | 18 | fun onNetErrorClick() { 19 | 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /uires/src/main/java/com/pandaq/uires/widget/stateview/LoadState.kt: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires.widget.stateview 2 | 3 | /** 4 | * Created by huxinyu on 5/7/21. 5 | * Email : panda.h@foxmail.com 6 | * Description : 7 | */ 8 | enum class LoadState(value: Int) { 9 | NORMAL(0), //正常状态 10 | LOADING(1), //加载中 11 | ERROR(2), //加载出错 12 | EMPTY(3), //暂无数据状态 13 | NO_NET(4) //网络异常状态 14 | } -------------------------------------------------------------------------------- /uires/src/main/res/anim/res_dialog_appear.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /uires/src/main/res/anim/res_dialog_disappear.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /uires/src/main/res/anim/res_in_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /uires/src/main/res/anim/res_out_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /uires/src/main/res/color/res_checkable_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /uires/src/main/res/color/res_clickable_text_color_deep.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | -------------------------------------------------------------------------------- /uires/src/main/res/color/res_clickable_text_color_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_ripple_primary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_ripple_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_stateful_ripple_eee_round_4.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 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_stateful_ripple_green_round_8.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_stateful_ripple_primary.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_stateful_ripple_white.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 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_stateful_ripple_white_round_20.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 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-v21/res_stateful_ripple_white_round_4.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 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/fab_bg_mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/fab_bg_mini.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/fab_bg_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/fab_bg_normal.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/ic_arrow_back_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/ic_arrow_back_ios.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/ic_arrow_back_ios_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/ic_arrow_back_ios_white.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/ic_toast_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/ic_toast_error.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/ic_toast_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/ic_toast_success.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/ic_toast_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/ic_toast_warning.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_alipay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_alipay.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_arrow_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_arrow_gray.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_checkbox_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_checkbox_checked.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_checkbox_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_checkbox_normal.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_clear.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_count_decrease.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_count_decrease.webp -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_count_increase.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_count_increase.webp -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_default_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_default_error.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_default_holder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_default_holder.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_menu_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_menu_back.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_menu_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_menu_close.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_menu_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_menu_home.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/icon_wepay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/icon_wepay.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/img_holder_289x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/img_holder_289x192.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/img_holder_550x225.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/img_holder_550x225.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/img_holder_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/img_holder_avatar.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/img_holder_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/img_holder_full.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xhdpi/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xhdpi/shadow.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/fab_bg_mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/fab_bg_mini.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/fab_bg_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/fab_bg_normal.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/ic_arrow_back_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/ic_arrow_back_ios.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/ic_arrow_back_ios_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/ic_arrow_back_ios_white.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/ic_toast_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/ic_toast_error.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/ic_toast_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/ic_toast_success.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/ic_toast_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/ic_toast_warning.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/icon_arrow_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/icon_arrow_gray.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/icon_count_decrease.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/icon_count_decrease.webp -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/icon_count_increase.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/icon_count_increase.webp -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxhdpi/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxhdpi/shadow.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/ic_arrow_back_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/ic_arrow_back_ios.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/ic_arrow_back_ios_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/ic_arrow_back_ios_white.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/ic_toast_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/ic_toast_error.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/ic_toast_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/ic_toast_success.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/ic_toast_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/ic_toast_warning.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/icon_arrow_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/icon_arrow_gray.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/icon_blue_closspe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/icon_blue_closspe.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/icon_blue_expand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/icon_blue_expand.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/icon_count_decrease.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/icon_count_decrease.webp -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/icon_count_increase.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/icon_count_increase.webp -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/pic_flash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/pic_flash.jpg -------------------------------------------------------------------------------- /uires/src/main/res/drawable-xxxhdpi/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable-xxxhdpi/shadow.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable/bg_banner_title_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 13 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/bg_shadow_pink.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable/bg_shadow_pink.9.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable/bg_shadow_white.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable/bg_shadow_white.9.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable/default_loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable/default_loading.gif -------------------------------------------------------------------------------- /uires/src/main/res/drawable/icon_page_404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable/icon_page_404.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable/load_dialog_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_bg_check_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_checkbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_dividing_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_loading_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_loading_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable/res_loading_icon.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_ripple_primary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_ripple_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_round_6_pink.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_round_6_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_shape_999999_round_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_shape_eee_round_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_shape_primary_round_8.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_shape_white_round_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_shape_white_round_12_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_primary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_primary_round_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_primary_round_8.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_red_round_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_white_round_20.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_white_round_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stateful_ripple_white_round_8.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stoke_666_round_6_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stoke_666_round_6_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/res_stoke_red_round_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /uires/src/main/res/drawable/scan_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/drawable/scan_light.png -------------------------------------------------------------------------------- /uires/src/main/res/drawable/shape_notice_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/camera.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/default_empty_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 28 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/default_loading_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/default_refresh_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/fragment_capture.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/no_view_page.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/popup_update_notice.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 18 | 19 | 20 | 28 | 29 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_cn_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_item_list_select_popup.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 26 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_marquee_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 19 | 20 | 29 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_panda_refresh_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_popup_list_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_refresh_recyclerview.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | 25 | 26 | -------------------------------------------------------------------------------- /uires/src/main/res/layout/res_state_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /uires/src/main/res/raw/beep.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PandaQAQ/PandaMvp/c35d159018e1f3956012c4557f90cf6d40c060d5/uires/src/main/res/raw/beep.ogg -------------------------------------------------------------------------------- /uires/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /uires/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | CommonUI 3 | 这里什么都没有 4 | 哎呀,出错了 5 | 加载中··· 6 | 提示 7 | 8 | 9 | 确定 10 | 提交 11 | 12 | 13 | 14 | 15 | 16 | 取消 17 | 18 | 19 | 指示器的颜色只能设置成“@color/colorID or #000000” 20 | Adapter为空!请检查下参数 21 | 成都爱众云算科技有限公司提供技术服务 22 | Hello blank fragment 23 | 24 | -------------------------------------------------------------------------------- /uires/src/test/java/com/pandaq/uires/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.pandaq.uires; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } --------------------------------------------------------------------------------