├── .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 | }
--------------------------------------------------------------------------------