From 1a821404621f529e6e31142db3d8e3a9bc645e5c Mon Sep 17 00:00:00 2001 From: Administrator <981964879@qq.com> Date: Wed, 20 Nov 2019 17:44:39 +0800 Subject: [PATCH] init --- app/build.gradle | 61 ++ app/src/keys/SchoolEbaiFeng.jks | Bin 0 -> 2193 bytes app/src/main/AndroidManifest.xml | 27 + app/src/main/assets/aria_config.xml | 161 ++++ .../java/com/appstore/uiui/MyApplication.java | 100 +++ .../appstore/uiui/activity/MainActivity.java | 208 ++++++ .../com/appstore/uiui/adapter/AppAdapter.java | 161 ++++ .../appstore/uiui/adapter/KindAdapter.java | 80 ++ .../uiui/adapter/LocalAppAdapter.java | 127 ++++ .../com/appstore/uiui/base/BaseActivity.java | 80 ++ .../com/appstore/uiui/base/BaseFragment.java | 85 +++ .../appstore/uiui/base/LazyLoadFragment.java | 76 ++ .../appstore/uiui/base/RefreshManager.java | 57 ++ .../java/com/appstore/uiui/bean/AppInfo.java | 227 ++++++ .../java/com/appstore/uiui/bean/AppInfos.java | 285 +++++++ .../java/com/appstore/uiui/bean/Kind.java | 41 + .../java/com/appstore/uiui/bean/LocalApp.java | 79 ++ .../com/appstore/uiui/common/BuidConfig.java | 7 + .../uiui/fragment/FeaturedFragment.java | 148 ++++ .../appstore/uiui/fragment/KindFragment.java | 83 ++ .../uiui/fragment/ManageFragment.java | 141 ++++ .../appstore/uiui/fragment/RankFragment.java | 179 +++++ .../com/appstore/uiui/network/URLs/Url.java | 9 + .../com/appstore/uiui/utils/ApkUtils.java | 369 +++++++++ .../com/appstore/uiui/utils/ToastUtil.java | 44 ++ .../java/com/appstore/uiui/utils/Utils.java | 707 ++++++++++++++++++ .../drawable-v24/ic_launcher_foreground.xml | 34 + ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 148 bytes app/src/main/res/drawable/btn_selector.xml | 10 + app/src/main/res/drawable/favorite_bg.png | Bin 0 -> 43985 bytes .../main/res/drawable/favorite_btn_normal.png | Bin 0 -> 865 bytes .../res/drawable/favorite_btn_pressed.png | Bin 0 -> 1006 bytes .../main/res/drawable/favorite_selector.xml | 7 + app/src/main/res/drawable/ic_action_bar.png | Bin 0 -> 26994 bytes app/src/main/res/drawable/ic_app.png | Bin 0 -> 6606 bytes app/src/main/res/drawable/ic_back.png | Bin 0 -> 1506 bytes app/src/main/res/drawable/ic_kind_detail.png | Bin 0 -> 291 bytes .../res/drawable/ic_launcher_background.xml | 170 +++++ app/src/main/res/drawable/ic_logo.png | Bin 0 -> 1252 bytes app/src/main/res/drawable/ic_menu_search.png | Bin 0 -> 1780 bytes .../res/drawable/ic_menu_share_normal.png | Bin 0 -> 1001 bytes .../res/drawable/ic_menu_share_pressed.png | Bin 0 -> 1791 bytes app/src/main/res/drawable/ic_overflow.png | Bin 0 -> 331 bytes app/src/main/res/drawable/ic_overflow1.png | Bin 0 -> 214 bytes app/src/main/res/drawable/ic_place_holder.png | Bin 0 -> 5915 bytes .../main/res/drawable/ll_customer_normal.xml | 6 + .../res/drawable/ll_customer_selected.xml | 6 + app/src/main/res/drawable/ll_selector.xml | 12 + app/src/main/res/drawable/search_bottom.png | Bin 0 -> 2381 bytes app/src/main/res/drawable/share_selector.xml | 7 + app/src/main/res/layout/activity_main.xml | 92 +++ app/src/main/res/layout/fragment_collect.xml | 47 ++ .../res/layout/fragment_download_record.xml | 47 ++ .../res/layout/fragment_downloadfinish.xml | 12 + .../main/res/layout/fragment_downloading.xml | 11 + app/src/main/res/layout/fragment_featured.xml | 18 + app/src/main/res/layout/fragment_kind.xml | 11 + .../main/res/layout/fragment_kind_detail.xml | 19 + app/src/main/res/layout/fragment_localapp.xml | 17 + app/src/main/res/layout/fragment_manage.xml | 73 ++ app/src/main/res/layout/fragment_rank.xml | 18 + .../res/layout/include_line_horizontal.xml | 9 + .../main/res/layout/include_line_vertical.xml | 8 + app/src/main/res/layout/item_app.xml | 96 +++ .../main/res/layout/item_donwloadfinish.xml | 51 ++ app/src/main/res/layout/item_donwloading.xml | 70 ++ app/src/main/res/layout/item_image.xml | 14 + app/src/main/res/layout/item_kind.xml | 43 ++ app/src/main/res/layout/item_local_app.xml | 95 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes app/src/main/res/values-sw1024dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw1280dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw1365dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw320dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw360dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw384dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw392dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw400dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw410dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw411dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw432dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw480dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw533dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw592dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw600dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw640dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw662dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw720dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw768dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw800dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw811dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw820dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw960dp/dimens.xml | 419 +++++++++++ app/src/main/res/values-sw961dp/dimens.xml | 419 +++++++++++ app/src/main/res/values/colors.xml | 13 + app/src/main/res/values/dimens.xml | 427 +++++++++++ app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/styles.xml | 11 + build.gradle | 27 + gradle.properties | 20 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + screenMatch.properties | 54 ++ screenMatch_example_dimens.xml | 431 +++++++++++ settings.gradle | 2 + 116 files changed, 15607 insertions(+) create mode 100644 app/build.gradle create mode 100644 app/src/keys/SchoolEbaiFeng.jks create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/aria_config.xml create mode 100644 app/src/main/java/com/appstore/uiui/MyApplication.java create mode 100644 app/src/main/java/com/appstore/uiui/activity/MainActivity.java create mode 100644 app/src/main/java/com/appstore/uiui/adapter/AppAdapter.java create mode 100644 app/src/main/java/com/appstore/uiui/adapter/KindAdapter.java create mode 100644 app/src/main/java/com/appstore/uiui/adapter/LocalAppAdapter.java create mode 100644 app/src/main/java/com/appstore/uiui/base/BaseActivity.java create mode 100644 app/src/main/java/com/appstore/uiui/base/BaseFragment.java create mode 100644 app/src/main/java/com/appstore/uiui/base/LazyLoadFragment.java create mode 100644 app/src/main/java/com/appstore/uiui/base/RefreshManager.java create mode 100644 app/src/main/java/com/appstore/uiui/bean/AppInfo.java create mode 100644 app/src/main/java/com/appstore/uiui/bean/AppInfos.java create mode 100644 app/src/main/java/com/appstore/uiui/bean/Kind.java create mode 100644 app/src/main/java/com/appstore/uiui/bean/LocalApp.java create mode 100644 app/src/main/java/com/appstore/uiui/common/BuidConfig.java create mode 100644 app/src/main/java/com/appstore/uiui/fragment/FeaturedFragment.java create mode 100644 app/src/main/java/com/appstore/uiui/fragment/KindFragment.java create mode 100644 app/src/main/java/com/appstore/uiui/fragment/ManageFragment.java create mode 100644 app/src/main/java/com/appstore/uiui/fragment/RankFragment.java create mode 100644 app/src/main/java/com/appstore/uiui/network/URLs/Url.java create mode 100644 app/src/main/java/com/appstore/uiui/utils/ApkUtils.java create mode 100644 app/src/main/java/com/appstore/uiui/utils/ToastUtil.java create mode 100644 app/src/main/java/com/appstore/uiui/utils/Utils.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 app/src/main/res/drawable/btn_selector.xml create mode 100644 app/src/main/res/drawable/favorite_bg.png create mode 100644 app/src/main/res/drawable/favorite_btn_normal.png create mode 100644 app/src/main/res/drawable/favorite_btn_pressed.png create mode 100644 app/src/main/res/drawable/favorite_selector.xml create mode 100644 app/src/main/res/drawable/ic_action_bar.png create mode 100644 app/src/main/res/drawable/ic_app.png create mode 100644 app/src/main/res/drawable/ic_back.png create mode 100644 app/src/main/res/drawable/ic_kind_detail.png create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_logo.png create mode 100644 app/src/main/res/drawable/ic_menu_search.png create mode 100644 app/src/main/res/drawable/ic_menu_share_normal.png create mode 100644 app/src/main/res/drawable/ic_menu_share_pressed.png create mode 100644 app/src/main/res/drawable/ic_overflow.png create mode 100644 app/src/main/res/drawable/ic_overflow1.png create mode 100644 app/src/main/res/drawable/ic_place_holder.png create mode 100644 app/src/main/res/drawable/ll_customer_normal.xml create mode 100644 app/src/main/res/drawable/ll_customer_selected.xml create mode 100644 app/src/main/res/drawable/ll_selector.xml create mode 100644 app/src/main/res/drawable/search_bottom.png create mode 100644 app/src/main/res/drawable/share_selector.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/fragment_collect.xml create mode 100644 app/src/main/res/layout/fragment_download_record.xml create mode 100644 app/src/main/res/layout/fragment_downloadfinish.xml create mode 100644 app/src/main/res/layout/fragment_downloading.xml create mode 100644 app/src/main/res/layout/fragment_featured.xml create mode 100644 app/src/main/res/layout/fragment_kind.xml create mode 100644 app/src/main/res/layout/fragment_kind_detail.xml create mode 100644 app/src/main/res/layout/fragment_localapp.xml create mode 100644 app/src/main/res/layout/fragment_manage.xml create mode 100644 app/src/main/res/layout/fragment_rank.xml create mode 100644 app/src/main/res/layout/include_line_horizontal.xml create mode 100644 app/src/main/res/layout/include_line_vertical.xml create mode 100644 app/src/main/res/layout/item_app.xml create mode 100644 app/src/main/res/layout/item_donwloadfinish.xml create mode 100644 app/src/main/res/layout/item_donwloading.xml create mode 100644 app/src/main/res/layout/item_image.xml create mode 100644 app/src/main/res/layout/item_kind.xml create mode 100644 app/src/main/res/layout/item_local_app.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-sw1024dp/dimens.xml create mode 100644 app/src/main/res/values-sw1280dp/dimens.xml create mode 100644 app/src/main/res/values-sw1365dp/dimens.xml create mode 100644 app/src/main/res/values-sw320dp/dimens.xml create mode 100644 app/src/main/res/values-sw360dp/dimens.xml create mode 100644 app/src/main/res/values-sw384dp/dimens.xml create mode 100644 app/src/main/res/values-sw392dp/dimens.xml create mode 100644 app/src/main/res/values-sw400dp/dimens.xml create mode 100644 app/src/main/res/values-sw410dp/dimens.xml create mode 100644 app/src/main/res/values-sw411dp/dimens.xml create mode 100644 app/src/main/res/values-sw432dp/dimens.xml create mode 100644 app/src/main/res/values-sw480dp/dimens.xml create mode 100644 app/src/main/res/values-sw533dp/dimens.xml create mode 100644 app/src/main/res/values-sw592dp/dimens.xml create mode 100644 app/src/main/res/values-sw600dp/dimens.xml create mode 100644 app/src/main/res/values-sw640dp/dimens.xml create mode 100644 app/src/main/res/values-sw662dp/dimens.xml create mode 100644 app/src/main/res/values-sw720dp/dimens.xml create mode 100644 app/src/main/res/values-sw768dp/dimens.xml create mode 100644 app/src/main/res/values-sw800dp/dimens.xml create mode 100644 app/src/main/res/values-sw811dp/dimens.xml create mode 100644 app/src/main/res/values-sw820dp/dimens.xml create mode 100644 app/src/main/res/values-sw960dp/dimens.xml create mode 100644 app/src/main/res/values-sw961dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 screenMatch.properties create mode 100644 screenMatch_example_dimens.xml create mode 100644 settings.gradle diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..4980645 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,61 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + defaultConfig { + applicationId "com.appstore.uiui" + minSdkVersion 23 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.recyclerview:recyclerview:1.0.0' + + //github第三方控件maven + implementation 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar' + //下拉刷新控件 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //1.0.5及以前版本的老用户升级需谨慎,API改动过大 + implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0' //没有使用特殊Header,可以不加这行 + + implementation 'com.github.bumptech.glide:glide:4.10.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' + + implementation 'com.arialyy.aria:core:3.7.7' + annotationProcessor 'com.arialyy.aria:compiler:3.7.7' + //OKGO + implementation 'com.lzy.net:okgo:3.0.4' + implementation 'com.lzy.net:okrx:1.0.2' + implementation 'com.lzy.net:okserver:2.0.5' + + implementation 'com.alibaba:fastjson:1.2.21' + + implementation 'com.blankj:utilcode:1.23.7' + //动态权限框架 + implementation 'com.hjq:xxpermissions:6.0' + + implementation 'com.squareup.retrofit2:converter-scalars:2.1.0' + implementation 'com.squareup.retrofit2:converter-gson:2.1.0' + implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0' + implementation 'io.reactivex:rxjava:1.2.2' + implementation 'io.reactivex:rxandroid:1.2.1' + testImplementation 'junit:junit:4.12' + + + androidTestImplementation 'androidx.test.ext:junit:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + implementation 'androidx.cardview:cardview:1.0.0' +} diff --git a/app/src/keys/SchoolEbaiFeng.jks b/app/src/keys/SchoolEbaiFeng.jks new file mode 100644 index 0000000000000000000000000000000000000000..367b25e9e78904cc52faa1d0402a00ebfb1fe3d1 GIT binary patch literal 2193 zcmcK4`8U*!8UXO`cV>)bEV;-|k`|hL$2tm&h6tNi+tNLTIds>LsGG zXOJu*VzNfElx>tHOZM$LoqNxD`vdNI&hx|Pr{_G&d3NV^=KuhJ?I-v<5gsnV&_2lZ zhxHW!fDMEwh#iO*$)$h<5uiMb9|YL|1O@S3g5)|o8Oa^E-I+LrTpS9mrB)p2d!NUx zdZ*#zcwz}mDrMMSsi7}@Dfn7-n_JK^DQ$1f(vypOOluVr)epC6b&;5)TD|h;MOClv z=N$i}o|CBF)da6qKshEAblf=|&t1nYJP2(9AUHY+Id~=lFxXmTI|Laj8|u>{L=?yoWptV z%(jU~g5;*LQ~jqq&7X2yj$aVA*m~qU%)y~-V~T$X5Q;Rw!u4tNGPl~S^E4Nyj_Rn1 zNlVWM#*zq-YgI3}j8Gp=EmhOkmanMTFuS&~7d#tH$KK;4nf1i#_j#uI=n2ihh+pS= zm%4#ct(oR*+;a;rR(e6lfy}>sglRDlMIviKQpSt-GYJP1Q`FKR0N< z4ETq1>y|K-cO?mNd$`8YW3e%PO$_+I7ZcE8454%*6_GUiVbLp+ZNx-tA>zFtZ{hW$F;u6G*7H zU>O&G>nO|8NjvxWfWgsrFC!#cLy3>Zv zDF~NfsZ=O;n?|$3`a3(vP9!s-@`((K8zb@^FDLNGN%Y#wzLnRm^w9@D-|e`|G@KOV zta29=r#?b%Mv(}lqUu^8?wpKaS%TMWLM3x&OLr^5HdHZDHydxFt*?N@5u5UIJPn16 z^NJnSi%{f^jMn^zC#H4DK9^F)X7|n*ysF+dzy`3V#}$L-HS^!QEGx2R2g|}n+tf6! z%(UOHY&{(`ET+o8ZM6-lI{O9OhvlwT#}uRTt6?MJPYse4X>v82w70GeXWA2WF<;)V z2aMWVi)fwP86bFf?|$|K>yJqRq3_R-5X2`!RE)Cv!=Rr|J-%_a{RdC%O11Nh+?S+X zxm~bO*WITeC-P!d0PlizzA}EaY?f%?V^k(->|<6cy{6fPI&ZonG*fi}yHw+z^-WM^GKRhQ!snD8iDBqz;=5=rb05l@r0+!Q+M!%nr*BrfEeUNd26+*-f#i{#vKS#5l3!f$5crjnf_ zy4T#X$^!`f{#7z4A;s52S7}Atx<1_D1N}-eY51|r0dB3)Ib(q`6Ac$fE0a_37-#J- zjN=1gn{v}{a#|8eSIzx39c7wfB!$7sP$#8%v7xBB8BZ+!_giEmo>GN00054IC~!lF z0#nR}!$24ep{d`2hj@^j@=-=nYdj!`Vgn#c3^&AugcA@*0XRlU`G4a0L+pQu>kpy+ z5d60wDPbOrI)vR14U9TQ#a5U{MQI;O|KA&ah|0?< zC_PKLVIRxV{q;&;s-)~J8I$=_^z%o*UC>Dk7kWUk?%T616fHW@G!ndEZo9K%vBPTaR=yP*a&L52r=_b;-<-AD3b& zt@8f>YegTX@x+}%F?za}Ew1Oi=Rbg7Jz$h-d(}N^b&sw+X=@*)l*1PfQ12S4EpJ6a|vWtkhDyM>5*1^*o4{*CMp5d=Jig&YV3dOY<C zV3}2~_+xyM2(dDtsq{g7gjn4hhfp^~0omqD5)KMctn?en13}V{0=IOde>nJRHRhMx ztuDW9L@;wh#vM}ZBS*M@^B94dbX@>gz4@`5431wC@9w;N>yMplG@knV;(2>JlAJv} zFoOuDdaN`QdOmX+SdCWahRDX&)kjwx2ZgT-Zmav_DvW*LcP9yfQ4)zk&uCGalgpNK zR$;>T%H-Ejkj)Muqu;0{E#*u5zowagJz=}yo^a>Kk(ygnK4~N`dLuxb-VpF+XN%}6 zP(k$#W<7|>l!&zzw_B$*ifr3U=@5rWSn6m2Z>AbBjZLz)<0VlQ*^<`^bKS0re~pD^ GjQ#_6+s8Ek literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..588adaa --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml new file mode 100644 index 0000000..3a36cd5 --- /dev/null +++ b/app/src/main/assets/aria_config.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/appstore/uiui/MyApplication.java b/app/src/main/java/com/appstore/uiui/MyApplication.java new file mode 100644 index 0000000..5e058f8 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/MyApplication.java @@ -0,0 +1,100 @@ +package com.appstore.uiui; + +import android.app.Application; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.arialyy.aria.core.Aria; +import com.lzy.okgo.OkGo; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator; +import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator; +import com.scwang.smartrefresh.layout.api.RefreshFooter; +import com.scwang.smartrefresh.layout.api.RefreshHeader; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.footer.ClassicsFooter; +import com.scwang.smartrefresh.layout.header.ClassicsHeader; + +/** + * Created by asus on 2017/10/27. + */ + +public class MyApplication extends Application { + private static MyApplication app; + + public static MyApplication getInstance() { + return app; + } + + //static 代码段可以防止内存泄露 + static { + //设置全局的Header构建器 + SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() { + @NonNull + @Override + public RefreshHeader createRefreshHeader(@NonNull Context context, @NonNull RefreshLayout layout) { + layout.setPrimaryColorsId(R.color.backgroundcolor, android.R.color.white);//全局设置主题颜色 + return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header + } + }); + //设置全局的Footer构建器 + SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() { + @Override + public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) { + //指定为经典Footer,默认是 BallPulseFooter + return new ClassicsFooter(context).setDrawableSize(20); + } + }); + } + + @Override + public void onCreate() { + super.onCreate(); + app = this; + OkGo.getInstance().init(this); +// AppUtil.getInstalledApp(this); + Aria.init(this); + Aria.get(this).getDownloadConfig().setMaxTaskNum(1); + Aria.download(this).register(); + if (!isDebug(this)) { + catchException(); + } + } + + public boolean isDebug(Context context) { + boolean isDebug = context.getApplicationInfo() != null && + (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + return isDebug; + } + + private void catchException() { + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) { + Log.d("捕获异常子线程:", Thread.currentThread().getName() + + "在:" + e.getStackTrace()[0].getClassName()); + } + } + ); + //下面是新增方法! + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + while (true) { + try { + Looper.loop(); //会先执行这个方法,然后在执行下面的异常捕获方法! + } catch (Exception e) { + Log.d("捕获异常主线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); + e.printStackTrace(); + } + } + } + }); + } + +} diff --git a/app/src/main/java/com/appstore/uiui/activity/MainActivity.java b/app/src/main/java/com/appstore/uiui/activity/MainActivity.java new file mode 100644 index 0000000..20842cc --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/activity/MainActivity.java @@ -0,0 +1,208 @@ +package com.appstore.uiui.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.appstore.uiui.R; +import com.appstore.uiui.base.BaseActivity; +import com.appstore.uiui.fragment.FeaturedFragment; +import com.appstore.uiui.fragment.KindFragment; +import com.appstore.uiui.fragment.ManageFragment; +import com.appstore.uiui.fragment.RankFragment; +import com.appstore.uiui.utils.ApkUtils; +import com.appstore.uiui.utils.ToastUtil; +import com.arialyy.annotations.Download; +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.listener.ISchedulers; +import com.arialyy.aria.core.task.DownloadTask; +import com.arialyy.aria.util.ALog; +import com.blankj.utilcode.util.ToastUtils; +import com.flyco.tablayout.SlidingTabLayout; +import com.hjq.permissions.OnPermission; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends BaseActivity { + private RelativeLayout search_layout; + private ImageView iv_download; + private SlidingTabLayout mSlidingTabLayout; + private ViewPager mViewPager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Aria.download(this).register(); + requestPermission(); + } + + @Override + protected int setLayoutResourceID() { + return R.layout.activity_main; + } + + @Override + protected void initView() { + iv_download = findViewById(R.id.iv_download); + iv_download.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + } + }); + search_layout = findViewById(R.id.search_layout); + search_layout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + } + }); + mSlidingTabLayout = findViewById(R.id.main_sliding_tab_layout); + mViewPager = findViewById(R.id.main_view_pager); + initTabLayout(); + } + + private void initTabLayout() { + final List fragmentList = new ArrayList<>(); + fragmentList.add(new FeaturedFragment()); + fragmentList.add(new RankFragment()); + fragmentList.add(new KindFragment()); + fragmentList.add(new ManageFragment()); + mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return 4; + } + }); + mViewPager.setOffscreenPageLimit(3); + String titles[] = new String[]{"推荐", "排行", "分类", "管理"}; + mSlidingTabLayout.setViewPager(mViewPager, titles); + } + + @Override + protected void initData() { + + } + + @Override + protected void setListener() { + + } + + private String[] permission = new String[]{ +// Permission.SYSTEM_ALERT_WINDOW, +// Permission.CAMERA, +// Permission.READ_SMS, +// Permission.RECEIVE_SMS, +// Permission.SEND_SMS, + Permission.READ_EXTERNAL_STORAGE, + Permission.WRITE_EXTERNAL_STORAGE, +// Permission.READ_PHONE_STATE + }; + + public void requestPermission() { + XXPermissions.with(this) + // 可设置被拒绝后继续申请,直到用户授权或者永久拒绝 + .constantRequest() + // 支持请求6.0悬浮窗权限8.0请求安装权限 + //.permission(Permission.REQUEST_INSTALL_PACKAGES) + // 不指定权限则自动获取清单中的危险权限 + .permission(permission) + .request(new OnPermission() { + + @Override + public void hasPermission(List granted, boolean isAll) { + if (isAll) { + String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "POStemp"; + File file = new File(path); + file.mkdirs(); + } else { + ToastUtil.show("需要授予所有权限才能正常使用本程序!"); + } + } + + @Override + public void noPermission(List denied, boolean quick) { + if (quick) { + ToastUtil.show("被永久拒绝授权,请手动授予权限!"); + //如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.gotoPermissionSettings(MainActivity.this); + } else { + ToastUtil.show("获取权限失败"); + } + } + }); + } + + //在这里处理任务执行中的状态,如进度进度条的刷新 + @Download.onTaskRunning + protected void running(DownloadTask task) { + Log.e("fanhuitong", "正在下载:" + "State:" + task.getState() + "\t进度:" + task.getPercent() + "%" + "-" + task.getExtendField()); + ToastUtils.showShort("正在下载:" + task.getExtendField() + "\t" + task.getPercent() + "%"); + } + + @Download.onTaskComplete + void taskComplete(DownloadTask task) { + //在这里处理任务完成的状态 + String downloadPath = task.getFilePath(); + String packageName = task.getExtendField(); + Log.e("fanhuitong", "downloadPath::" + downloadPath); + Log.e("fanhuitong", "extendField::" + packageName); + ApkUtils.installApkInSilence(downloadPath, packageName); + } + private static final String TAG = "fanhuitong"; + + BroadcastReceiver receiver = new BroadcastReceiver() { + @Override public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(ISchedulers.ARIA_TASK_INFO_ACTION)){ + // 获取任务状态 + ALog.d(TAG, "state = " + intent.getIntExtra(ISchedulers.TASK_STATE, -1)); + // 获取任务类型 + ALog.d(TAG, "type = " + intent.getIntExtra(ISchedulers.TASK_TYPE, -1)); + // 获取任务状态速度,单位为byte/s + ALog.d(TAG, "speed = " + intent.getLongExtra(ISchedulers.TASK_SPEED, -1)); + // 获取任务进度,0-100 + ALog.d(TAG, "percent = " + intent.getIntExtra(ISchedulers.TASK_PERCENT, -1)); + // 获取任务实体 + ALog.d(TAG, "entity = " + intent.getParcelableExtra(ISchedulers.TASK_ENTITY).toString()); + } + } + }; + + @Override protected void onResume() { + super.onResume(); + registerReceiver(receiver, new IntentFilter(ISchedulers.ARIA_TASK_INFO_ACTION)); + } + + @Override protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(receiver); + //Aria.download(this).unRegister(); + } + + + + +} diff --git a/app/src/main/java/com/appstore/uiui/adapter/AppAdapter.java b/app/src/main/java/com/appstore/uiui/adapter/AppAdapter.java new file mode 100644 index 0000000..e7fad68 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/adapter/AppAdapter.java @@ -0,0 +1,161 @@ +package com.appstore.uiui.adapter; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RatingBar; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.appstore.uiui.BuildConfig; +import com.appstore.uiui.R; +import com.appstore.uiui.bean.AppInfo; + +import com.arialyy.annotations.AriaConstance; +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.AriaConfig; +import com.arialyy.aria.core.AriaManager; +import com.blankj.utilcode.util.EncryptUtils; +import com.blankj.utilcode.util.PathUtils; +import com.bumptech.glide.Glide; + + +import java.util.List; + +/** + * Created by asus on 2017/10/23. + */ + +public class AppAdapter extends RecyclerView.Adapter { + + private List mAppInfoList; + + private Context mContext; + + private boolean isShowOrder; + + private boolean isNotLoadBitmap = false; + + //order代表是否显示所在的位置,1.2.3. + public AppAdapter(List appInfoList, boolean isShowOrder, boolean isNotLoadBitmap) { + this.mAppInfoList = appInfoList; + this.isShowOrder = isShowOrder; + this.isNotLoadBitmap = isNotLoadBitmap; + } + + @Override + public FeaturedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new FeaturedViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_app, parent, false)); + } + + @Override + public void onBindViewHolder(FeaturedViewHolder holder, final int position) { + final AppInfo appInfo = mAppInfoList.get(position); + if (!isNotLoadBitmap) { + Glide.with(mContext).asBitmap().load(appInfo.getApp_img()).placeholder(R.drawable.ic_place_holder).into(holder.ivIcon); + } else { + Glide.with(mContext).load(R.drawable.ic_place_holder).into(holder.ivIcon); + } + holder.tvCompany.setText(appInfo.getApp_developer()); + if (isShowOrder) { + holder.tvName.setText((position + 1) + "." + appInfo.getApp_name()); + } else { + holder.tvName.setText(appInfo.getApp_name()); + } + holder.ratingBar.setRating((float) appInfo.getApp_score()); + + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// DetailActivity.startDetailActivity(mContext, appInfo); + } + }); + + if (appInfo.isInstall()) { + if (appInfo.isUpdate()) { + holder.btnDownLoad.setText("升级"); + holder.cardView.setVisibility(View.VISIBLE); + holder.btnDownLoad.setVisibility(View.VISIBLE); + holder.tvInstalled.setVisibility(View.GONE); + holder.btnDownLoad.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(mContext, "开始下载,假装下载中", Toast.LENGTH_SHORT).show(); + } + }); + } else { + holder.cardView.setVisibility(View.GONE); + holder.tvInstalled.setText("已安装"); + holder.btnDownLoad.setVisibility(View.GONE); + holder.tvInstalled.setVisibility(View.VISIBLE); + } + } else { + holder.cardView.setVisibility(View.VISIBLE); + holder.btnDownLoad.setText("下载"); + holder.btnDownLoad.setVisibility(View.VISIBLE); + holder.tvInstalled.setVisibility(View.GONE); + + holder.btnDownLoad.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// Toast.makeText(mContext, "开始下载,假装下载中", Toast.LENGTH_SHORT).show(); + String url = appInfo.getApp_url(); + + Aria.download(mContext) + .load(url) //读取下载地址 + .setFilePath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString(url) + ".apk", true) + .setExtendField(appInfo.getApp_name()) + .create();//启动下载}} + + } + }); + } + + } + + @Override + public int getItemCount() { + return mAppInfoList.size(); + } + + public static class FeaturedViewHolder extends RecyclerView.ViewHolder { + ImageView ivIcon; + TextView tvCompany, tvName; + Button btnDownLoad; + RatingBar ratingBar; + TextView tvInstalled; + CardView cardView; + + public FeaturedViewHolder(View itemView) { + super(itemView); + ivIcon = itemView.findViewById(R.id.app_iv_icon); + tvCompany = itemView.findViewById(R.id.app_tv_company); + tvName = itemView.findViewById(R.id.app_tv_name); + btnDownLoad = itemView.findViewById(R.id.app_btn_download); + ratingBar = itemView.findViewById(R.id.app_rating_bar); + tvInstalled = itemView.findViewById(R.id.app_tv_installed); + cardView = itemView.findViewById(R.id.app_card_view); + } + } + + public void setNotLoadBitmap(boolean isNotLoadBitmap) { + this.isNotLoadBitmap = isNotLoadBitmap; + notifyDataSetChanged(); + } + + public void setData(List appInfos) { + this.mAppInfoList = appInfos; + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/appstore/uiui/adapter/KindAdapter.java b/app/src/main/java/com/appstore/uiui/adapter/KindAdapter.java new file mode 100644 index 0000000..ca2fe37 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/adapter/KindAdapter.java @@ -0,0 +1,80 @@ +package com.appstore.uiui.adapter; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.appstore.uiui.R; +import com.appstore.uiui.bean.Kind; +import com.bumptech.glide.Glide; + +import java.util.List; + +/** + * Created by asus on 2017/10/25. + */ + +public class KindAdapter extends RecyclerView.Adapter { + + private List mKindList; + private Context mContext; + private boolean isNotLoadBitmap = false; + + public KindAdapter(List mKindList, boolean isLoadBitmap) { + this.mKindList = mKindList; + this.isNotLoadBitmap = isLoadBitmap; + } + + @Override + public KindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new KindViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_kind, parent, false)); + } + + @Override + public void onBindViewHolder(KindViewHolder holder, int position) { + final Kind kind = mKindList.get(position); + holder.tvName.setText(kind.getName()); + if (!isNotLoadBitmap) { + Glide.with(mContext).load(kind.getIcon()).into(holder.ivIcon); + } else { + Log.d("test", "不加载图片"); + Glide.with(mContext).load(R.drawable.ic_place_holder).into(holder.ivIcon); + } + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// KindDetailActivity.startActivity(mContext, kind.getCategory(), kind.getName()); + } + }); + + } + + @Override + public int getItemCount() { + return mKindList.size(); + } + + public static class KindViewHolder extends RecyclerView.ViewHolder { + ImageView ivIcon, ivDetail; + TextView tvName; + + public KindViewHolder(View itemView) { + super(itemView); + ivIcon = itemView.findViewById(R.id.kind_iv_icon); + ivDetail = itemView.findViewById(R.id.kind_iv_detail); + tvName = itemView.findViewById(R.id.kind_tv_name); + } + } + + public void setNotLoadBitmap(boolean isNotLoadBitmap) { + this.isNotLoadBitmap = isNotLoadBitmap; + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/appstore/uiui/adapter/LocalAppAdapter.java b/app/src/main/java/com/appstore/uiui/adapter/LocalAppAdapter.java new file mode 100644 index 0000000..1ca06ac --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/adapter/LocalAppAdapter.java @@ -0,0 +1,127 @@ +package com.appstore.uiui.adapter; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.appstore.uiui.R; +import com.appstore.uiui.bean.AppInfo; +import com.appstore.uiui.bean.LocalApp; + +import java.util.List; + + +/** + * Created by asus on 2017/10/26. + */ + +public class LocalAppAdapter extends RecyclerView.Adapter { + + private Context context; + + private List localAppList; + + public LocalAppAdapter(List localAppList) { + this.localAppList = localAppList; + + } + + @Override + public LocalAppViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + context = parent.getContext(); + return new LocalAppViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_local_app, parent, false)); + } + + @Override + public void onBindViewHolder(LocalAppViewHolder holder, int position) { + final LocalApp localApp = localAppList.get(position); + + holder.ivIcon.setBackgroundDrawable(localApp.getIcon()); + holder.tvCompany.setText(localApp.getCompany()); + holder.tvName.setText(localApp.getAppName()); + holder.tvVersion.setText(localApp.getVersion()); + + if (localApp.isNeedUpdate()) { + holder.btnDownLoad.setText("升级"); + holder.btnDownLoad.setVisibility(View.VISIBLE); + holder.tvUpdate.setVisibility(View.GONE); + holder.cardView.setVisibility(View.VISIBLE); + } else { + holder.tvUpdate.setVisibility(View.VISIBLE); + holder.tvUpdate.setText("已安装"); + holder.btnDownLoad.setVisibility(View.GONE); + holder.cardView.setVisibility(View.GONE); + } + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!localApp.isNeedUpdate()) { + Intent i = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS"); + String pkg = "com.android.settings"; + String cls = "com.android.settings.applications.InstalledAppDetails"; + i.setComponent(new ComponentName(pkg, cls)); + i.setData(Uri.parse("package:" + localApp.getPackageName())); + context.startActivity(i); + }else { +// AppInfo appInfo = new AppInfo(); +// appInfo.setUpdate(true); +// appInfo.setDetailUrl("/details?id="+localApp.getPackageName()); +// RetrofitManager.getInstance(context).getDetailInfo(appInfo) +// .subscribeOn(Schedulers.io()) +// .subscribe(new Subscriber() { +// @Override +// public void onCompleted() { +// +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onNext(AppInfo appInfo) { +//// DetailActivity.startDetailActivity(context,appInfo); +// } +// }); + } + } + }); + + } + + @Override + public int getItemCount() { + return localAppList.size(); + } + + public static class LocalAppViewHolder extends RecyclerView.ViewHolder { + ImageView ivIcon; + TextView tvCompany, tvName, tvVersion; + TextView tvUpdate; + Button btnDownLoad; + CardView cardView; + + public LocalAppViewHolder(View itemView) { + super(itemView); + ivIcon = itemView.findViewById(R.id.local_app_iv_icon); + tvCompany = itemView.findViewById(R.id.local_app_tv_company); + tvName = itemView.findViewById(R.id.local_app_tv_name); + tvVersion = itemView.findViewById(R.id.local_app_version); + tvUpdate = itemView.findViewById(R.id.local_app_update); + btnDownLoad = itemView.findViewById(R.id.local_app_btn_download); + cardView = itemView.findViewById(R.id.local_app_card_view); + } + } +} diff --git a/app/src/main/java/com/appstore/uiui/base/BaseActivity.java b/app/src/main/java/com/appstore/uiui/base/BaseActivity.java new file mode 100644 index 0000000..60a9b34 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/base/BaseActivity.java @@ -0,0 +1,80 @@ +package com.appstore.uiui.base; + +import android.app.Activity; +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentActivity; + + +public abstract class BaseActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// requestWindowFeature(Window.FEATURE_NO_TITLE); + if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } + setContentView(setLayoutResourceID()); + initView(); + initData(); + setListener(); + } + protected abstract int setLayoutResourceID(); + protected abstract void initView(); + protected abstract void initData(); + protected abstract void setListener(); + +// @Override +// public void onWindowFocusChanged(boolean hasFocus) { +// super.onWindowFocusChanged(hasFocus); +// if (hasFocus) { +// initViewFull(this); +// } +// } + + public static void initViewFull(final Activity activity) { + activity.getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { + @Override + public void onSystemUiVisibilityChange(int visibility) { + new Thread() { + @Override + public void run() { + super.run(); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + try { + initViewFull(activity); + } catch (Exception e) { + + } + } + }); + } + }.start(); + } + }); + //设置无标题 + activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + activity.getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar + | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar + | View.SYSTEM_UI_FLAG_IMMERSIVE + ); + } + +} diff --git a/app/src/main/java/com/appstore/uiui/base/BaseFragment.java b/app/src/main/java/com/appstore/uiui/base/BaseFragment.java new file mode 100644 index 0000000..8844354 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/base/BaseFragment.java @@ -0,0 +1,85 @@ +package com.appstore.uiui.base; + +import android.content.Context; +import android.os.Bundle; + +import android.util.Log; +import android.view.View; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +/** + * Created by asus on 2017/8/4. + */ + +public class BaseFragment extends Fragment { + + private static final String TAG = "BaseFragment"; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + Log.d(TAG, "onAttach: "); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.d(TAG, "onCreate: "); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Log.d(TAG, "onViewCreated: "); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + Log.d(TAG, "onActivityCreated: "); + } + + @Override + public void onStart() { + super.onStart(); + Log.d(TAG, "onStart: "); + } + + @Override + public void onResume() { + super.onResume(); + Log.d(TAG, "onResume: "); + } + + @Override + public void onPause() { + super.onPause(); + Log.d(TAG, "onPause: "); + } + + @Override + public void onStop() { + super.onStop(); + Log.d(TAG, "onStop: "); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + Log.d(TAG, "onDestroyView: "); + } + + @Override + public void onDestroy() { + super.onDestroy(); + Log.d(TAG, "onDestroy: "); + } + + @Override + public void onDetach() { + super.onDetach(); + Log.d(TAG, "onDetach: "); + } +} diff --git a/app/src/main/java/com/appstore/uiui/base/LazyLoadFragment.java b/app/src/main/java/com/appstore/uiui/base/LazyLoadFragment.java new file mode 100644 index 0000000..119e53d --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/base/LazyLoadFragment.java @@ -0,0 +1,76 @@ +package com.appstore.uiui.base; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +/** + * Created by asus on 2017/11/1. + */ + + +/** + * Fragment预加载问题的解决方案: + * 1.可以懒加载的Fragment + * 2.切换到其他页面时停止加载数据(可选) + * Created by yuandl on 2016-11-17. + * blog :http://blog.csdn.net/linglongxin24/article/details/53205878 + */ + +public abstract class LazyLoadFragment extends Fragment { + + /** + * 控件是否初始化完成 + */ + private boolean isViewCreated; + /** + * 数据是否已加载完毕 + */ + private boolean isLoadDataCompleted; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(getLayoutId(), container, false); + initViews(view); + isViewCreated = true; + return view; + } + + public abstract int getLayoutId(); + + public abstract void initViews(View view); + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) { + isLoadDataCompleted = true; + loadData(getArguments()); + } + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (getUserVisibleHint()) { + isLoadDataCompleted = true; + loadData(getArguments()); + /** + * 两处loadData?? + */ + } + } + + /** + * 子类实现加载数据的方法 + */ + public abstract void loadData(Bundle savedInstanceState); +} + + diff --git a/app/src/main/java/com/appstore/uiui/base/RefreshManager.java b/app/src/main/java/com/appstore/uiui/base/RefreshManager.java new file mode 100644 index 0000000..1deb727 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/base/RefreshManager.java @@ -0,0 +1,57 @@ +package com.appstore.uiui.base; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by asus on 2017/11/2. + * 刷新所有界面的管理器 + */ + +public class RefreshManager { + + public interface RefreshInterface { + void onRefresh(); + void onLoadBitMap(boolean isLoad); + } + + private static RefreshManager instance; + + private List interfaceList; + + private RefreshManager() { + interfaceList = new ArrayList<>(); + } + + public static RefreshManager getInstance() { + if (instance == null) { + synchronized (RefreshManager.class) { + if (instance == null) { + instance = new RefreshManager(); + } + } + } + return instance; + } + + public void register(RefreshInterface refreshInterface) { + if (!interfaceList.contains(refreshInterface)) { + interfaceList.add(refreshInterface); + } + } + + public void refreshAll() { + for (RefreshInterface refreshInterface : interfaceList) { + refreshInterface.onRefresh(); + } + } + + //省流量模式,不加载图片 + public void LoadBitMap(boolean isLoad) { + for (RefreshInterface refreshInterface : interfaceList) { + refreshInterface.onLoadBitMap(isLoad); + } + } + + +} diff --git a/app/src/main/java/com/appstore/uiui/bean/AppInfo.java b/app/src/main/java/com/appstore/uiui/bean/AppInfo.java new file mode 100644 index 0000000..059adc6 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/bean/AppInfo.java @@ -0,0 +1,227 @@ +package com.appstore.uiui.bean; + +import java.io.Serializable; + +public class AppInfo implements Serializable { + private int app_id; + private String app_name; + private String app_package; + private String app_version_name; + private String app_version_code; + private String app_size; + private String app_desc; + private String app_url; + private String app_img; + private String app_preview1; + private String app_preview2; + private String app_preview3; + private String app_developer; + private String app_downloads; + private double app_score; + private int app_category; + private int app_subject; + private int app_type; + private int app_status; + private int is_delete; + private int is_update; + private int is_silent; + private String createtime; + + public static boolean isInstall; + + public static boolean isUpdate; + + + public int getApp_id() { + return app_id; + } + + public void setApp_id(int app_id) { + this.app_id = app_id; + } + + public String getApp_name() { + return app_name; + } + + public void setApp_name(String app_name) { + this.app_name = app_name; + } + + public String getApp_package() { + return app_package; + } + + public void setApp_package(String app_package) { + this.app_package = app_package; + } + + public String getApp_version_name() { + return app_version_name; + } + + public void setApp_version_name(String app_version_name) { + this.app_version_name = app_version_name; + } + + public String getApp_version_code() { + return app_version_code; + } + + public void setApp_version_code(String app_version_code) { + this.app_version_code = app_version_code; + } + + public String getApp_size() { + return app_size; + } + + public void setApp_size(String app_size) { + this.app_size = app_size; + } + + public String getApp_desc() { + return app_desc; + } + + public void setApp_desc(String app_desc) { + this.app_desc = app_desc; + } + + public String getApp_url() { + return app_url; + } + + public void setApp_url(String app_url) { + this.app_url = app_url; + } + + public String getApp_img() { + return app_img; + } + + public void setApp_img(String app_img) { + this.app_img = app_img; + } + + public String getApp_preview1() { + return app_preview1; + } + + public void setApp_preview1(String app_preview1) { + this.app_preview1 = app_preview1; + } + + public String getApp_preview2() { + return app_preview2; + } + + public void setApp_preview2(String app_preview2) { + this.app_preview2 = app_preview2; + } + + public String getApp_preview3() { + return app_preview3; + } + + public void setApp_preview3(String app_preview3) { + this.app_preview3 = app_preview3; + } + + public String getApp_developer() { + return app_developer; + } + + public void setApp_developer(String app_developer) { + this.app_developer = app_developer; + } + + public String getApp_downloads() { + return app_downloads; + } + + public void setApp_downloads(String app_downloads) { + this.app_downloads = app_downloads; + } + + public double getApp_score() { + return app_score; + } + + public void setApp_score(double app_score) { + this.app_score = app_score; + } + + public int getApp_category() { + return app_category; + } + + public void setApp_category(int app_category) { + this.app_category = app_category; + } + + public int getApp_subject() { + return app_subject; + } + + public void setApp_subject(int app_subject) { + this.app_subject = app_subject; + } + + public int getApp_type() { + return app_type; + } + + public void setApp_type(int app_type) { + this.app_type = app_type; + } + + public int getApp_status() { + return app_status; + } + + public void setApp_status(int app_status) { + this.app_status = app_status; + } + + public int getIs_delete() { + return is_delete; + } + + public void setIs_delete(int is_delete) { + this.is_delete = is_delete; + } + + public int getIs_update() { + return is_update; + } + + public void setIs_update(int is_update) { + this.is_update = is_update; + } + + public int getIs_silent() { + return is_silent; + } + + public void setIs_silent(int is_silent) { + this.is_silent = is_silent; + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime; + } + + + public boolean isInstall() { + return isInstall; + } + + public boolean isUpdate() { + return isUpdate; + } +} diff --git a/app/src/main/java/com/appstore/uiui/bean/AppInfos.java b/app/src/main/java/com/appstore/uiui/bean/AppInfos.java new file mode 100644 index 0000000..c7016b8 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/bean/AppInfos.java @@ -0,0 +1,285 @@ +package com.appstore.uiui.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by asus on 2017/10/23. + */ + +public class AppInfos implements Parcelable { + String appName;//名字 + String icon;//图片 + String detailUrl;//详情页面 + String downLoadUrl;//下载地址 + + String company;//公司 + double star;//星星的等级 + String size;//软件的大小 + String version;//软件的版本号 + String packageName;//软件的包名 + String updateTime;//软件的更新时间 + + List imgs;//软件的几张缩略图 + String description;//软件的功能介绍 + String updateLog;//软件的更新日志 + + String commentNum;//评分的人数 + String category;//软件的类别 + List permissionList;//所需要的权限 + + ArrayList sameAppList;//同个开发者的应用 + + boolean isInstall = false;//是否已安装 + boolean isUpdate = false;//是否需要升级 + + + public AppInfos() { + } + + protected AppInfos(Parcel in) { + appName = in.readString(); + icon = in.readString(); + detailUrl = in.readString(); + downLoadUrl = in.readString(); + company = in.readString(); + star = in.readDouble(); + size = in.readString(); + version = in.readString(); + packageName = in.readString(); + updateTime = in.readString(); + imgs = in.createStringArrayList(); + description = in.readString(); + updateLog = in.readString(); + commentNum = in.readString(); + category = in.readString(); + permissionList = in.createStringArrayList(); + sameAppList = in.createTypedArrayList(AppInfos.CREATOR); + isInstall = in.readByte() != 0; + isUpdate = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public AppInfos createFromParcel(Parcel in) { + return new AppInfos(in); + } + + @Override + public AppInfos[] newArray(int size) { + return new AppInfos[size]; + } + }; + + public ArrayList getSameAppList() { + return sameAppList; + } + + public void setSameAppList(ArrayList sameAppList) { + this.sameAppList = sameAppList; + } + + + + + public boolean isInstall() { + return isInstall; + } + + public void setInstall(boolean install) { + isInstall = install; + } + + public boolean isUpdate() { + return isUpdate; + } + + public void setUpdate(boolean update) { + isUpdate = update; + } + + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getDetailUrl() { + return detailUrl; + } + + public void setDetailUrl(String detailUrl) { + this.detailUrl = detailUrl; + } + + public String getDownLoadUrl() { + return downLoadUrl; + } + + public void setDownLoadUrl(String downLoadUrl) { + this.downLoadUrl = downLoadUrl; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + + public double getStar() { + return star; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public void setStar(double star) { + this.star = star; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public List getImgs() { + return imgs; + } + + public void setImgs(List imgs) { + this.imgs = imgs; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUpdateLog() { + return updateLog; + } + + public void setUpdateLog(String updateLog) { + this.updateLog = updateLog; + } + + public String getCommentNum() { + return commentNum; + } + + public void setCommentNum(String commentNum) { + this.commentNum = commentNum; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public List getPermissionList() { + return permissionList; + } + + public void setPermissionList(List permissionList) { + this.permissionList = permissionList; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + + dest.writeString(appName); + dest.writeString(icon); + dest.writeString(detailUrl); + dest.writeString(downLoadUrl); + dest.writeString(company); + dest.writeDouble(star); + dest.writeString(size); + dest.writeString(version); + dest.writeString(packageName); + dest.writeString(updateTime); + dest.writeStringList(imgs); + dest.writeString(description); + dest.writeString(updateLog); + dest.writeString(commentNum); + dest.writeString(category); + dest.writeStringList(permissionList); + dest.writeTypedList(sameAppList); + dest.writeByte((byte) (isInstall ? 1 : 0)); + dest.writeByte((byte) (isUpdate ? 1 : 0)); + } + + @Override + public String toString() { + return "AppInfo{" + + "appName='" + appName + '\'' + + ", ic_app='" + icon + '\'' + + ", detailUrl='" + detailUrl + '\'' + + ", downLoadUrl='" + downLoadUrl + '\'' + + ", company='" + company + '\'' + + ", star=" + star + + ", size='" + size + '\'' + + ", version='" + version + '\'' + + ", packageName='" + packageName + '\'' + + ", updateTime='" + updateTime + '\'' + + ", imgs=" + imgs + + ", description='" + description + '\'' + + ", updateLog='" + updateLog + '\'' + + ", commentNum='" + commentNum + '\'' + + ", category='" + category + '\'' + + ", permissionList=" + permissionList + + ", isInstall=" + isInstall + + ", isUpdate=" + isUpdate + + '}'; + } +} diff --git a/app/src/main/java/com/appstore/uiui/bean/Kind.java b/app/src/main/java/com/appstore/uiui/bean/Kind.java new file mode 100644 index 0000000..4f9652e --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/bean/Kind.java @@ -0,0 +1,41 @@ +package com.appstore.uiui.bean; + +/** + * Created by asus on 2017/10/25. + */ + +public class Kind { + String name;//每个种类的名字 + int category;//种类的代号 + int icon;//图片的id + + public Kind(String name, int category, int icon) { + this.name = name; + this.category = category; + this.icon = icon; + } + + public int getIcon() { + return icon; + } + + public void setIcon(int icon) { + this.icon = icon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getCategory() { + return category; + } + + public void setCategory(int category) { + this.category = category; + } +} diff --git a/app/src/main/java/com/appstore/uiui/bean/LocalApp.java b/app/src/main/java/com/appstore/uiui/bean/LocalApp.java new file mode 100644 index 0000000..d319629 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/bean/LocalApp.java @@ -0,0 +1,79 @@ +package com.appstore.uiui.bean; + +import android.graphics.drawable.Drawable; + +/** + * Created by asus on 2017/10/26. + */ + +public class LocalApp { + + String appName;//名字 + Drawable icon;//图片 + String company;//公司 + String size;//软件的大小 + String version;//软件的版本号 + String packageName;//软件的包名 + + boolean isNeedUpdate=false; + + public LocalApp() { + } + + public boolean isNeedUpdate() { + return isNeedUpdate; + } + + public void setNeedUpdate(boolean needUpdate) { + isNeedUpdate = needUpdate; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + + public void setIcon(Drawable icon) { + this.icon = icon; + } + + public Drawable getIcon() { + return icon; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } +} diff --git a/app/src/main/java/com/appstore/uiui/common/BuidConfig.java b/app/src/main/java/com/appstore/uiui/common/BuidConfig.java new file mode 100644 index 0000000..452e715 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/common/BuidConfig.java @@ -0,0 +1,7 @@ +package com.appstore.uiui.common; + +import android.os.Debug; + +public class BuidConfig { + public static final boolean Isdebug = true; +} diff --git a/app/src/main/java/com/appstore/uiui/fragment/FeaturedFragment.java b/app/src/main/java/com/appstore/uiui/fragment/FeaturedFragment.java new file mode 100644 index 0000000..492d699 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/fragment/FeaturedFragment.java @@ -0,0 +1,148 @@ +package com.appstore.uiui.fragment; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; + +import android.util.Log; +import android.view.View; + + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.appstore.uiui.R; +import com.appstore.uiui.adapter.AppAdapter; +import com.appstore.uiui.base.LazyLoadFragment; +import com.appstore.uiui.base.RefreshManager; +import com.appstore.uiui.bean.AppInfo; +import com.appstore.uiui.bean.AppInfos; + +import com.appstore.uiui.network.URLs.Url; +import com.appstore.uiui.utils.ToastUtil; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.StringCallback; +import com.lzy.okgo.model.Response; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by asus on 2017/10/23. + * 精品的页面 + */ + +public class FeaturedFragment extends LazyLoadFragment implements RefreshManager.RefreshInterface { + private RecyclerView mRvResult; + private SmartRefreshLayout mRefreshLayout; + + private List appInfoList;// + private List newAppInfoList; + private AppAdapter adapter; + + private boolean isNotLoadBitmap; + + + @Override + public int getLayoutId() { + return R.layout.fragment_featured; + } + + @Override + public void initViews(View view) { + mRvResult = view.findViewById(R.id.featured_rv_result); + mRefreshLayout = view.findViewById(R.id.featured_refresh_layout); + RefreshManager.getInstance().register(this); + + isNotLoadBitmap = false; + + newAppInfoList = new ArrayList<>(); + adapter = new AppAdapter(newAppInfoList, false, isNotLoadBitmap); + mRvResult.setAdapter(adapter); + mRvResult.setLayoutManager(new LinearLayoutManager(getActivity())); + + mRefreshLayout.setEnableLoadMore(false); + mRefreshLayout.setEnableRefresh(true); + mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { +// initData(); + initAPPData(handler); + } + }); + mRefreshLayout.autoRefresh(); + } + + @Override + public void loadData(Bundle savedInstanceState) { +// initData(); + initAPPData(handler); + } + + private void initAPPData(final Handler handler) { + OkGo.post(Url.GET_ALL_APPINFO).execute(new StringCallback() { + @Override + public void onSuccess(Response response) { + try { + JSONObject body = JSON.parseObject(response.body()); +// Log.e("onSuccess", body.toString()); + int code = body.getInteger("code"); + String msg = body.getString("msg"); + String data = body.getString("data"); + List applist = JSON.parseArray(data, AppInfo.class); + if (code == 200) { + Message message = new Message(); + message.what = 0; + message.obj = applist; + handler.sendMessage(message); + } else { + ToastUtil.show(msg); + } + } catch (Exception e) { + Log.e("Exception", e.getMessage()); + } + } + + @Override + public void onError(Response response) { + super.onError(response); + Log.e("Exception", response.getException().toString()); + + } + }); + mRefreshLayout.finishRefresh(); + + } + + + @Override + public void onRefresh() { + mRefreshLayout.autoRefresh(); + } + + @Override + public void onLoadBitMap(boolean isLoad) { + adapter.setNotLoadBitmap(isLoad); + } + + Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case 0: + newAppInfoList = (List) msg.obj; + adapter.setData(newAppInfoList); + break; + } + } + }; + + +} diff --git a/app/src/main/java/com/appstore/uiui/fragment/KindFragment.java b/app/src/main/java/com/appstore/uiui/fragment/KindFragment.java new file mode 100644 index 0000000..359e3d6 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/fragment/KindFragment.java @@ -0,0 +1,83 @@ +package com.appstore.uiui.fragment; + +import android.os.Bundle; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.appstore.uiui.R; +import com.appstore.uiui.adapter.KindAdapter; +import com.appstore.uiui.base.BaseFragment; +import com.appstore.uiui.base.RefreshManager; +import com.appstore.uiui.bean.Kind; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by asus on 2017/10/23. + * 分类的页面 + */ + +public class KindFragment extends BaseFragment implements RefreshManager.RefreshInterface { + private RecyclerView mRvKind; + + private KindAdapter adapter; + private List kindList; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_kind, container, false); + mRvKind = view.findViewById(R.id.kind_rv_kind); + RefreshManager.getInstance().register(this); + + initView(); + return view; + } + + private void initView() { + kindList = new ArrayList<>(); + kindList.add(new Kind("游戏", 15, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("实用工具", 5, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("影音视听", 27, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("聊天社交", 2, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("图书阅读", 7, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("学习教育", 12, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("效率办公", 10, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("时尚购物", 9, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("居家生活", 4, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("旅行交通", 3, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("摄影摄像", 6, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("医疗健康", 14, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("体育运动", 8, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("新闻资讯", 11, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("娱乐消遣", 13, R.mipmap.ic_launcher_round)); + kindList.add(new Kind("金融理财", 1, R.mipmap.ic_launcher_round)); + + adapter = new KindAdapter(kindList, false); + mRvKind.setAdapter(adapter); + mRvKind.setLayoutManager(new LinearLayoutManager(getActivity())); + } + + @Override + public void onRefresh() { + + } + + @Override + public void onLoadBitMap(boolean isLoad) { + adapter.setNotLoadBitmap(isLoad); +// isNotLoadBitmap=isLoad; +// adapter = new KindAdapter(kindList,isNotLoadBitmap); +// mRvKind.setAdapter(adapter); +// mRvKind.setLayoutManager(new LinearLayoutManager(getActivity())); + } +} diff --git a/app/src/main/java/com/appstore/uiui/fragment/ManageFragment.java b/app/src/main/java/com/appstore/uiui/fragment/ManageFragment.java new file mode 100644 index 0000000..57fe400 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/fragment/ManageFragment.java @@ -0,0 +1,141 @@ +package com.appstore.uiui.fragment; + +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.appstore.uiui.R; +import com.appstore.uiui.adapter.LocalAppAdapter; +import com.appstore.uiui.base.LazyLoadFragment; +import com.appstore.uiui.bean.LocalApp; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by asus on 2017/10/23. + * 管理的页面 + */ + +public class ManageFragment extends LazyLoadFragment implements View.OnClickListener { + + private RecyclerView mRvLocal; + private TextView mTvUpdateNum; + + private List localAppList; + private LocalAppAdapter adapter; + + + @Override + public int getLayoutId() { + return R.layout.fragment_manage; + } + + @Override + public void initViews(View view) { + mRvLocal = view.findViewById(R.id.manage_rv_local); + mTvUpdateNum = view.findViewById(R.id.manage_tv_updateNum); + initView(); + } + + @Override + public void loadData(Bundle savedInstanceState) { + + } + + private void initView() { + localAppList = new ArrayList<>(); + + Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + List resolveInfoList = getActivity().getPackageManager().queryIntentActivities(intent, 0); + + for (int i = 0; i < resolveInfoList.size(); i++) { + LocalApp bean = new LocalApp(); + bean.setAppName(resolveInfoList.get(i).loadLabel(getActivity().getPackageManager()).toString()); + + + String packageName = resolveInfoList.get(i).activityInfo.packageName; + bean.setPackageName(packageName); + Drawable icon = resolveInfoList.get(i).loadIcon(getActivity().getPackageManager()); + bean.setIcon(icon); + + try { + PackageInfo packageInfo = getActivity().getPackageManager().getPackageInfo(packageName, 0); + String versionCode = getActivity().getPackageManager() + .getPackageInfo(packageName, 0).versionName; + bean.setVersion(versionCode); + + if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) { + //第三方应用 + + //判断是否需要进行更新 +// isNeedUpdate(bean, i); + + } else { + //系统应用 + } + + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + } + + adapter = new LocalAppAdapter(localAppList); + mRvLocal.setAdapter(adapter); + mRvLocal.setLayoutManager(new LinearLayoutManager(getActivity())); + + } + + public void onClick(View view) { + switch (view.getId()) { + case R.id.manage_ll_localapp: +// LocalAppActivity.startActivity(getActivity()); + break; + case R.id.manage_btn_update: + break; + } + } + + int updateNum = 0; + + //判断某个应用是否需要升级 +// private void isNeedUpdate(final LocalApp localApp, final int position) { +// RetrofitManager.getInstance(getActivity()).getDetailInfo(localApp) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new Subscriber() { +// @Override +// public void onCompleted() { +// adapter.notifyDataSetChanged(); +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onNext(Boolean aBoolean) { +// localApp.setNeedUpdate(aBoolean); +// if (aBoolean) { +// localAppList.add(localApp); +// ++updateNum; +// mTvUpdateNum.setText(updateNum + "个应用可以升级"); +// } +// } +// }); +// } + + +} diff --git a/app/src/main/java/com/appstore/uiui/fragment/RankFragment.java b/app/src/main/java/com/appstore/uiui/fragment/RankFragment.java new file mode 100644 index 0000000..f992ff2 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/fragment/RankFragment.java @@ -0,0 +1,179 @@ +package com.appstore.uiui.fragment; + +import android.os.Bundle; + +import android.util.Log; +import android.view.View; + + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.appstore.uiui.R; +import com.appstore.uiui.adapter.AppAdapter; +import com.appstore.uiui.base.LazyLoadFragment; +import com.appstore.uiui.base.RefreshManager; +import com.appstore.uiui.bean.AppInfo; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by asus on 2017/10/23. + * 排行的页面 + */ + +public class RankFragment extends LazyLoadFragment implements RefreshManager.RefreshInterface { + private RecyclerView mRvResult; + private SmartRefreshLayout mRefreshLayout; + + private int page = 1; + private List mAppInfoList; + private AppAdapter mAppAdapter; + + private boolean isNotLoadBitmap; + + + @Override + public int getLayoutId() { + return R.layout.fragment_rank; + } + + @Override + public void initViews(View view) { + mRvResult = view.findViewById(R.id.rank_rv_result); + mRefreshLayout = view.findViewById(R.id.rank_refresh_layout); + RefreshManager.getInstance().register(this); + initView(); + } + + @Override + public void loadData(Bundle savedInstanceState) { + mRefreshLayout.autoRefresh(); + } + + + private void initView() { + + isNotLoadBitmap = false; + + mAppInfoList = new ArrayList<>(); + mAppAdapter = new AppAdapter(mAppInfoList, true, isNotLoadBitmap); + mRvResult.setLayoutManager(new LinearLayoutManager(getActivity())); + mRvResult.setAdapter(mAppAdapter); + + mRefreshLayout.setEnableRefresh(true); + mRefreshLayout.setEnableLoadMore(true); + + mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { +// RetrofitManager.getInstance(getActivity()).getRankList(1) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new Subscriber>() { +// @Override +// public void onCompleted() { +// getDetailData(true); +// } +// +// @Override +// public void onError(Throwable e) { +// Log.d("test", e.toString()); +// } +// +// @Override +// public void onNext(List appInfos) { +// +// mAppInfoList.clear(); +// mAppInfoList.addAll(appInfos); +// mAppAdapter.notifyDataSetChanged(); +// } +// }); + } + }); + + mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { +// RetrofitManager.getInstance(getActivity()).getRankList(++page) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new Subscriber>() { +// @Override +// public void onCompleted() { +// getDetailData(false); +// } +// +// @Override +// public void onError(Throwable e) { +// Log.d("test", e.toString()); +// } +// +// @Override +// public void onNext(List appInfos) { +// mAppInfoList.addAll(appInfos); +// mAppAdapter.notifyDataSetChanged(); +// } +// }); + } + }); + } + +// private void getDetailData(final boolean isRefresh) { +// for (int i = 0; i < mAppInfoList.size(); i++) { +// final int position = i; +// RetrofitManager.getInstance(getActivity()).getDetailInfo(mAppInfoList.get(i)) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new Subscriber() { +// @Override +// public void onCompleted() { +// mAppAdapter.notifyItemChanged(position); +// mAppAdapter.notifyDataSetChanged(); +// if (mAppInfoList.size() - 1 == position) { +// if (isRefresh) { +// page = 1; +// mRefreshLayout.finishRefresh(); +// } else { +// mRefreshLayout.finishLoadMore(); +// } +// } +// } +// +// @Override +// public void onError(Throwable e) { +// Log.d("test", "onError:" + e.toString()); +// } +// +// @Override +// public void onNext(AppInfo appInfo) { +// boolean isInstall = LocalAppManager.getInstance(getActivity()).isInstall(appInfo); +// appInfo.setInstall(isInstall); +// //判断是否需要升级 +// if (isInstall) { +// boolean isUpdate = LocalAppManager.getInstance(getActivity()).isNeedUpdate(appInfo); +// appInfo.setUpdate(isUpdate); +// } +// mAppInfoList.set(position, appInfo); +// } +// }); +// +// } +// } + + + @Override + public void onRefresh() { + mRefreshLayout.autoRefresh(); + } + + @Override + public void onLoadBitMap(boolean isLoad) { + mAppAdapter.setNotLoadBitmap(isLoad); + } +} diff --git a/app/src/main/java/com/appstore/uiui/network/URLs/Url.java b/app/src/main/java/com/appstore/uiui/network/URLs/Url.java new file mode 100644 index 0000000..7bb12fa --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/network/URLs/Url.java @@ -0,0 +1,9 @@ +package com.appstore.uiui.network.URLs; + +public class Url { + public final static String NETWORK_HOME_ADDRESS = "http://homework.tuiinfo.com/api"; + + public final static String GET_ALL_APPINFO = NETWORK_HOME_ADDRESS + "/App/allInfo"; + //获取所有应用 + +} diff --git a/app/src/main/java/com/appstore/uiui/utils/ApkUtils.java b/app/src/main/java/com/appstore/uiui/utils/ApkUtils.java new file mode 100644 index 0000000..18b3639 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/utils/ApkUtils.java @@ -0,0 +1,369 @@ +package com.appstore.uiui.utils; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Binder; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.widget.Toast; + +import androidx.core.content.FileProvider; + +import com.appstore.uiui.R; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import rx.Observable; +import rx.Observer; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class ApkUtils { + + + public static synchronized boolean getRootAhth() { + Process process = null; + DataOutputStream os = null; + try { + process = Runtime.getRuntime().exec("su"); + os = new DataOutputStream(process.getOutputStream()); + os.writeBytes("exit\n"); + os.flush(); + int exitValue = process.waitFor(); + if (exitValue == 0) { + return true; + } else { + return false; + } + } catch (Exception e) { + Log.e("*** DEBUG ***", "Unexpected error - Here is what I know: " + + e.getMessage()); + return false; + } finally { + try { + if (os != null) { + os.close(); + } + process.destroy(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static void openApp(Context context, View view) { + try { + Intent intent = context.getPackageManager().getLaunchIntentForPackage((String) view.getTag(R.string.download_btn_had)); + context.startActivity(intent); + } catch (Exception e) { + Toast.makeText(context, R.string.open_app_fail, Toast.LENGTH_LONG).show(); + } + return; + } + + /** + * 安装一个apk文件 + */ + public static void install(Context context, File uriFile) { + + Intent intent = new Intent(Intent.ACTION_VIEW); + // 由于没有在Activity环境下启动Activity,设置下面的标签 + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上 + //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件 + Uri apkUri = + FileProvider.getUriForFile(context, "com.mjsheng.myappstore.fileprovider", uriFile); + //添加这一句表示对目标应用临时授权该Uri所代表的文件 + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); + } else { + intent.setDataAndType(Uri.fromFile(uriFile), + "application/vnd.android.package-archive"); + } + context.startActivity(intent); + } + + /** + * 卸载一个app + */ + public static void uninstall(Context context, String packageName) { + //通过程序的包名创建URI + Uri packageURI = Uri.parse("package:" + packageName); + //创建Intent意图 + Intent intent = new Intent(Intent.ACTION_DELETE, packageURI); + //执行卸载程序 + context.startActivity(intent); + } + + /** + * 检查手机上是否安装了指定的软件 + */ + public static boolean isAvailable(Context context, String packageName) { + // 获取packagemanager + final PackageManager packageManager = context.getPackageManager(); + // 获取所有已安装程序的包信息 + List packageInfos = packageManager.getInstalledPackages(0); + // 用于存储所有已安装程序的包名 + List packageNames = new ArrayList<>(); + // 从pinfo中将包名字逐一取出,压入pName list中 + if (packageInfos != null) { + for (int i = 0; i < packageInfos.size(); i++) { + String packName = packageInfos.get(i).packageName; + packageNames.add(packName); + } + } + // 判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE + return packageNames.contains(packageName); + } + + /** + * 检查手机上是否安装了指定的软件 + */ + public static boolean isAvailable(Context context, File file) { + return isAvailable(context, getPackageName(context, file.getAbsolutePath())); + } + + /** + * 根据文件路径获取包名 + */ + public static String getPackageName(Context context, String filePath) { + PackageManager packageManager = context.getPackageManager(); + PackageInfo info = packageManager.getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES); + if (info != null) { + ApplicationInfo appInfo = info.applicationInfo; + return appInfo.packageName; //得到安装包名称 + } + return null; + } + + /** + * 从apk中获取版本信息 + */ + public static String getChannelFromApk(Context context, String channelPrefix) { + //从apk包中获取 + ApplicationInfo appinfo = context.getApplicationInfo(); + String sourceDir = appinfo.sourceDir; + //默认放在meta-inf/里, 所以需要再拼接一下 + String key = "META-INF/" + channelPrefix; + String ret = ""; + ZipFile zipfile = null; + try { + zipfile = new ZipFile(sourceDir); + Enumeration entries = zipfile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = ((ZipEntry) entries.nextElement()); + String entryName = entry.getName(); + if (entryName.startsWith(key)) { + ret = entryName; + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (zipfile != null) { + try { + zipfile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + String[] split = ret.split(channelPrefix); + String channel = ""; + if (split.length >= 2) { + channel = ret.substring(key.length()); + } + return channel; + } + + + public static void installRx(final Context context, final String packageName, final String filePath) { + + Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + File file = new File(filePath); + if (filePath == null || filePath.length() == 0 || file == null) { + Log.e("fanhuitong", "errormesg=========" + " 空啊 "); + subscriber.onNext(0); + return; + } + // String[] args = { "pm", "install", "-r", filePath }; + String[] args = {"pm", "install", "-i", "com.colorflykids", "--user", "0", filePath}; + // String argss = "pm install -i " + "com.colorflykids" + " --user 0 " + filePath; + Log.e("fanhuitong", "argss====" + args); + ProcessBuilder processBuilder = new ProcessBuilder(args); + Process process = null; + BufferedReader successResult = null; + BufferedReader errorResult = null; + StringBuilder successMsg = new StringBuilder(); + StringBuilder errorMsg = new StringBuilder(); + try { + process = processBuilder.start(); + successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); + errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String s; + while ((s = successResult.readLine()) != null) { + Log.e("mjhseng", "successResult----------" + s); + successMsg.append(s); + } + while ((s = errorResult.readLine()) != null) { + Log.e("mjhseng", "errorResult----------" + s); + errorMsg.append(s); + } + } catch (IOException e1) { + Log.e("fanhuitong", "IOException e1)----------" + e1.toString()); + e1.printStackTrace(); + } finally { + try { + if (successResult != null) { + successResult.close(); + } + if (errorResult != null) { + errorResult.close(); + } + } catch (IOException e1) { + Log.e("fanhuitong", "IOException e11)---------" + e1.toString()); + e1.printStackTrace(); + } + if (process != null) { + process.destroy(); + } + } + if (successMsg.toString().contains("Success") || successMsg.toString().contains("success")) { + subscriber.onNext(2); + } else { + Log.e("fanhuitong", "errormesg=========" + errorMsg.toString()); + subscriber.onNext(1); + } + } + }).subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + + @Override + public void onNext(Integer value) { + if (value == 2) { + //安装成功 + Utils.showToast(context, "安装成功"); + Log.e("fanhuitong", "-----------安装成功-----------"); + } else { + //安装错误 + Log.e("fanhuitong", "------------安装错误-----------"); + Utils.showToast(context, "安装失败"); + } + } + + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + //安装错误 + } + }); + } + + // public static void installApp(final String path, final String packageNames){ + // File apkFile = new File(path); + // try { + // Class clazz = Class.forName("android.os.ServiceManager"); + // Method method_getService = clazz.getMethod("getService", String.class); + // IBinder bind = (IBinder) method_getService.invoke(null, "package"); + // IPackageManager iPm = IPackageManager.Stub.asInterface(bind); + // iPm.installPackage(Uri.fromFile(apkFile),null, 2, apkFile.getName()); + // Log.e("fanhuitong", "安装成功"); + // } catch (Exception e) { + // e.printStackTrace(); + // Log.e("fanhuitong", "安装失败"); + // } + // } + public static void installApkInSilence(String installPath, String packageName) { + ToastUtil.show("正在安装应用..."); + Class pmService; + Class activityTherad; + Method method; + try { + activityTherad = Class.forName("android.app.ActivityThread"); + Class paramTypes[] = getParamTypes(activityTherad, "getPackageManager"); + method = activityTherad.getMethod("getPackageManager", paramTypes); + Object PackageManagerService = method.invoke(activityTherad); + pmService = PackageManagerService.getClass(); + Class paramTypes1[] = getParamTypes(pmService, "installPackageAsUser"); + method = pmService.getMethod("installPackageAsUser", paramTypes1); + method.invoke(PackageManagerService, installPath, null, 0x00000040, packageName, getUserId(Binder.getCallingUid()));//getUserId + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + public static void deleteApkInSilence(String packageName) { + Class pmService; + Class activityTherad; + Method method; + try { + activityTherad = Class.forName("android.app.ActivityThread"); + Class paramTypes[] = getParamTypes(activityTherad, "getPackageManager"); + method = activityTherad.getMethod("getPackageManager", paramTypes); + Object PackageManagerService = method.invoke(activityTherad); + pmService = PackageManagerService.getClass(); + Class paramTypes1[] = getParamTypes(pmService, "deletePackageAsUser"); + method = pmService.getMethod("deletePackageAsUser", paramTypes1); + method.invoke(PackageManagerService, packageName, null, getUserId(Binder.getCallingUid()), 0x00000040);//getUserId + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + private static Class[] getParamTypes(Class cls, String mName) { + Class cs[] = null; + Method[] mtd = cls.getMethods(); + for (int i = 0; i < mtd.length; i++) { + if (!mtd[i].getName().equals(mName)) { + continue; + } + + cs = mtd[i].getParameterTypes(); + } + return cs; + } + + public static final int PER_USER_RANGE = 100000; + + public static int getUserId(int uid) { + return uid / PER_USER_RANGE; + } + +} diff --git a/app/src/main/java/com/appstore/uiui/utils/ToastUtil.java b/app/src/main/java/com/appstore/uiui/utils/ToastUtil.java new file mode 100644 index 0000000..c40105c --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/utils/ToastUtil.java @@ -0,0 +1,44 @@ +package com.appstore.uiui.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; + +/** + * Created by haoge on 2017/3/2. + */ + +public class ToastUtil { + static Handler mainHandler = new Handler(Looper.getMainLooper()); + static Toast toast; + + @SuppressLint("ShowToast") + public static void init(Context context) { + toast = Toast.makeText(context, "", Toast.LENGTH_SHORT); + } + + public static void show(final String msg) { + mainHandler.post(new Runnable() { + @Override + public void run() { + if (toast != null) { + toast.setText(msg); + toast.show(); + } + } + }); + } + +// public static void showInCenter(String msg) { +// mainHandler.post(() -> { +// if (toast != null) { +// toast.setGravity(Gravity.CENTER, 0, 0); +// toast.setText(msg); +// toast.show(); +// } +// }); +// } + +} diff --git a/app/src/main/java/com/appstore/uiui/utils/Utils.java b/app/src/main/java/com/appstore/uiui/utils/Utils.java new file mode 100644 index 0000000..e88f999 --- /dev/null +++ b/app/src/main/java/com/appstore/uiui/utils/Utils.java @@ -0,0 +1,707 @@ +package com.appstore.uiui.utils; + +import android.annotation.SuppressLint; +import android.app.admin.DevicePolicyManager; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Build; +import android.provider.Settings; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.Toast; + +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.io.Reader; +import java.net.NetworkInterface; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +public class Utils { + + + public static final String PACKAGE = "appstore"; + public static final String DOWNLOAD_STARTALL_ACTION = PACKAGE + "_startall"; // 开始所有任务 + public static final String DOWNLOAD_DELETE_UPDATE_ACTION = PACKAGE + "_download_update_delete"; // 删除应用更新文件 + public static final String DOWNLOAD_DELETEALL_ACTION = PACKAGE + "_deleteall_alltask"; // 删除所有任务 + public static final String DOWNLOAD_ALLTASK_ACTION = PACKAGE + "_download_alltask"; // 获取所有任务 + public static final String DOWNLOAD_START_ACTION = PACKAGE + "_download_start"; // 下载标识 + public static final String DOWNLOAD_STOP_ACTION = PACKAGE + "_download_stop"; // 暂停标识 + public static final String DOWNLOAD_DELETE_PACKAGENAME_ACTION = PACKAGE + "_download_packagename_delete"; // 删除标识 根据包名 + public static final String DOWNLOAD_DELETE_URL_ACTION = PACKAGE + "_download_url_delete"; // 删除标识 根据下载地址 + public static final String DOWNLOAD_INITIALIZE_ACTION = PACKAGE + "_download_initialize"; // item初始化状态 + public static final String DOWNLOAD_PACKAGENAME_ACTION = PACKAGE + "_download_packagename"; // item初始化状态 包名 + public static final String DOWNLOAD_SERVICE_ACTION = PACKAGE + "_download_service"; // 下载状态回调服务 + + public static final String DOWNLOAD_ALLSERVICE_ACTION = PACKAGE + "_download_allservice"; // 返回所有下载任务 + public static final String DOWNLOAD_NEWSERVICE_ACTION = PACKAGE + "_download_newservice"; // 一个新的下载任务 + + // JPush 推送消息 + public static final String MESSAGE_RECEIVED_ACTION = "com.appstore.jpushdemo.MESSAGE_RECEIVED_ACTION"; + public static final String KEY_TITLE = "title"; // 消息标题 + public static final String KEY_MESSAGE = "message"; // 消息内容 + public static final String KEY_EXTRAS = "extras"; // 消息内容类型 + public static final String KEY_TYPE = "type"; // 消息内容类型 + + + public static final String ACTION_PACKAGE_REPLACED = PACKAGE + "PACKAGE_REPLACED"; // 替换应用 + public static final String ACTION_PACKAGE_REMOVED = PACKAGE + "PACKAGE_REMOVED"; // 卸载应用 + public static final String ACTION_PACKAGE_ADDED = PACKAGE + "PACKAGE_ADDED"; // 安装应用 + +// public static int[] babyImage = {R.drawable.language, R.drawable.habit, R.drawable.knowledge, R.drawable.security, R.drawable.promotion}; +// public static int[] childImage = {R.drawable.yuwen, R.drawable.shuxue, R.drawable.yingyu, R.drawable.qingshang, R.drawable.yishu, R.drawable.promotion}; +// public static int[] youngImage = {R.drawable.yuwen, R.drawable.shuxue, R.drawable.yingyu, R.drawable.promotion}; + // 学习日志上传标识 + public static final String APP_LRARNLOG = "com.colorflykids.alarm"; + // 学习日志下载标识 + public static final String APP_DOWNLOADLEARNLOG = "com.colorflykids.downloadlearnlog"; + // 账号注销标识 + public static final String APP_USERLOGOUT = "com.colorflykids.userlogout"; + + + public static final String UPDATE_SYSTEMUI = "cn.colorflykids.UPDATE_SYSTEMUI"; + public static final int COUNT_ONE_PAGE = 8; + public static final int COUNT_ONE_PAGE2 = 10; + public static final String YOUNGSYSTEM_APP_TONGBU = "com.school.app.syn"; // 小学系统 同步教材app + /** + */ + public static final String number[] = { + "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "0", "11"}; + public static final String STORE = "store"; + public static final String CATEGORY_THREE = "3"; + public static final String CATEGORY_SIX = "6"; + public static final String CATEGORY_UPSIX = "10"; + public static final String CLOSE_REST_WINDOW = "colse_rest_window"; + public static final String STOP_LOOPING_TIMER = "stop_looping_timer"; + public static final String START_LOOPING_TIMER = "start_looping_timer"; + public static String DOWNLOADAPP_CALLBACK = "com.colorflykids.downloadapp"; // 子界面下载回调 提示更新UI + public static String MENU_YOUYOU = "youyou"; + public static String MENU_LANGUAGE = "语言启蒙"; + public static String MENU_HABIT = "行为习惯"; + public static String MENU_KNOWLEDGE = "生活认知"; + public static String MENU_SECURITY = "安全自理"; + public static String MENU_PROMOTION = "入园-综合提升"; + public static String MENU_LY = "优优乐园"; + public static String MENU_YW = "语文知识"; + public static String MENU_SX = "数理逻辑"; + public static String MENU_YY = "英语启蒙"; + public static String MENU_QS = "情商培养"; + public static String MENU_YS = "艺术提升"; + public static String MENU_ZH = "学前-综合提升"; + public static String MENU_TONGBUJIAOCAI = "同步教材"; + public static String MENU_YUWEN = "语文"; + public static String MENU_SHUXUE = "数学"; + public static String MENU_YINGYU = "英语"; + public static String MENU_ZONGHETISHEGN = "小学-综合提升"; + public static String[] babySystem = {MENU_LANGUAGE, MENU_HABIT, MENU_KNOWLEDGE, MENU_SECURITY, MENU_PROMOTION}; + public static String[] childSystem = {MENU_LY, MENU_YW, MENU_SX, MENU_YY, MENU_QS, MENU_YS, MENU_ZH}; + public static String[] youngSystem = {MENU_YUWEN, MENU_SHUXUE, MENU_YINGYU, MENU_ZONGHETISHEGN}; + + + public static String[] sonSystem = {MENU_HABIT, MENU_SECURITY, MENU_LANGUAGE, MENU_KNOWLEDGE, MENU_PROMOTION, + MENU_LY, MENU_YW, MENU_SX, MENU_YY, MENU_QS, MENU_YS, MENU_ZH, + MENU_TONGBUJIAOCAI, MENU_YUWEN, MENU_SHUXUE, MENU_YINGYU, MENU_YINGYU, MENU_ZONGHETISHEGN}; + public static String[][] tagList = {babySystem, childSystem, youngSystem}; + public static String subcategories[][] = {babySystem, childSystem, youngSystem}; + public static String system[] = {"入园系统", "学前系统", "小学系统"}; + public static String systemandno[] = {"入园系统", "学前系统", "小学系统", "未分配"}; + protected static Toast toast = null; + private static String oldMsg; + private static long oneTime = 0; + private static long twoTime = 0; + + + // 积分记录 达人标准次数记录 + + + + // MD5 设备地址标识 +// public static String getMAC(Context context) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 如果当前设备系统大于等于6.0 使用下面的方法 +// return getMac(); +// } else { +// try { +// WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); +// // 获取MAC地址 +// WifiInfo wifiInfo = wifiManager.getConnectionInfo(); +// String mac = wifiInfo.getMacAddress(); +// if (null == mac) { +// // 未获取到 +// mac = ""; +// } +// return mac; +// } catch (Exception e) { +// e.printStackTrace(); +// return ""; +// } +// } +// } + + /** + * 获取手机的MAC地址 + * + * @return + */ + public static String getMac() { + String str = ""; + String macSerial = ""; + try { + Process pp = Runtime.getRuntime().exec( + "cat /sys/class/net/wlan0/address"); + InputStreamReader ir = new InputStreamReader(pp.getInputStream()); + LineNumberReader input = new LineNumberReader(ir); + for (; null != str; ) { + str = input.readLine(); + if (str != null) { + macSerial = str.trim();// 去空格 + break; + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + if (macSerial == null || "".equals(macSerial)) { + try { + return loadFileAsString("/sys/class/net/eth0/address") + .toUpperCase().substring(0, 17); + } catch (Exception e) { + e.printStackTrace(); + macSerial = getAndroid7MAC(); + } + } + return macSerial; + } + + /** + * 兼容7.0获取不到的问题 + * + * @return + */ + public static String getAndroid7MAC() { + try { + List all = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface nif : all) { + if (!nif.getName().equalsIgnoreCase("wlan0")) + continue; + byte[] macBytes = nif.getHardwareAddress(); + if (macBytes == null) { + return ""; + } + StringBuilder res1 = new StringBuilder(); + for (byte b : macBytes) { + res1.append(String.format("%02X:", b)); + } + if (res1.length() > 0) { + res1.deleteCharAt(res1.length() - 1); + } + return res1.toString(); + } + } catch (Exception ex) { + } + return ""; + } + + public static String loadFileAsString(String fileName) throws Exception { + FileReader reader = new FileReader(fileName); + String text = loadReaderAsString(reader); + reader.close(); + return text; + } + + public static String loadReaderAsString(Reader reader) throws Exception { + StringBuilder builder = new StringBuilder(); + char[] buffer = new char[4096]; + int readLength = reader.read(buffer); + while (readLength >= 0) { + builder.append(buffer, 0, readLength); + readLength = reader.read(buffer); + } + return builder.toString(); + } + + + // MD5 设备地址标识 +// public static String getMD5(Context context) { +// String WLANMAC = getMAC(context); +// // compute md5 +// MessageDigest m = null; +// try { +// m = MessageDigest.getInstance("MD5"); +// } catch (NoSuchAlgorithmException e) { +// e.printStackTrace(); +// } +// if (WLANMAC != null && !WLANMAC.equals("")) { +// m.update(WLANMAC.getBytes(), 0, WLANMAC.length()); +// } else if (getSimSerialNumber(context) != null && !getSimSerialNumber(context).equals("")) { +// m.update(getSimSerialNumber(context).getBytes(), 0, getSimSerialNumber(context).length()); +// } else { +// m.update(getPesudoUniqueID().getBytes(), 0, getPesudoUniqueID().length()); +// } +// // get md5 bytes +// byte p_md5Data[] = m.digest(); +// // create a hex string +// String m_szUniqueID = new String(); +// for (int i = 0; i < p_md5Data.length; i++) { +// int b = (0xFF & p_md5Data[i]); +// // if it is a single digit, make sure it have 0 in front (proper padding) +// if (b <= 0xF) +// m_szUniqueID += "0"; +// // add number to string +// m_szUniqueID += Integer.toHexString(b); +// } // hex string to uppercase +// m_szUniqueID = m_szUniqueID.toUpperCase(); +// return m_szUniqueID; +// } + + private static String getSimSerialNumber(Context context) { + + TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + + @SuppressLint("MissingPermission") String simSerialNumber = tm.getSimSerialNumber(); + return simSerialNumber; + } + + + private static String getPesudoUniqueID() { + String m_szDevIDShort = "35" + //we make this look like a valid IMEI + Build.BOARD.length() % 10 + + Build.BRAND.length() % 10 + + Build.CPU_ABI.length() % 10 + + Build.DEVICE.length() % 10 + + Build.DISPLAY.length() % 10 + + Build.HOST.length() % 10 + + Build.ID.length() % 10 + + Build.MANUFACTURER.length() % 10 + + Build.MODEL.length() % 10 + + Build.PRODUCT.length() % 10 + + Build.TAGS.length() % 10 + + Build.TYPE.length() % 10 + + Build.USER.length() % 10; + return m_szDevIDShort; + } + + + // 防止连续点击 + private static long lastClickTime; + + public static boolean isFastDoubleClick() { + long time = System.currentTimeMillis(); + long timeD = time - lastClickTime; + if (0 < timeD && timeD < 500) { + return true; + } + lastClickTime = time; + return false; + } + + // 5分钟 = 1 转换成时间 + public static String getRangeTime(int range) { + StringBuffer sBuffer = new StringBuffer(); + String hour; + String minute; + if ((range / 12) >= 10) { + hour = range / 12 + ""; + } else { + hour = "0" + range / 12 + ""; + } + if ((range % 12) > 0) { + minute = ":" + range % 12 / 2 + "0"; + } else { + minute = ":00"; + } + sBuffer.append(hour.trim()); + sBuffer.append(minute.trim()); + return sBuffer.toString(); + } + + + // 根据日期取得星期几 + public static String getWeek(Date date) { + String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (week_index < 0) { + week_index = 0; + } + return weeks[week_index]; + } + + + // 非空判断 + public static boolean isEmpty(String s) { + if (null == s) + return true; + if (s.length() == 0) + return true; + if (s.trim().length() == 0) + return true; + return false; + } + + // 手动隐藏键盘 + public static void CloseKeyBoard(Context context) { + InputMethodManager imm = (InputMethodManager) context + .getSystemService(Context.INPUT_METHOD_SERVICE); + System.out.println("isActive:" + imm.isActive()); + if (imm.isActive()) { + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, + InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + // 接受软键盘输入 + public static void hideKeyboard(Context context, View view) { + if (context == null || view == null) { + return; + } + InputMethodManager imm = (InputMethodManager) context + .getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + // 卸载app +// public static void unInstallAPP(Context context, String packageName) { +// if (!TextUtils.isEmpty(packageName) && !AppsManagerUtils.isSystemApp(context, packageName)) { +// if (AppsManagerUtils.isSystemApp(context, packageName)) { +// Toast.makeText(MyApplication.getAppContext(), R.string.system_unistall_error, Toast.LENGTH_SHORT).show(); +// } else { +// Uri packageURI = Uri.parse("package:" + packageName); +// Intent intent = new Intent(Intent.ACTION_DELETE, packageURI); +// context.startActivity(intent); +// } +// } else { +// Toast.makeText(MyApplication.getAppContext(), R.string.unistall_error, Toast.LENGTH_SHORT).show(); +// } +// } + + // 打开app + public static void startApp(Context context, String packageName, + String activityName) { + + if (TextUtils.isEmpty(packageName)) + return; + + try { + Intent intent = null; + if (TextUtils.isEmpty(activityName)) { + intent = context.getPackageManager().getLaunchIntentForPackage( + packageName); + } else { + intent = new Intent(); + intent.setComponent(new ComponentName(packageName, activityName)); + } + if (intent == null) { + intent = getLaunchIntentForNoCategory(context, packageName); + } + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static Intent getLaunchIntentForNoCategory(Context context, + String packageName) { + Intent intent = null; + + PackageManager packageManager = context.getPackageManager(); + PackageInfo packageinfo = null; + try { + packageinfo = packageManager.getPackageInfo(packageName, 0); + } catch (NameNotFoundException e) { + e.printStackTrace(); + } + if (packageinfo == null) { + return null; + } + Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); + resolveIntent.setPackage(packageinfo.packageName); + List resolveinfoList = packageManager + .queryIntentActivities(resolveIntent, 0); + + ResolveInfo resolveinfo = resolveinfoList.iterator().next(); + if (resolveinfo != null) { + String className = resolveinfo.activityInfo.name; + intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + ComponentName cn = new ComponentName(packageName, className); + intent.setComponent(cn); + } + return intent; + } + + // 设置系统亮度模式 + public static void systemBrightness(Context context) { + try { + SharedPreferences mPrefs = context.getSharedPreferences("colorflykids", 0); + boolean initSetting = mPrefs.getBoolean("init_setting", true); + if (initSetting) { + mPrefs.edit().putBoolean("init_setting", false).commit(); + } + Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 0); + mPrefs.edit().putBoolean("first_init", false).commit(); + + } catch (Exception err) { + err.printStackTrace(); + } + } + + // 更新 版本比较 + public static boolean isUpdate(String oldVersion, String newVersion) { + if (TextUtils.isEmpty(oldVersion) || TextUtils.isEmpty(newVersion) || oldVersion.equals(newVersion)) { + return false; + } + String[] oldVersionSp = oldVersion.replaceAll("[^.\\d]", "").trim().split("\\."); + String[] newVsersionSp = newVersion.replaceAll("[^.\\d]", "").trim().split("\\."); + int index = 0; + int minLen = Math.min(oldVersionSp.length, newVsersionSp.length); + int diff = 0; + while (index < minLen && (diff = Integer.parseInt(newVsersionSp[index]) - Integer.parseInt(oldVersionSp[index])) == 0) { + index++; + } + if (diff == 0) { + for (int i = index; i < oldVersionSp.length; i++) { + if (Integer.parseInt(oldVersionSp[i]) > 0) { + return false; + } + } + for (int i = index; i < newVsersionSp.length; i++) { + if (Integer.parseInt(newVsersionSp[i]) > 0) { + return true; + } + } + } else { + return diff > 0 ? true : false; + } + return false; + } + + /*** + * 半角转换为全角 + * + * @param input + * @return + */ + public static String ToDBC(String input) { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (c[i] == 12288) { + c[i] = (char) 32; + continue; + } + if (c[i] > 65280 && c[i] < 65375) + c[i] = (char) (c[i] - 65248); + } + return new String(c); + } + + public static void showToast(Context context, String s) { + if (toast == null) { + toast = Toast.makeText(context, s, Toast.LENGTH_SHORT); + toast.show(); + oneTime = System.currentTimeMillis(); + } else { + twoTime = System.currentTimeMillis(); + if (s.equals(oldMsg)) { + if (twoTime - oneTime > Toast.LENGTH_SHORT) { + toast.show(); + } + } else { + oldMsg = s; + toast.setText(s); + toast.show(); + } + } + oneTime = twoTime; + } + + public static boolean isShouldHideInput(View v, MotionEvent event) { + if (v != null && (v instanceof EditText)) { + int[] leftTop = {0, 0}; + //获取输入框当前的location位置 + v.getLocationInWindow(leftTop); + int left = leftTop[0]; + int top = leftTop[1]; + int bottom = top + v.getHeight(); + int right = left + v.getWidth(); + if (event.getX() > left && event.getX() < right + && event.getY() > top && event.getY() < bottom) { + // 点击的是输入框区域,保留点击EditText的事件 + return false; + } else { + return true; + } + } + return false; + } + + public static boolean isIntent(Context context) { + + ConnectivityManager manager = (ConnectivityManager) context + .getApplicationContext().getSystemService( + Context.CONNECTIVITY_SERVICE); + if (manager == null) { + return false; + } + // 检查网络连接,如果无网络可用,就不需要进行连网操作等 + NetworkInfo networkinfo = manager.getActiveNetworkInfo(); + + if (networkinfo == null || !networkinfo.isAvailable()) { + return false; + } + return true; + } + + public static String getTime(int time) { + int min = time / 60; + int sec = time % 60; + if (sec > 0) { + return String.valueOf(min + 1); + } else { + return String.valueOf(min); + } + } + + public static String getTimeClick(int time) { + StringBuffer timeClick = new StringBuffer(); + int min = time / 60; + int sec = time % 60; + timeClick.append(min >= 10 ? (int) Math.ceil(min / 10) : 0) + .append(min % 10) + .append(":") + .append(sec >= 10 ? (int) Math.ceil(sec / 10) : 0) + .append(sec % 10); + return timeClick.toString(); + } + + + public static String getVersionName(Context context) { + // 获取packagemanager的实例 + PackageManager packageManager = context.getPackageManager(); + // getPackageName()是你当前类的包名,0代表是获取版本信息 + PackageInfo packInfo; + try { + packInfo = packageManager.getPackageInfo(context.getPackageName(), 0); + String version = packInfo.versionName.replaceAll("[a-zA-Z]", "").trim(); + ; + return version; + } catch (NameNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return ""; + } + + + /** + * 根据手机的分辨率从 dp 的单位 转成为 px(像素) + */ + public static int dip2px(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + /** + * 根据手机的分辨率从 px(像素) 的单位 转成为 dp + */ + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + + + public static float dp2px(Resources resources, float dp) { + final float scale = resources.getDisplayMetrics().density; + return dp * scale + 0.5f; + } + + public static float sp2px(Resources resources, float sp) { + final float scale = resources.getDisplayMetrics().scaledDensity; + return sp * scale; + } + + public static String getTime() { + long time = System.currentTimeMillis();//long now = android.os.SystemClock.uptimeMillis(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Date d1 = new Date(time); + String t1 = format.format(d1); + return t1; + } + + + private static void getAdmin(Context context, ComponentName componentName) { + Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); + intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); + intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "宏云萌书院OS"); + context.startActivity(intent); + } + + /** + * 获取设备序列号 + * + * @return + */ + public static String getSerial() { + return Build.SERIAL; +// return "QNS3AI000111"; +// return "QNW8WJ900002"; + + } + + public static final long A_GB = 1073741824; + public static final long A_MB = 1048576; + public static final int A_KB = 1024; + + public static String fmtSpace(long space) { + if (space <= 0) { + return "0"; + } + double gbValue = (double) space / A_GB; + if (gbValue >= 1) { + return String.format("%.2fGB", gbValue); + } else { + double mbValue = (double) space / A_MB; + // Log.e("GB", "gbvalue=" + mbValue); + if (mbValue >= 1) { + return String.format("%.2fMB", mbValue); + } else { + final double kbValue = space / A_KB; + return String.format("%.2fKB", kbValue); + } + } + } + + + public static String transferLongToDate(Long millSec){ + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Date date= new Date(millSec); + + return sdf.format(date); + + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/abs__ic_menu_moreoverflow_normal_holo_light.png b/app/src/main/res/drawable/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3f275ad1a19741003f55a42658c92c99b4b4073b GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!I0Jk_T>t<7Zwv-g&BRs!1({2N z{DK+M7*1Z~_z&cod%8G=L>zv5c_A-@0f(#Ot-tNZ61BaW9^^HsbJ#OgSh_kS7!{np pXIgjvfHLQd&6eC8Ti6mNvnZ4>)@E8PP6ism;OXk;vd$@?2>{weEj<7L literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/btn_selector.xml b/app/src/main/res/drawable/btn_selector.xml new file mode 100644 index 0000000..a41dedb --- /dev/null +++ b/app/src/main/res/drawable/btn_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/favorite_bg.png b/app/src/main/res/drawable/favorite_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f3d54dd9f49845a05daebe354b7e2274cf4a36 GIT binary patch literal 43985 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 Z`Hva5P>$GE>;i6&hl*+n6>_FQ{|6p!8*Bgo literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/favorite_btn_normal.png b/app/src/main/res/drawable/favorite_btn_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb6be0b313fc3323d5070ddad0adfdf26472635 GIT binary patch literal 865 zcmeAS@N?(olHy`uVBq!ia0vp^=|DV#gBeJki)LpBQda|fLR|m<|L^MVGt7|V%l%J) z9&|4W@(X5Qu-~;^?%RLq_S-jfE6yLwJS_AlYRghiKksSGZ(ljtXkFrwFuV6z<%#71 z{_4OL3F}1F&xEjbc|8Bn7`riCan9a{KaCAaXD(*WpU%L*_{G!3F(l*O+Zma`hYUnq zU8gZLC3NcsIIyG&nhP9#)b#uRf6r54m%JvJ=*!R9`8+$l=-FBCytvJqLE#Pqj1%v_ zaZBDUC|EMDqG_W`(0=u!bsjIjFIhg%_U$~L*%L3mJ$cSH^6tF9JJpxp6i(-URAu{f zsrvfs#T&jH*;2(*{L+wj?mVW?8ZW-cth1Ts);~9*QfQl<|HQ&6Un+I(1z&qssI_PL zs~4ZH%;;AZ^0z&nV!7^Q^&FGQ%P&p%W)dmk_vE!D@4`&UPk%GRmzd7YoAGy=&EzW) zdnf$5ee1>p$;UEnD+3)Xqx?gjbWW<`Nn~Pu=IVOBx#Do(JM%g_ zo=+Yx9zH*;@UJrP?B^|-{CY2Jt{szZJd?b8pJKwBU+psOr-C0%_r0!s{@=xQE>C9` zbRVm_%;De3mMh9{AJ#Aax_4E~G%J&Ni$k-!?lqm9zO{K<*YY=8(+>Q%>DjB}b+IB& z{IsmupP7-bb?o*`s@Tz>% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/favorite_btn_pressed.png b/app/src/main/res/drawable/favorite_btn_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..dcefcd28e4f297a5b7ca307fc03486086d383d72 GIT binary patch literal 1006 zcmeAS@N?(olHy`uVBq!ia0vp^=|DV#gBeJki)LqMU|`e<@CkAK4+J?3qllOgFs|_W z1Ps2Ek|4ie1_t|G+vR@zm!3N1-CNxW&mLCaxhnK8?c7n$KOun!w=)0y=3=LH?2^+b zp2sThEe|Z^|NHvEiZ=;g*NLj1W$W^I`7z4)TE_X<@FRzQHTv$nt9ZQq%X+_ki$8Cv zDk$@=D7s}(I&)5lpM($t0~4>Oi(^Q}y|*_q!*4lAv?VS)uwd$1*INowtg9AXO42<# zH7NJ)hOFrCOT&Ku|KEIcMoJTp(aiEcU+%a5}Miu5~Io<5nm zoT)Ro=6K5N8B@y7s7%gZrSjHg=KQAfPo6yezdcj_Ohwc`s~Iz=rU|9mUoZW#SLO4< zN1y+Bp7qp_FaG!b@~4{j?32T0vQPEjt9f9n<+lY09(J>mDkpqF5h!OZ|djf_|o+fH|!G@ z^=|7*cH80VJoOsK|C84HeWaEjSbMW3Vtw4(Jr~0Y>vk`Hb|KQB>WS5HlXIQLS<`+@ zpR#PTbk+om)asp=CzYG|tG$U&5;+%ndu3sW#AbFHOWde(c@;v&mG$aAHy-FoS( z&-3^4*Ze-|pDZnyoO@@Qi~KjO|57)#7gZ)mHR?% + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_bar.png b/app/src/main/res/drawable/ic_action_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..5404533f1ff8d5ba09db0dacdad93d5f26369468 GIT binary patch literal 26994 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_app.png b/app/src/main/res/drawable/ic_app.png new file mode 100644 index 0000000000000000000000000000000000000000..bde1dfd8a3d306ce55cdb0101fba49cd53263d35 GIT binary patch literal 6606 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 BnH&HB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_back.png b/app/src/main/res/drawable/ic_back.png new file mode 100644 index 0000000000000000000000000000000000000000..fee4e163b694c2dea3b6a62c1c6f5852b4bbc3ef GIT binary patch literal 1506 zcmeAS@N?(olHy`uVBq!ia0vp^5|6H_V+Po~;1Ffc1-hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_~qnRePcG*F~{{q@O8N_<|0Q$hs94@au5bWw5*TDGWTvD6m_p@rS9{|~up&u+2R z$xyp=I=oA{^PZ{j?5Phts(AF0n#8u}9~Kg`-dlCi zo1u+~2)ALGgMLhtWd>K$zhizCOvj)66fpV06~MT7ga1vt!4UBvqhTpYr zGtFtc*=xrU+#LMjT+u(yRc6IaMm+z|df=z& zGVw4&d#9}>$1f-g9RKO_{lT2C_ezd$-XOGf`japfp`~Z^7hbHI-sBfioEg@*PGbe`}^l>WR3i^6-4jPeEo3a*K-F|6!3*(;2V%^=r>O zyEAvf-iLa@O@AglvfmV9t}uP|j?Z=qC$uhC?%=A|ZJlWr^dfulT@lrnkG3D+ney}2 zN#RRD`!sJm{$QB8FY4$Vk^fUSy%lRU{qf4x{-FhrR`kS}bgNoZ>)=1#6GD#0hu_ex zbu4(hZ2QwoQ^U3`F*)xP|F+7j@5=g9Wo{y2Z(iH{P&zt)qsX;apAY<0-Fs@u+wC#h d>i;p=fS?83{1OOaPJ7fR= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_kind_detail.png b/app/src/main/res/drawable/ic_kind_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1afef29d5a168c6732ed3e9beb2f80f6d8f397 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^DnKm3!3-pqrme35QuYBpA+G=b{|7S321i-%$pJNs zmIV0)GjQ4X*zq!0`nr4aS#Y}WxN^H$+nRLBCj%AKdAc};Xq<1oe4DR9frBk!t%+6A zwcqyHo4ZAhH@?nq{@7gX^D}Xd)0(4_=FA6#c(ynN&h9H)(B*pEQ?z^0@-FweLIR;e zN?tB&Cj~AR37OhvP^+=9sc!L>-F3<97D!~zoNt(PGJ}0ivrs|$lh3(5Mf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_logo.png b/app/src/main/res/drawable/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fe6e2371540b82335013806c4ceba2bde58a29 GIT binary patch literal 1252 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_menu_share_normal.png b/app/src/main/res/drawable/ic_menu_share_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4089be89f61ff66d7e0e09408bd3095d3f4dbb6d GIT binary patch literal 1001 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 E2O!A{u>b%7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_overflow.png b/app/src/main/res/drawable/ic_overflow.png new file mode 100644 index 0000000000000000000000000000000000000000..778475a833b37d7dd932376f9353bc0403411416 GIT binary patch literal 331 zcmV-R0kr;!P);o>@G0r3m4G>L zD9DzQwoL?>BqC;jYr$|4zSolb`_vO;i2gd$1#}0x11Se0!U41b+zY;dqoj4__sj}# z$9pXZpEJ!UE8tQXog__aUAU%zreSpRCvXvZ_!x@NVYIKczlTwGpgVBi4n%|}<6$#u z9!8hO@}`^733x0z--jf3#wujP=nRZ*DZn}4f#f%Kl7>a)-!7ya_}Pq{h^_?(leeOU dBu__G_y)7|T_M*4bd3N2002ovPDHLkV1n!4hXMcq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_overflow1.png b/app/src/main/res/drawable/ic_overflow1.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7953c9cf24c7d7aa3746a89ad47f4255047f23 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLoEEyPEO=K6u{H+zPO-W!FaqIWWdCi+yI_aI@J*M+ZL!=m* zmlPlAKd_K%!^D!#MT|4N86-Eq|6kHl$}l5R|71h-u@y_3#Qo)s?7X~t-u-8;*v>Gs z@#wpGn~Oy2cD7FAsymgh-}5xsZ1dhF!5eNcUSHLdmwtcW>=ozV{9#hiGZt*P^WOyM OPzFy|KbLh*2~7Y-!&d_U literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_place_holder.png b/app/src/main/res/drawable/ic_place_holder.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a1109daf1fd1f5691c84db3dd5396309a3b222 GIT binary patch literal 5915 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ll_customer_normal.xml b/app/src/main/res/drawable/ll_customer_normal.xml new file mode 100644 index 0000000..9dfa373 --- /dev/null +++ b/app/src/main/res/drawable/ll_customer_normal.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ll_customer_selected.xml b/app/src/main/res/drawable/ll_customer_selected.xml new file mode 100644 index 0000000..964d599 --- /dev/null +++ b/app/src/main/res/drawable/ll_customer_selected.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ll_selector.xml b/app/src/main/res/drawable/ll_selector.xml new file mode 100644 index 0000000..a7f2ad1 --- /dev/null +++ b/app/src/main/res/drawable/ll_selector.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/search_bottom.png b/app/src/main/res/drawable/search_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8a62bb78c03246e66045673288b63b0f84c5c7 GIT binary patch literal 2381 zcmaJ?dstFw8vmM_oG#i-W#$E?LpGKQ9Fh!zthlL(8Il>LMQ{*QF2OO-T_N7 zrp-%Djb)|H*k!w@IZl@)?TOm4bt;Q$7b~ZxEX%ZVwEeJb_K$7PADs95-uL%=fA0k- zN{APDj`bT00Pu{7=86Cq83^sgUyO#IgSMre@a2p1lJP{X0yj$a7+5IRuEmHkYH1oK z!ld%-b(b&}L`_qPlksF>98;!Mlcnw$vPrFjXaHDICY@B4f#JlpSei=1MxLGd86m3V zY-BlINEPZhm{Jv;qsJ0+;>EI@3>ia?M9n9%OiW0i#&9Xoq|VeBm?kzd#LI-X`cSDX!Ivwc5<#E+#0oxYnT5>WCZ; zF=V+)Bi9-YGl#;3LS~G{fJ-$pEQZTQAOTsWk~8VFMG=fhE=px^=b$KW;aqAY%8TUF zc#%9lpGuD$#&Wf?EH$RVhq3ZMv9wQO-J77+!OUDtuUe1E`FgFII8-rH^+_!p{wMi9 zVCA3ILj5F`0>x0=bN#P54`0FMaho5v79KwCJ*I)nu7_LQeXPn3z~|>0h@gM`8K< zw};JIx9m&r_H7|sB$jXemRIk%qKpd}XnI&tcmI!iV;8&QH`atkgx0sKx;l zG-nfggZZoVG50UFG`2Wf94#kp)wW9v02as^^d)>IX*1G~Y#;`Mw0Hi}*iB)qGs?DH7>wSlyn*R&-!fRWsLt~j*Y-0W@ZCtXI=SLXpxEIET{ z1$VawP-GrECY~zO?9QRTSS&BNHUfZssVh^@9HjqovGG9ANjoX!eEZ}#(_Tc&x4-lN zpmWEG!qvNP^r+PNuavU_RsL3i7dMH2ao%bGbgBM(ZuEM*l)S4nq_D09muivUNjv97 zLC?baup_U2Ci^uG)Yx3Df$b@#!jS-wadr07{J!WZ)}AsSQqYuIJpgBuZPy2HBNXoo zb+2mfx@@U~JM-+mcHn|&c^ zy??Hx?X}-liCNH)|NGXKr;2d^i0kRcPagVrnHApVY|E`K`wW1Ax=>?bp}F~Zi%c;F zfbmFH;e!j|fj4+_%BKO4P|!xGJ#yN#KmXpuvdlc#e@_Xb^=d;$&kCHt)6ifO_j*-x zSgSI+>u4_;%V6U!JYUr{nKQ+jMoM(RoKp*D)+dgauxg8bpoYTe5uy6iQ;(WhD|(u$ z0svT3N4|8Y@}A2^F8U#Y1pQ-@yq8&ZVjpWi@{I$wTDhsnRyE*leV~9bF*~F>Pegx z*nb5QgtQKdS-s_uB%$(7wF&3uIN(G=7A{%c{W|pcWtLk=?oOuQUd3f&Ih2~PiSWqU ziWHJ19zFo#Mxr!S(oM)Iojo+{2~- zOC~MI-Qqc&CF_#9qfzT1M6{Zd=9L z9z@D;OaS1}xpL<;bB;x@{cgl-voB;VxcOx}?WT`7{btJ~Tc2Yh0KYZ&+p;)+SsHHd zz*{#Qx!$RO|MB7&f;78pyr++K`cK(M*)OWvA-3NCL}x8^e=Na&{#Pp|zxjLd2(Tuu zKg?J#>15tsQKwh@!=#tTSBwN_OTTS6>vDRgC;471xi+vegVe{(i!{QSO&Z+dtT=P_ zQBKq<)tctp$hfiEx$wI+E=BV4AJ$x|(^Krn+Q_k0kPaiwyP^KNz5D5dj~gFGwY3z^ z63#8{iS4;!^G7PoetXj4VE8|N*LdpL%8orMykN(SKxeD7P{F(IlQlmRs@-My`lTc< zDfM=c`g&n#a6o2SYyZRZk8A=G;VK+QaXKOU>3sH)2lFa^Dp=Rw`^2~CUCWcoz8lZ) z`l>9e9y>n+XBppUs$wS;KP%3(283R^zwT7P1aq0mqxx7Y#aeD?z1-s9R| + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..a28a4cb --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_collect.xml b/app/src/main/res/layout/fragment_collect.xml new file mode 100644 index 0000000..34a0bf8 --- /dev/null +++ b/app/src/main/res/layout/fragment_collect.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_download_record.xml b/app/src/main/res/layout/fragment_download_record.xml new file mode 100644 index 0000000..6687943 --- /dev/null +++ b/app/src/main/res/layout/fragment_download_record.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_downloadfinish.xml b/app/src/main/res/layout/fragment_downloadfinish.xml new file mode 100644 index 0000000..42599ec --- /dev/null +++ b/app/src/main/res/layout/fragment_downloadfinish.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_downloading.xml b/app/src/main/res/layout/fragment_downloading.xml new file mode 100644 index 0000000..253a3f1 --- /dev/null +++ b/app/src/main/res/layout/fragment_downloading.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_featured.xml b/app/src/main/res/layout/fragment_featured.xml new file mode 100644 index 0000000..26f41e6 --- /dev/null +++ b/app/src/main/res/layout/fragment_featured.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_kind.xml b/app/src/main/res/layout/fragment_kind.xml new file mode 100644 index 0000000..34b9d80 --- /dev/null +++ b/app/src/main/res/layout/fragment_kind.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_kind_detail.xml b/app/src/main/res/layout/fragment_kind_detail.xml new file mode 100644 index 0000000..49852c3 --- /dev/null +++ b/app/src/main/res/layout/fragment_kind_detail.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_localapp.xml b/app/src/main/res/layout/fragment_localapp.xml new file mode 100644 index 0000000..2ba1d8f --- /dev/null +++ b/app/src/main/res/layout/fragment_localapp.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_manage.xml b/app/src/main/res/layout/fragment_manage.xml new file mode 100644 index 0000000..6c58107 --- /dev/null +++ b/app/src/main/res/layout/fragment_manage.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + +